@strapi/core 5.4.1 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Strapi.js +1 -2
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs.map +1 -1
- package/dist/compile.js.map +1 -1
- package/dist/compile.mjs.map +1 -1
- package/dist/configuration/config-loader.js +1 -2
- package/dist/configuration/config-loader.js.map +1 -1
- package/dist/configuration/config-loader.mjs +1 -2
- package/dist/configuration/config-loader.mjs.map +1 -1
- package/dist/configuration/get-dirs.js.map +1 -1
- package/dist/configuration/get-dirs.mjs.map +1 -1
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/index.mjs.map +1 -1
- package/dist/configuration/urls.js.map +1 -1
- package/dist/configuration/urls.mjs.map +1 -1
- package/dist/container.js.map +1 -1
- package/dist/container.mjs.map +1 -1
- package/dist/core-api/controller/collection-type.js.map +1 -1
- package/dist/core-api/controller/collection-type.mjs.map +1 -1
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/single-type.mjs.map +1 -1
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/controller/transform.mjs.map +1 -1
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/service/collection-type.js.map +1 -1
- package/dist/core-api/service/collection-type.mjs.map +1 -1
- package/dist/core-api/service/core-service.js.map +1 -1
- package/dist/core-api/service/core-service.mjs.map +1 -1
- package/dist/core-api/service/index.js.map +1 -1
- package/dist/core-api/service/index.mjs.map +1 -1
- package/dist/core-api/service/pagination.js.map +1 -1
- package/dist/core-api/service/pagination.mjs.map +1 -1
- package/dist/core-api/service/single-type.js +1 -2
- package/dist/core-api/service/single-type.js.map +1 -1
- package/dist/core-api/service/single-type.mjs +1 -2
- package/dist/core-api/service/single-type.mjs.map +1 -1
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/domain/content-type/validator.js.map +1 -1
- package/dist/domain/content-type/validator.mjs.map +1 -1
- package/dist/domain/module/index.js.map +1 -1
- package/dist/domain/module/index.mjs.map +1 -1
- package/dist/domain/module/validation.js.map +1 -1
- package/dist/domain/module/validation.mjs.map +1 -1
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs.map +1 -1
- package/dist/ee/license.js.map +1 -1
- package/dist/ee/license.mjs.map +1 -1
- package/dist/factories.js.map +1 -1
- package/dist/factories.mjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loaders/admin.js.map +1 -1
- package/dist/loaders/admin.mjs.map +1 -1
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/apis.mjs.map +1 -1
- package/dist/loaders/components.js.map +1 -1
- package/dist/loaders/components.mjs.map +1 -1
- package/dist/loaders/middlewares.js.map +1 -1
- package/dist/loaders/middlewares.mjs.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
- package/dist/loaders/plugins/index.js +1 -2
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/loaders/policies.js.map +1 -1
- package/dist/loaders/policies.mjs.map +1 -1
- package/dist/loaders/sanitizers.js.map +1 -1
- package/dist/loaders/sanitizers.mjs.map +1 -1
- package/dist/loaders/src-index.js.map +1 -1
- package/dist/loaders/src-index.mjs.map +1 -1
- package/dist/loaders/validators.js.map +1 -1
- package/dist/loaders/validators.mjs.map +1 -1
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/body.mjs.map +1 -1
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/cors.mjs.map +1 -1
- package/dist/middlewares/errors.js.map +1 -1
- package/dist/middlewares/errors.mjs.map +1 -1
- package/dist/middlewares/favicon.js.map +1 -1
- package/dist/middlewares/favicon.mjs.map +1 -1
- package/dist/middlewares/index.js.map +1 -1
- package/dist/middlewares/logger.js.map +1 -1
- package/dist/middlewares/logger.mjs.map +1 -1
- package/dist/middlewares/powered-by.js.map +1 -1
- package/dist/middlewares/powered-by.mjs.map +1 -1
- package/dist/middlewares/public.js.map +1 -1
- package/dist/middlewares/public.mjs.map +1 -1
- package/dist/middlewares/query.js.map +1 -1
- package/dist/middlewares/query.mjs.map +1 -1
- package/dist/middlewares/response-time.js.map +1 -1
- package/dist/middlewares/response-time.mjs.map +1 -1
- package/dist/middlewares/responses.js.map +1 -1
- package/dist/middlewares/responses.mjs.map +1 -1
- package/dist/middlewares/security.js.map +1 -1
- package/dist/middlewares/security.mjs.map +1 -1
- package/dist/middlewares/session.js.map +1 -1
- package/dist/middlewares/session.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/migrations/draft-publish.js.map +1 -1
- package/dist/migrations/draft-publish.mjs.map +1 -1
- package/dist/migrations/i18n.js.map +1 -1
- package/dist/migrations/i18n.mjs.map +1 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/providers/admin.js.map +1 -1
- package/dist/providers/admin.mjs.map +1 -1
- package/dist/providers/coreStore.js.map +1 -1
- package/dist/providers/coreStore.mjs.map +1 -1
- package/dist/providers/cron.js.map +1 -1
- package/dist/providers/cron.mjs.map +1 -1
- package/dist/providers/registries.js.map +1 -1
- package/dist/providers/registries.mjs.map +1 -1
- package/dist/providers/telemetry.js.map +1 -1
- package/dist/providers/telemetry.mjs.map +1 -1
- package/dist/providers/webhooks.js.map +1 -1
- package/dist/providers/webhooks.mjs.map +1 -1
- package/dist/registries/apis.js.map +1 -1
- package/dist/registries/apis.mjs.map +1 -1
- package/dist/registries/components.js.map +1 -1
- package/dist/registries/components.mjs.map +1 -1
- package/dist/registries/content-types.js.map +1 -1
- package/dist/registries/content-types.mjs.map +1 -1
- package/dist/registries/controllers.js.map +1 -1
- package/dist/registries/controllers.mjs.map +1 -1
- package/dist/registries/custom-fields.js.map +1 -1
- package/dist/registries/custom-fields.mjs.map +1 -1
- package/dist/registries/hooks.js.map +1 -1
- package/dist/registries/hooks.mjs.map +1 -1
- package/dist/registries/middlewares.js.map +1 -1
- package/dist/registries/middlewares.mjs.map +1 -1
- package/dist/registries/models.js.map +1 -1
- package/dist/registries/models.mjs.map +1 -1
- package/dist/registries/modules.js.map +1 -1
- package/dist/registries/modules.mjs.map +1 -1
- package/dist/registries/namespace.js.map +1 -1
- package/dist/registries/namespace.mjs.map +1 -1
- package/dist/registries/plugins.js.map +1 -1
- package/dist/registries/plugins.mjs.map +1 -1
- package/dist/registries/policies.js.map +1 -1
- package/dist/registries/policies.mjs.map +1 -1
- package/dist/registries/sanitizers.js.map +1 -1
- package/dist/registries/sanitizers.mjs.map +1 -1
- package/dist/registries/services.js.map +1 -1
- package/dist/registries/services.mjs.map +1 -1
- package/dist/registries/validators.js.map +1 -1
- package/dist/registries/validators.mjs.map +1 -1
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/auth/index.mjs.map +1 -1
- package/dist/services/config.js.map +1 -1
- package/dist/services/config.mjs.map +1 -1
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/index.js.map +1 -1
- package/dist/services/content-api/permissions/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/providers/action.js.map +1 -1
- package/dist/services/content-api/permissions/providers/action.mjs.map +1 -1
- package/dist/services/content-api/permissions/providers/condition.js.map +1 -1
- package/dist/services/content-api/permissions/providers/condition.mjs.map +1 -1
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/cron.js +1 -2
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +1 -2
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/custom-fields.js.map +1 -1
- package/dist/services/custom-fields.mjs.map +1 -1
- package/dist/services/document-service/attributes/index.js.map +1 -1
- package/dist/services/document-service/attributes/index.mjs.map +1 -1
- package/dist/services/document-service/attributes/transforms.js.map +1 -1
- package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/events.js.map +1 -1
- package/dist/services/document-service/events.mjs.map +1 -1
- package/dist/services/document-service/index.js.map +1 -1
- package/dist/services/document-service/index.mjs.map +1 -1
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/middlewares/errors.js.map +1 -1
- package/dist/services/document-service/middlewares/errors.mjs.map +1 -1
- package/dist/services/document-service/middlewares/middleware-manager.js.map +1 -1
- package/dist/services/document-service/middlewares/middleware-manager.mjs.map +1 -1
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/data.js.map +1 -1
- package/dist/services/document-service/transform/data.mjs.map +1 -1
- package/dist/services/document-service/transform/fields.js.map +1 -1
- package/dist/services/document-service/transform/fields.mjs.map +1 -1
- package/dist/services/document-service/transform/id-map.js +2 -4
- package/dist/services/document-service/transform/id-map.js.map +1 -1
- package/dist/services/document-service/transform/id-map.mjs +2 -4
- package/dist/services/document-service/transform/id-map.mjs.map +1 -1
- package/dist/services/document-service/transform/id-transform.js.map +1 -1
- package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
- package/dist/services/document-service/transform/populate.js.map +1 -1
- package/dist/services/document-service/transform/populate.mjs.map +1 -1
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.js +1 -2
- package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs +1 -2
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.js +3 -6
- package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs +3 -6
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
- package/dist/services/document-service/utils/populate.js.map +1 -1
- package/dist/services/document-service/utils/populate.mjs.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +1 -2
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.mjs +1 -2
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-service/index.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/dist/services/errors.js.map +1 -1
- package/dist/services/errors.mjs.map +1 -1
- package/dist/services/event-hub.js.map +1 -1
- package/dist/services/event-hub.mjs.map +1 -1
- package/dist/services/features.js.map +1 -1
- package/dist/services/features.mjs.map +1 -1
- package/dist/services/fs.js.map +1 -1
- package/dist/services/fs.mjs.map +1 -1
- package/dist/services/metrics/admin-user-hash.js.map +1 -1
- package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
- package/dist/services/metrics/index.js +1 -2
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +1 -2
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/is-truthy.js.map +1 -1
- package/dist/services/metrics/middleware.js.map +1 -1
- package/dist/services/metrics/middleware.mjs.map +1 -1
- package/dist/services/metrics/rate-limiter.js.map +1 -1
- package/dist/services/metrics/rate-limiter.mjs.map +1 -1
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/dist/services/query-params.js.map +1 -1
- package/dist/services/query-params.mjs.map +1 -1
- package/dist/services/reloader.js.map +1 -1
- package/dist/services/reloader.mjs.map +1 -1
- package/dist/services/request-context.js.map +1 -1
- package/dist/services/request-context.mjs.map +1 -1
- package/dist/services/server/admin-api.js.map +1 -1
- package/dist/services/server/admin-api.mjs.map +1 -1
- package/dist/services/server/api.js.map +1 -1
- package/dist/services/server/api.mjs.map +1 -1
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/compose-endpoint.mjs.map +1 -1
- package/dist/services/server/content-api.js.map +1 -1
- package/dist/services/server/content-api.mjs.map +1 -1
- package/dist/services/server/http-server.js.map +1 -1
- package/dist/services/server/http-server.mjs.map +1 -1
- package/dist/services/server/index.js.map +1 -1
- package/dist/services/server/index.mjs.map +1 -1
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/koa.mjs.map +1 -1
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/middleware.mjs.map +1 -1
- package/dist/services/server/policy.js.map +1 -1
- package/dist/services/server/policy.mjs.map +1 -1
- package/dist/services/server/register-middlewares.js.map +1 -1
- package/dist/services/server/register-middlewares.mjs.map +1 -1
- package/dist/services/server/register-routes.js.map +1 -1
- package/dist/services/server/register-routes.mjs.map +1 -1
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/server/routing.mjs.map +1 -1
- package/dist/services/utils/dynamic-zones.js.map +1 -1
- package/dist/services/utils/dynamic-zones.mjs.map +1 -1
- package/dist/services/webhook-runner.js.map +1 -1
- package/dist/services/webhook-runner.mjs.map +1 -1
- package/dist/services/webhook-store.js.map +1 -1
- package/dist/services/webhook-store.mjs.map +1 -1
- package/dist/services/worker-queue.js.map +1 -1
- package/dist/services/worker-queue.mjs.map +1 -1
- package/dist/utils/convert-custom-field-type.js.map +1 -1
- package/dist/utils/convert-custom-field-type.mjs.map +1 -1
- package/dist/utils/cron.js.map +1 -1
- package/dist/utils/cron.mjs.map +1 -1
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
- package/dist/utils/is-initialized.js.map +1 -1
- package/dist/utils/is-initialized.mjs.map +1 -1
- package/dist/utils/load-config-file.js.map +1 -1
- package/dist/utils/load-config-file.mjs.map +1 -1
- package/dist/utils/load-files.js +1 -2
- package/dist/utils/load-files.js.map +1 -1
- package/dist/utils/load-files.mjs +1 -2
- package/dist/utils/load-files.mjs.map +1 -1
- package/dist/utils/resolve-working-dirs.js.map +1 -1
- package/dist/utils/resolve-working-dirs.mjs.map +1 -1
- package/dist/utils/signals.js.map +1 -1
- package/dist/utils/signals.mjs.map +1 -1
- package/dist/utils/startup-logger.d.ts.map +1 -1
- package/dist/utils/startup-logger.js +6 -1
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/startup-logger.mjs +6 -1
- package/dist/utils/startup-logger.mjs.map +1 -1
- package/dist/utils/transform-content-types-to-models.js.map +1 -1
- package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
- package/dist/utils/update-notifier/index.js.map +1 -1
- package/dist/utils/update-notifier/index.mjs.map +1 -1
- package/package.json +14 -14
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/services/content-api/permissions/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { createActionProvider, createConditionProvider } from './providers';\nimport createPermissionEngine from './engine';\n\nconst typeSymbol = Symbol.for('__type__');\n\ninterface ValidatePermissionHandler {\n (params: { permission: { action: string } }): boolean;\n}\n\n/**\n * Creates a handler that checks if the permission's action exists in the action registry\n */\nconst createValidatePermissionHandler =\n (actionProvider: ReturnType<typeof createActionProvider>): ValidatePermissionHandler =>\n ({ permission }) => {\n const action = actionProvider.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission and warn the user\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission`\n );\n\n return false;\n }\n\n return true;\n };\n\n/**\n * Create instances of providers and permission engine for the core content-API service.\n * Also, expose utilities to get information about available actions and such.\n */\nexport default (strapi: Core.Strapi) => {\n // NOTE: Here we define both an action and condition provider,\n // but at the moment, we're only using the action one.\n const providers = {\n action: createActionProvider(),\n condition: createConditionProvider(),\n };\n\n /**\n * Get a tree representation of the available Content API actions\n * based on the methods of the Content API controllers.\n *\n * @note Only actions bound to a content-API route are returned.\n */\n const getActionsMap = () => {\n const actionMap: Record<\n string,\n {\n controllers: Record<string, string[]>;\n }\n > = {};\n\n /**\n * Check if a controller's action is bound to the\n * content-api by looking at a potential __type__ symbol\n */\n const isContentApi = (action: Core.ControllerHandler & { [s: symbol]: any }) => {\n if (!_.has(action, typeSymbol)) {\n return false;\n }\n\n return action[typeSymbol].includes('content-api');\n };\n\n /**\n * Register actions from a specific API source into the result tree\n */\n const registerAPIsActions = (\n apis: Record<string, Core.Plugin | Core.Module>,\n source: 'api' | 'plugin'\n ) => {\n _.forEach(apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = Object.keys(contentApiActions);\n\n return acc;\n },\n {} as Record<string, string[]>\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`${source}::${apiName}`] = { controllers };\n }\n });\n };\n\n registerAPIsActions(strapi.apis, 'api');\n registerAPIsActions(strapi.plugins, 'plugin');\n\n return actionMap;\n };\n\n /**\n * Register all the content-API controllers actions into the action provider.\n * This method make use of the {@link getActionsMap} to generate the list of actions to register.\n */\n const registerActions = async () => {\n const actionsMap = getActionsMap();\n\n // For each API\n for (const [api, value] of Object.entries(actionsMap)) {\n const { controllers } = value;\n\n // Register controllers methods as actions\n for (const [controller, actions] of Object.entries(controllers)) {\n // Register each action individually\n await Promise.all(\n actions.map((action) => {\n const actionUID = `${api}.${controller}.${action}`;\n\n return providers.action.register(actionUID, {\n api,\n controller,\n action,\n uid: actionUID,\n });\n })\n );\n }\n }\n };\n\n // Create an instance of a content-API permission engine\n // and binds a custom validation handler to it\n const engine = createPermissionEngine({ providers });\n\n engine.on(\n 'before-format::validate.permission',\n createValidatePermissionHandler(providers.action)\n );\n\n return {\n engine,\n providers,\n registerActions,\n getActionsMap,\n };\n};\n"],"names":["action","strapi","createActionProvider","createConditionProvider","_","engine","createPermissionEngine"],"mappings":";;;;;;;AAKA,MAAM,aAAa,OAAO,IAAI,UAAU;AASxC,MAAM,kCACJ,CAAC,mBACD,CAAC,EAAE,iBAAiB;AAClB,QAAMA,UAAS,eAAe,IAAI,WAAW,MAAM;AAGnD,MAAI,CAACA,SAAQ;AACX,WAAO,IAAI;AAAA,MACT,mBAAmB,WAAW,MAAM;AAAA,
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/services/content-api/permissions/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { createActionProvider, createConditionProvider } from './providers';\nimport createPermissionEngine from './engine';\n\nconst typeSymbol = Symbol.for('__type__');\n\ninterface ValidatePermissionHandler {\n (params: { permission: { action: string } }): boolean;\n}\n\n/**\n * Creates a handler that checks if the permission's action exists in the action registry\n */\nconst createValidatePermissionHandler =\n (actionProvider: ReturnType<typeof createActionProvider>): ValidatePermissionHandler =>\n ({ permission }) => {\n const action = actionProvider.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission and warn the user\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission`\n );\n\n return false;\n }\n\n return true;\n };\n\n/**\n * Create instances of providers and permission engine for the core content-API service.\n * Also, expose utilities to get information about available actions and such.\n */\nexport default (strapi: Core.Strapi) => {\n // NOTE: Here we define both an action and condition provider,\n // but at the moment, we're only using the action one.\n const providers = {\n action: createActionProvider(),\n condition: createConditionProvider(),\n };\n\n /**\n * Get a tree representation of the available Content API actions\n * based on the methods of the Content API controllers.\n *\n * @note Only actions bound to a content-API route are returned.\n */\n const getActionsMap = () => {\n const actionMap: Record<\n string,\n {\n controllers: Record<string, string[]>;\n }\n > = {};\n\n /**\n * Check if a controller's action is bound to the\n * content-api by looking at a potential __type__ symbol\n */\n const isContentApi = (action: Core.ControllerHandler & { [s: symbol]: any }) => {\n if (!_.has(action, typeSymbol)) {\n return false;\n }\n\n return action[typeSymbol].includes('content-api');\n };\n\n /**\n * Register actions from a specific API source into the result tree\n */\n const registerAPIsActions = (\n apis: Record<string, Core.Plugin | Core.Module>,\n source: 'api' | 'plugin'\n ) => {\n _.forEach(apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = Object.keys(contentApiActions);\n\n return acc;\n },\n {} as Record<string, string[]>\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`${source}::${apiName}`] = { controllers };\n }\n });\n };\n\n registerAPIsActions(strapi.apis, 'api');\n registerAPIsActions(strapi.plugins, 'plugin');\n\n return actionMap;\n };\n\n /**\n * Register all the content-API controllers actions into the action provider.\n * This method make use of the {@link getActionsMap} to generate the list of actions to register.\n */\n const registerActions = async () => {\n const actionsMap = getActionsMap();\n\n // For each API\n for (const [api, value] of Object.entries(actionsMap)) {\n const { controllers } = value;\n\n // Register controllers methods as actions\n for (const [controller, actions] of Object.entries(controllers)) {\n // Register each action individually\n await Promise.all(\n actions.map((action) => {\n const actionUID = `${api}.${controller}.${action}`;\n\n return providers.action.register(actionUID, {\n api,\n controller,\n action,\n uid: actionUID,\n });\n })\n );\n }\n }\n };\n\n // Create an instance of a content-API permission engine\n // and binds a custom validation handler to it\n const engine = createPermissionEngine({ providers });\n\n engine.on(\n 'before-format::validate.permission',\n createValidatePermissionHandler(providers.action)\n );\n\n return {\n engine,\n providers,\n registerActions,\n getActionsMap,\n };\n};\n"],"names":["action","strapi","createActionProvider","createConditionProvider","_","engine","createPermissionEngine"],"mappings":";;;;;;;AAKA,MAAM,aAAa,OAAO,IAAI,UAAU;AASxC,MAAM,kCACJ,CAAC,mBACD,CAAC,EAAE,iBAAiB;AAClB,QAAMA,UAAS,eAAe,IAAI,WAAW,MAAM;AAGnD,MAAI,CAACA,SAAQ;AACX,WAAO,IAAI;AAAA,MACT,mBAAmB,WAAW,MAAM;AAAA,IACtC;AAEO,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;AAMF,MAAe,kCAAA,CAACC,YAAwB;AAGtC,QAAM,YAAY;AAAA,IAChB,QAAQC,OAAqB;AAAA,IAC7B,WAAWC,UAAwB;AAAA,EACrC;AAQA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,YAKF,CAAC;AAMC,UAAA,eAAe,CAACH,YAA0D;AAC9E,UAAI,CAACI,WAAAA,QAAE,IAAIJ,SAAQ,UAAU,GAAG;AACvB,eAAA;AAAA,MAAA;AAGT,aAAOA,QAAO,UAAU,EAAE,SAAS,aAAa;AAAA,IAClD;AAKM,UAAA,sBAAsB,CAC1B,MACA,WACG;AACHI,iBAAAA,QAAE,QAAQ,MAAM,CAAC,KAAK,YAAY;AAChC,cAAM,cAAcA,WAAAA,QAAE;AAAA,UACpB,IAAI;AAAA,UACJ,CAAC,KAAK,YAAY,mBAAmB;AACnC,kBAAM,oBAAoBA,WAAA,QAAE,OAAO,YAAY,YAAY;AAEvD,gBAAAA,WAAA,QAAE,QAAQ,iBAAiB,GAAG;AACzB,qBAAA;AAAA,YAAA;AAGT,gBAAI,cAAc,IAAI,OAAO,KAAK,iBAAiB;AAE5C,mBAAA;AAAA,UACT;AAAA,UACA,CAAA;AAAA,QACF;AAEA,YAAI,CAACA,WAAA,QAAE,QAAQ,WAAW,GAAG;AAC3B,oBAAU,GAAG,MAAM,KAAK,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,QAAA;AAAA,MACrD,CACD;AAAA,IACH;AAEoBH,wBAAAA,QAAO,MAAM,KAAK;AAClBA,wBAAAA,QAAO,SAAS,QAAQ;AAErC,WAAA;AAAA,EACT;AAMA,QAAM,kBAAkB,YAAY;AAClC,UAAM,aAAa,cAAc;AAGjC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,YAAA,EAAE,gBAAgB;AAGxB,iBAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AAE/D,cAAM,QAAQ;AAAA,UACZ,QAAQ,IAAI,CAACD,YAAW;AACtB,kBAAM,YAAY,GAAG,GAAG,IAAI,UAAU,IAAIA,OAAM;AAEzC,mBAAA,UAAU,OAAO,SAAS,WAAW;AAAA,cAC1C;AAAA,cACA;AAAA,cACA,QAAAA;AAAA,cACA,KAAK;AAAA,YAAA,CACN;AAAA,UACF,CAAA;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAIA,QAAMK,WAASC,OAAuB,EAAE,WAAW;AAE5CD,WAAA;AAAA,IACL;AAAA,IACA,gCAAgC,UAAU,MAAM;AAAA,EAClD;AAEO,SAAA;AAAA,IAAA,QACLA;AAAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/services/content-api/permissions/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { createActionProvider, createConditionProvider } from './providers';\nimport createPermissionEngine from './engine';\n\nconst typeSymbol = Symbol.for('__type__');\n\ninterface ValidatePermissionHandler {\n (params: { permission: { action: string } }): boolean;\n}\n\n/**\n * Creates a handler that checks if the permission's action exists in the action registry\n */\nconst createValidatePermissionHandler =\n (actionProvider: ReturnType<typeof createActionProvider>): ValidatePermissionHandler =>\n ({ permission }) => {\n const action = actionProvider.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission and warn the user\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission`\n );\n\n return false;\n }\n\n return true;\n };\n\n/**\n * Create instances of providers and permission engine for the core content-API service.\n * Also, expose utilities to get information about available actions and such.\n */\nexport default (strapi: Core.Strapi) => {\n // NOTE: Here we define both an action and condition provider,\n // but at the moment, we're only using the action one.\n const providers = {\n action: createActionProvider(),\n condition: createConditionProvider(),\n };\n\n /**\n * Get a tree representation of the available Content API actions\n * based on the methods of the Content API controllers.\n *\n * @note Only actions bound to a content-API route are returned.\n */\n const getActionsMap = () => {\n const actionMap: Record<\n string,\n {\n controllers: Record<string, string[]>;\n }\n > = {};\n\n /**\n * Check if a controller's action is bound to the\n * content-api by looking at a potential __type__ symbol\n */\n const isContentApi = (action: Core.ControllerHandler & { [s: symbol]: any }) => {\n if (!_.has(action, typeSymbol)) {\n return false;\n }\n\n return action[typeSymbol].includes('content-api');\n };\n\n /**\n * Register actions from a specific API source into the result tree\n */\n const registerAPIsActions = (\n apis: Record<string, Core.Plugin | Core.Module>,\n source: 'api' | 'plugin'\n ) => {\n _.forEach(apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = Object.keys(contentApiActions);\n\n return acc;\n },\n {} as Record<string, string[]>\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`${source}::${apiName}`] = { controllers };\n }\n });\n };\n\n registerAPIsActions(strapi.apis, 'api');\n registerAPIsActions(strapi.plugins, 'plugin');\n\n return actionMap;\n };\n\n /**\n * Register all the content-API controllers actions into the action provider.\n * This method make use of the {@link getActionsMap} to generate the list of actions to register.\n */\n const registerActions = async () => {\n const actionsMap = getActionsMap();\n\n // For each API\n for (const [api, value] of Object.entries(actionsMap)) {\n const { controllers } = value;\n\n // Register controllers methods as actions\n for (const [controller, actions] of Object.entries(controllers)) {\n // Register each action individually\n await Promise.all(\n actions.map((action) => {\n const actionUID = `${api}.${controller}.${action}`;\n\n return providers.action.register(actionUID, {\n api,\n controller,\n action,\n uid: actionUID,\n });\n })\n );\n }\n }\n };\n\n // Create an instance of a content-API permission engine\n // and binds a custom validation handler to it\n const engine = createPermissionEngine({ providers });\n\n engine.on(\n 'before-format::validate.permission',\n createValidatePermissionHandler(providers.action)\n );\n\n return {\n engine,\n providers,\n registerActions,\n getActionsMap,\n };\n};\n"],"names":["strapi"],"mappings":";;;;AAKA,MAAM,aAAa,OAAO,IAAI,UAAU;AASxC,MAAM,kCACJ,CAAC,mBACD,CAAC,EAAE,iBAAiB;AAClB,QAAM,SAAS,eAAe,IAAI,WAAW,MAAM;AAGnD,MAAI,CAAC,QAAQ;AACX,WAAO,IAAI;AAAA,MACT,mBAAmB,WAAW,MAAM;AAAA,
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/services/content-api/permissions/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { createActionProvider, createConditionProvider } from './providers';\nimport createPermissionEngine from './engine';\n\nconst typeSymbol = Symbol.for('__type__');\n\ninterface ValidatePermissionHandler {\n (params: { permission: { action: string } }): boolean;\n}\n\n/**\n * Creates a handler that checks if the permission's action exists in the action registry\n */\nconst createValidatePermissionHandler =\n (actionProvider: ReturnType<typeof createActionProvider>): ValidatePermissionHandler =>\n ({ permission }) => {\n const action = actionProvider.get(permission.action);\n\n // If the action isn't registered into the action provider, then ignore the permission and warn the user\n if (!action) {\n strapi.log.debug(\n `Unknown action \"${permission.action}\" supplied when registering a new permission`\n );\n\n return false;\n }\n\n return true;\n };\n\n/**\n * Create instances of providers and permission engine for the core content-API service.\n * Also, expose utilities to get information about available actions and such.\n */\nexport default (strapi: Core.Strapi) => {\n // NOTE: Here we define both an action and condition provider,\n // but at the moment, we're only using the action one.\n const providers = {\n action: createActionProvider(),\n condition: createConditionProvider(),\n };\n\n /**\n * Get a tree representation of the available Content API actions\n * based on the methods of the Content API controllers.\n *\n * @note Only actions bound to a content-API route are returned.\n */\n const getActionsMap = () => {\n const actionMap: Record<\n string,\n {\n controllers: Record<string, string[]>;\n }\n > = {};\n\n /**\n * Check if a controller's action is bound to the\n * content-api by looking at a potential __type__ symbol\n */\n const isContentApi = (action: Core.ControllerHandler & { [s: symbol]: any }) => {\n if (!_.has(action, typeSymbol)) {\n return false;\n }\n\n return action[typeSymbol].includes('content-api');\n };\n\n /**\n * Register actions from a specific API source into the result tree\n */\n const registerAPIsActions = (\n apis: Record<string, Core.Plugin | Core.Module>,\n source: 'api' | 'plugin'\n ) => {\n _.forEach(apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = Object.keys(contentApiActions);\n\n return acc;\n },\n {} as Record<string, string[]>\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`${source}::${apiName}`] = { controllers };\n }\n });\n };\n\n registerAPIsActions(strapi.apis, 'api');\n registerAPIsActions(strapi.plugins, 'plugin');\n\n return actionMap;\n };\n\n /**\n * Register all the content-API controllers actions into the action provider.\n * This method make use of the {@link getActionsMap} to generate the list of actions to register.\n */\n const registerActions = async () => {\n const actionsMap = getActionsMap();\n\n // For each API\n for (const [api, value] of Object.entries(actionsMap)) {\n const { controllers } = value;\n\n // Register controllers methods as actions\n for (const [controller, actions] of Object.entries(controllers)) {\n // Register each action individually\n await Promise.all(\n actions.map((action) => {\n const actionUID = `${api}.${controller}.${action}`;\n\n return providers.action.register(actionUID, {\n api,\n controller,\n action,\n uid: actionUID,\n });\n })\n );\n }\n }\n };\n\n // Create an instance of a content-API permission engine\n // and binds a custom validation handler to it\n const engine = createPermissionEngine({ providers });\n\n engine.on(\n 'before-format::validate.permission',\n createValidatePermissionHandler(providers.action)\n );\n\n return {\n engine,\n providers,\n registerActions,\n getActionsMap,\n };\n};\n"],"names":["strapi"],"mappings":";;;;AAKA,MAAM,aAAa,OAAO,IAAI,UAAU;AASxC,MAAM,kCACJ,CAAC,mBACD,CAAC,EAAE,iBAAiB;AAClB,QAAM,SAAS,eAAe,IAAI,WAAW,MAAM;AAGnD,MAAI,CAAC,QAAQ;AACX,WAAO,IAAI;AAAA,MACT,mBAAmB,WAAW,MAAM;AAAA,IACtC;AAEO,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;AAMF,MAAe,kCAAA,CAACA,YAAwB;AAGtC,QAAM,YAAY;AAAA,IAChB,QAAQ,qBAAqB;AAAA,IAC7B,WAAW,wBAAwB;AAAA,EACrC;AAQA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,YAKF,CAAC;AAMC,UAAA,eAAe,CAAC,WAA0D;AAC9E,UAAI,CAAC,EAAE,IAAI,QAAQ,UAAU,GAAG;AACvB,eAAA;AAAA,MAAA;AAGT,aAAO,OAAO,UAAU,EAAE,SAAS,aAAa;AAAA,IAClD;AAKM,UAAA,sBAAsB,CAC1B,MACA,WACG;AACH,QAAE,QAAQ,MAAM,CAAC,KAAK,YAAY;AAChC,cAAM,cAAc,EAAE;AAAA,UACpB,IAAI;AAAA,UACJ,CAAC,KAAK,YAAY,mBAAmB;AACnC,kBAAM,oBAAoB,EAAE,OAAO,YAAY,YAAY;AAEvD,gBAAA,EAAE,QAAQ,iBAAiB,GAAG;AACzB,qBAAA;AAAA,YAAA;AAGT,gBAAI,cAAc,IAAI,OAAO,KAAK,iBAAiB;AAE5C,mBAAA;AAAA,UACT;AAAA,UACA,CAAA;AAAA,QACF;AAEA,YAAI,CAAC,EAAE,QAAQ,WAAW,GAAG;AAC3B,oBAAU,GAAG,MAAM,KAAK,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,QAAA;AAAA,MACrD,CACD;AAAA,IACH;AAEoBA,wBAAAA,QAAO,MAAM,KAAK;AAClBA,wBAAAA,QAAO,SAAS,QAAQ;AAErC,WAAA;AAAA,EACT;AAMA,QAAM,kBAAkB,YAAY;AAClC,UAAM,aAAa,cAAc;AAGjC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/C,YAAA,EAAE,gBAAgB;AAGxB,iBAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AAE/D,cAAM,QAAQ;AAAA,UACZ,QAAQ,IAAI,CAAC,WAAW;AACtB,kBAAM,YAAY,GAAG,GAAG,IAAI,UAAU,IAAI,MAAM;AAEzC,mBAAA,UAAU,OAAO,SAAS,WAAW;AAAA,cAC1C;AAAA,cACA;AAAA,cACA;AAAA,cACA,KAAK;AAAA,YAAA,CACN;AAAA,UACF,CAAA;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAIA,QAAM,SAAS,uBAAuB,EAAE,WAAW;AAE5C,SAAA;AAAA,IACL;AAAA,IACA,gCAAgC,UAAU,MAAM;AAAA,EAClD;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../../../../src/services/content-api/permissions/providers/action.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(action: string, payload: Record<string, unknown>) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new actions outside the bootstrap function.`);\n }\n\n return provider.register(action, payload);\n },\n };\n};\n"],"names":["providerFactory"],"mappings":";;AAEA,MAAA,uBAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAWA,4BAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,QAAgB,SAAkC;AAC/D,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,gEAAgE;AAAA,
|
1
|
+
{"version":3,"file":"action.js","sources":["../../../../../src/services/content-api/permissions/providers/action.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(action: string, payload: Record<string, unknown>) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new actions outside the bootstrap function.`);\n }\n\n return provider.register(action, payload);\n },\n };\n};\n"],"names":["providerFactory"],"mappings":";;AAEA,MAAA,uBAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAWA,4BAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,QAAgB,SAAkC;AAC/D,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,gEAAgE;AAAA,MAAA;AAG3E,aAAA,SAAS,SAAS,QAAQ,OAAO;AAAA,IAAA;AAAA,EAE5C;AACF;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../../../../src/services/content-api/permissions/providers/action.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(action: string, payload: Record<string, unknown>) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new actions outside the bootstrap function.`);\n }\n\n return provider.register(action, payload);\n },\n };\n};\n"],"names":[],"mappings":";AAEA,MAAA,uBAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAW,gBAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,QAAgB,SAAkC;AAC/D,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,gEAAgE;AAAA,
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../../../../src/services/content-api/permissions/providers/action.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(action: string, payload: Record<string, unknown>) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new actions outside the bootstrap function.`);\n }\n\n return provider.register(action, payload);\n },\n };\n};\n"],"names":[],"mappings":";AAEA,MAAA,uBAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAW,gBAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,QAAgB,SAAkC;AAC/D,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,gEAAgE;AAAA,MAAA;AAG3E,aAAA,SAAS,SAAS,QAAQ,OAAO;AAAA,IAAA;AAAA,EAE5C;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"condition.js","sources":["../../../../../src/services/content-api/permissions/providers/condition.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport interface Condition {\n name: string;\n [key: string]: unknown;\n}\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(condition: Condition) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new conditions outside the bootstrap function.`);\n }\n\n return provider.register(condition.name, condition);\n },\n };\n};\n"],"names":["providerFactory"],"mappings":";;AAOA,MAAA,0BAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAWA,4BAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,WAAsB;AACnC,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,mEAAmE;AAAA,
|
1
|
+
{"version":3,"file":"condition.js","sources":["../../../../../src/services/content-api/permissions/providers/condition.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport interface Condition {\n name: string;\n [key: string]: unknown;\n}\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(condition: Condition) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new conditions outside the bootstrap function.`);\n }\n\n return provider.register(condition.name, condition);\n },\n };\n};\n"],"names":["providerFactory"],"mappings":";;AAOA,MAAA,0BAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAWA,4BAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,WAAsB;AACnC,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,mEAAmE;AAAA,MAAA;AAGrF,aAAO,SAAS,SAAS,UAAU,MAAM,SAAS;AAAA,IAAA;AAAA,EAEtD;AACF;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"condition.mjs","sources":["../../../../../src/services/content-api/permissions/providers/condition.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport interface Condition {\n name: string;\n [key: string]: unknown;\n}\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(condition: Condition) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new conditions outside the bootstrap function.`);\n }\n\n return provider.register(condition.name, condition);\n },\n };\n};\n"],"names":[],"mappings":";AAOA,MAAA,0BAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAW,gBAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,WAAsB;AACnC,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,mEAAmE;AAAA,
|
1
|
+
{"version":3,"file":"condition.mjs","sources":["../../../../../src/services/content-api/permissions/providers/condition.ts"],"sourcesContent":["import { providerFactory } from '@strapi/utils';\n\nexport interface Condition {\n name: string;\n [key: string]: unknown;\n}\n\nexport default (options = {}) => {\n const provider = providerFactory(options);\n\n return {\n ...provider,\n\n async register(condition: Condition) {\n if (strapi.isLoaded) {\n throw new Error(`You can't register new conditions outside the bootstrap function.`);\n }\n\n return provider.register(condition.name, condition);\n },\n };\n};\n"],"names":[],"mappings":";AAOA,MAAA,0BAAe,CAAC,UAAU,CAAA,MAAO;AACzB,QAAA,WAAW,gBAAgB,OAAO;AAEjC,SAAA;AAAA,IACL,GAAG;AAAA,IAEH,MAAM,SAAS,WAAsB;AACnC,UAAI,OAAO,UAAU;AACb,cAAA,IAAI,MAAM,mEAAmE;AAAA,MAAA;AAGrF,aAAO,SAAS,SAAS,UAAU,MAAM,SAAS;AAAA,IAAA;AAAA,EAEtD;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"core-store.js","sources":["../../src/services/core-store.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport type { Database, Model } from '@strapi/database';\n\nconst coreStoreModel: Model = {\n uid: 'strapi::core-store',\n singularName: 'strapi_core_store_settings',\n tableName: 'strapi_core_store_settings',\n attributes: {\n id: {\n type: 'increments',\n },\n key: {\n type: 'string',\n },\n value: {\n type: 'text',\n },\n type: {\n type: 'string',\n },\n environment: {\n type: 'string',\n },\n tag: {\n type: 'string',\n },\n },\n};\n\ntype SetParams = {\n key: string;\n value: unknown;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype GetParams = {\n key: string;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype Params = SetParams & GetParams;\n\ninterface CoreStore {\n (defaultParams: Partial<Params>): {\n get(params: Partial<GetParams>): Promise<unknown>;\n set(params: Partial<SetParams>): Promise<void>;\n delete(params: Partial<GetParams>): Promise<void>;\n };\n get(params: GetParams): Promise<unknown>;\n set(params: SetParams): Promise<void>;\n delete(params: GetParams): Promise<void>;\n}\n\nconst createCoreStore = ({ db }: { db: Database }) => {\n const mergeParams = (defaultParams: Partial<Params>, params: Params): Params => {\n return {\n ...defaultParams,\n ...params,\n };\n };\n\n const store: CoreStore = function (defaultParams: Partial<Params>) {\n return {\n get: (params: Params) => store.get(mergeParams(defaultParams, params)),\n set: (params: Params) => store.set(mergeParams(defaultParams, params)),\n delete: (params: Params) => store.delete(mergeParams(defaultParams, params)),\n };\n };\n\n /**\n * Get value from the core store\n */\n store.get = async (params) => {\n const { key, type = 'core', environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (!data) {\n return null;\n }\n\n if (\n data.type === 'object' ||\n data.type === 'array' ||\n data.type === 'boolean' ||\n data.type === 'string'\n ) {\n try {\n return JSON.parse(data.value);\n } catch (err) {\n return new Date(data.value);\n }\n } else if (data.type === 'number') {\n return Number(data.value);\n } else {\n return null;\n }\n };\n\n /**\n * Set value in the core store\n * @param {Object} params\n * @returns {*}\n */\n store.set = async (params) => {\n const { key, value, type, environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (data) {\n return db.query('strapi::core-store').update({\n where: { id: data.id },\n data: {\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n }\n\n return db.query('strapi::core-store').create({\n data: {\n ...where,\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n };\n\n /**\n * Deletes a value from the core store\n * @param {Object} params\n * @returns {*}\n */\n store.delete = async (params) => {\n const { key, environment, type, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n return db.query('strapi::core-store').delete({ where });\n };\n\n return store;\n};\n\nexport { coreStoreModel, createCoreStore };\n"],"names":["toString"],"mappings":";;;AAGA,MAAM,iBAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,IACV,IAAI;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,
|
1
|
+
{"version":3,"file":"core-store.js","sources":["../../src/services/core-store.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport type { Database, Model } from '@strapi/database';\n\nconst coreStoreModel: Model = {\n uid: 'strapi::core-store',\n singularName: 'strapi_core_store_settings',\n tableName: 'strapi_core_store_settings',\n attributes: {\n id: {\n type: 'increments',\n },\n key: {\n type: 'string',\n },\n value: {\n type: 'text',\n },\n type: {\n type: 'string',\n },\n environment: {\n type: 'string',\n },\n tag: {\n type: 'string',\n },\n },\n};\n\ntype SetParams = {\n key: string;\n value: unknown;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype GetParams = {\n key: string;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype Params = SetParams & GetParams;\n\ninterface CoreStore {\n (defaultParams: Partial<Params>): {\n get(params: Partial<GetParams>): Promise<unknown>;\n set(params: Partial<SetParams>): Promise<void>;\n delete(params: Partial<GetParams>): Promise<void>;\n };\n get(params: GetParams): Promise<unknown>;\n set(params: SetParams): Promise<void>;\n delete(params: GetParams): Promise<void>;\n}\n\nconst createCoreStore = ({ db }: { db: Database }) => {\n const mergeParams = (defaultParams: Partial<Params>, params: Params): Params => {\n return {\n ...defaultParams,\n ...params,\n };\n };\n\n const store: CoreStore = function (defaultParams: Partial<Params>) {\n return {\n get: (params: Params) => store.get(mergeParams(defaultParams, params)),\n set: (params: Params) => store.set(mergeParams(defaultParams, params)),\n delete: (params: Params) => store.delete(mergeParams(defaultParams, params)),\n };\n };\n\n /**\n * Get value from the core store\n */\n store.get = async (params) => {\n const { key, type = 'core', environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (!data) {\n return null;\n }\n\n if (\n data.type === 'object' ||\n data.type === 'array' ||\n data.type === 'boolean' ||\n data.type === 'string'\n ) {\n try {\n return JSON.parse(data.value);\n } catch (err) {\n return new Date(data.value);\n }\n } else if (data.type === 'number') {\n return Number(data.value);\n } else {\n return null;\n }\n };\n\n /**\n * Set value in the core store\n * @param {Object} params\n * @returns {*}\n */\n store.set = async (params) => {\n const { key, value, type, environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (data) {\n return db.query('strapi::core-store').update({\n where: { id: data.id },\n data: {\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n }\n\n return db.query('strapi::core-store').create({\n data: {\n ...where,\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n };\n\n /**\n * Deletes a value from the core store\n * @param {Object} params\n * @returns {*}\n */\n store.delete = async (params) => {\n const { key, environment, type, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n return db.query('strapi::core-store').delete({ where });\n };\n\n return store;\n};\n\nexport { coreStoreModel, createCoreStore };\n"],"names":["toString"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"core-store.mjs","sources":["../../src/services/core-store.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport type { Database, Model } from '@strapi/database';\n\nconst coreStoreModel: Model = {\n uid: 'strapi::core-store',\n singularName: 'strapi_core_store_settings',\n tableName: 'strapi_core_store_settings',\n attributes: {\n id: {\n type: 'increments',\n },\n key: {\n type: 'string',\n },\n value: {\n type: 'text',\n },\n type: {\n type: 'string',\n },\n environment: {\n type: 'string',\n },\n tag: {\n type: 'string',\n },\n },\n};\n\ntype SetParams = {\n key: string;\n value: unknown;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype GetParams = {\n key: string;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype Params = SetParams & GetParams;\n\ninterface CoreStore {\n (defaultParams: Partial<Params>): {\n get(params: Partial<GetParams>): Promise<unknown>;\n set(params: Partial<SetParams>): Promise<void>;\n delete(params: Partial<GetParams>): Promise<void>;\n };\n get(params: GetParams): Promise<unknown>;\n set(params: SetParams): Promise<void>;\n delete(params: GetParams): Promise<void>;\n}\n\nconst createCoreStore = ({ db }: { db: Database }) => {\n const mergeParams = (defaultParams: Partial<Params>, params: Params): Params => {\n return {\n ...defaultParams,\n ...params,\n };\n };\n\n const store: CoreStore = function (defaultParams: Partial<Params>) {\n return {\n get: (params: Params) => store.get(mergeParams(defaultParams, params)),\n set: (params: Params) => store.set(mergeParams(defaultParams, params)),\n delete: (params: Params) => store.delete(mergeParams(defaultParams, params)),\n };\n };\n\n /**\n * Get value from the core store\n */\n store.get = async (params) => {\n const { key, type = 'core', environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (!data) {\n return null;\n }\n\n if (\n data.type === 'object' ||\n data.type === 'array' ||\n data.type === 'boolean' ||\n data.type === 'string'\n ) {\n try {\n return JSON.parse(data.value);\n } catch (err) {\n return new Date(data.value);\n }\n } else if (data.type === 'number') {\n return Number(data.value);\n } else {\n return null;\n }\n };\n\n /**\n * Set value in the core store\n * @param {Object} params\n * @returns {*}\n */\n store.set = async (params) => {\n const { key, value, type, environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (data) {\n return db.query('strapi::core-store').update({\n where: { id: data.id },\n data: {\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n }\n\n return db.query('strapi::core-store').create({\n data: {\n ...where,\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n };\n\n /**\n * Deletes a value from the core store\n * @param {Object} params\n * @returns {*}\n */\n store.delete = async (params) => {\n const { key, environment, type, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n return db.query('strapi::core-store').delete({ where });\n };\n\n return store;\n};\n\nexport { coreStoreModel, createCoreStore };\n"],"names":[],"mappings":";AAGA,MAAM,iBAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,IACV,IAAI;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,
|
1
|
+
{"version":3,"file":"core-store.mjs","sources":["../../src/services/core-store.ts"],"sourcesContent":["import { toString } from 'lodash/fp';\nimport type { Database, Model } from '@strapi/database';\n\nconst coreStoreModel: Model = {\n uid: 'strapi::core-store',\n singularName: 'strapi_core_store_settings',\n tableName: 'strapi_core_store_settings',\n attributes: {\n id: {\n type: 'increments',\n },\n key: {\n type: 'string',\n },\n value: {\n type: 'text',\n },\n type: {\n type: 'string',\n },\n environment: {\n type: 'string',\n },\n tag: {\n type: 'string',\n },\n },\n};\n\ntype SetParams = {\n key: string;\n value: unknown;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype GetParams = {\n key: string;\n type?: string;\n environment?: string;\n name?: string;\n tag?: string;\n};\n\ntype Params = SetParams & GetParams;\n\ninterface CoreStore {\n (defaultParams: Partial<Params>): {\n get(params: Partial<GetParams>): Promise<unknown>;\n set(params: Partial<SetParams>): Promise<void>;\n delete(params: Partial<GetParams>): Promise<void>;\n };\n get(params: GetParams): Promise<unknown>;\n set(params: SetParams): Promise<void>;\n delete(params: GetParams): Promise<void>;\n}\n\nconst createCoreStore = ({ db }: { db: Database }) => {\n const mergeParams = (defaultParams: Partial<Params>, params: Params): Params => {\n return {\n ...defaultParams,\n ...params,\n };\n };\n\n const store: CoreStore = function (defaultParams: Partial<Params>) {\n return {\n get: (params: Params) => store.get(mergeParams(defaultParams, params)),\n set: (params: Params) => store.set(mergeParams(defaultParams, params)),\n delete: (params: Params) => store.delete(mergeParams(defaultParams, params)),\n };\n };\n\n /**\n * Get value from the core store\n */\n store.get = async (params) => {\n const { key, type = 'core', environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (!data) {\n return null;\n }\n\n if (\n data.type === 'object' ||\n data.type === 'array' ||\n data.type === 'boolean' ||\n data.type === 'string'\n ) {\n try {\n return JSON.parse(data.value);\n } catch (err) {\n return new Date(data.value);\n }\n } else if (data.type === 'number') {\n return Number(data.value);\n } else {\n return null;\n }\n };\n\n /**\n * Set value in the core store\n * @param {Object} params\n * @returns {*}\n */\n store.set = async (params) => {\n const { key, value, type, environment, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n const data = await db.query('strapi::core-store').findOne({ where });\n\n if (data) {\n return db.query('strapi::core-store').update({\n where: { id: data.id },\n data: {\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n }\n\n return db.query('strapi::core-store').create({\n data: {\n ...where,\n value: JSON.stringify(value) || toString(value),\n type: typeof value,\n },\n });\n };\n\n /**\n * Deletes a value from the core store\n * @param {Object} params\n * @returns {*}\n */\n store.delete = async (params) => {\n const { key, environment, type, name, tag } = params;\n\n const prefix = `${type}${name ? `_${name}` : ''}`;\n\n const where = {\n key: `${prefix}_${key}`,\n environment: environment || null,\n tag: tag || null,\n };\n\n return db.query('strapi::core-store').delete({ where });\n };\n\n return store;\n};\n\nexport { coreStoreModel, createCoreStore };\n"],"names":[],"mappings":"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"}
|
package/dist/services/cron.js
CHANGED
@@ -34,8 +34,7 @@ const createCronService = () => {
|
|
34
34
|
return this;
|
35
35
|
},
|
36
36
|
remove(name) {
|
37
|
-
if (!name)
|
38
|
-
throw new Error("You must provide a name to remove a cron job.");
|
37
|
+
if (!name) throw new Error("You must provide a name to remove a cron job.");
|
39
38
|
const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {
|
40
39
|
if (jobSpecName === name) {
|
41
40
|
jobsSpecs.splice(index, 1);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cron.js","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":["isFunction","Job"],"mappings":";;;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,
|
1
|
+
{"version":3,"file":"cron.js","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":["isFunction","Job"],"mappings":";;;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,CAAC;AAC5B,MAAI,UAAU;AAEP,SAAA;AAAA,IACL,IAAI,QAAe,IAAI;AACrB,iBAAW,kBAAkB,OAAO,KAAK,KAAK,GAAG;AACzC,cAAA,YAAY,MAAM,cAAc;AAElC,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAAA,GAAAA,WAAW,SAAS,GAAG;AAEd,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK;AACf,oBAAA;AAAA,QACD,WAAAA,GAAA,WAAW,UAAU,IAAI,GAAG;AAE1B,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK,SAAS;AAClC,oBAAU,UAAU;AAAA,QAAA,OACf;AACL,gBAAM,IAAI;AAAA,YACR,sCAAsC,cAAc;AAAA,UACtD;AAAA,QAAA;AAGI,cAAA,eAAe,IAAI,SAAoB,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI;AAG7D,cAAA,MAAM,IAAIC,aAAA,IAAI,YAAY;AAChC,kBAAU,KAAK,EAAE,KAAK,SAAS,MAAM,UAAU;AAE/C,YAAI,SAAS;AACX,cAAI,SAAS,OAAO;AAAA,QAAA;AAAA,MACtB;AAEK,aAAA;AAAA,IACT;AAAA,IAEA,OAAO,MAAc;AACnB,UAAI,CAAC,KAAY,OAAA,IAAI,MAAM,+CAA+C;AACpE,YAAA,oBAAoB,UAAU,OAAO,CAAC,EAAE,MAAM,eAAe,UAAU;AAC3E,YAAI,gBAAgB,MAAM;AACd,oBAAA,OAAO,OAAO,CAAC;AAClB,iBAAA;AAAA,QAAA;AAEF,eAAA;AAAA,MAAA,CACR;AACD,wBAAkB,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AAC5C,aAAA;AAAA,IACT;AAAA,IAEA,QAAQ;AACI,gBAAA,QAAQ,CAAC,EAAE,KAAK,cAAc,IAAI,SAAS,OAAO,CAAC;AACnD,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,OAAO;AACL,gBAAU,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AACjC,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,UAAU;AACR,WAAK,KAAK;AACV,kBAAY,CAAC;AACN,aAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EACR;AACF;;"}
|
package/dist/services/cron.mjs
CHANGED
@@ -33,8 +33,7 @@ const createCronService = () => {
|
|
33
33
|
return this;
|
34
34
|
},
|
35
35
|
remove(name) {
|
36
|
-
if (!name)
|
37
|
-
throw new Error("You must provide a name to remove a cron job.");
|
36
|
+
if (!name) throw new Error("You must provide a name to remove a cron job.");
|
38
37
|
const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {
|
39
38
|
if (jobSpecName === name) {
|
40
39
|
jobsSpecs.splice(index, 1);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":[],"mappings":";;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,
|
1
|
+
{"version":3,"file":"cron.mjs","sources":["../../src/services/cron.ts"],"sourcesContent":["import { Job, Spec } from 'node-schedule';\nimport { isFunction } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\ninterface JobSpec {\n job: Job;\n options: Spec;\n name: string | null;\n}\n\ntype TaskFn = ({ strapi }: { strapi: Core.Strapi }, ...args: unknown[]) => Promise<unknown>;\n\ntype Task =\n | TaskFn\n | {\n task: TaskFn;\n options: Spec;\n };\n\ninterface Tasks {\n [key: string]: Task;\n}\n\nconst createCronService = () => {\n let jobsSpecs: JobSpec[] = [];\n let running = false;\n\n return {\n add(tasks: Tasks = {}) {\n for (const taskExpression of Object.keys(tasks)) {\n const taskValue = tasks[taskExpression];\n\n let fn: TaskFn;\n let options: Spec;\n let taskName: string | null;\n if (isFunction(taskValue)) {\n // don't use task name if key is the rule\n taskName = null;\n fn = taskValue.bind(tasks);\n options = taskExpression;\n } else if (isFunction(taskValue.task)) {\n // set task name if key is not the rule\n taskName = taskExpression;\n fn = taskValue.task.bind(taskValue);\n options = taskValue.options;\n } else {\n throw new Error(\n `Could not schedule a cron job for \"${taskExpression}\": no function found.`\n );\n }\n\n const fnWithStrapi = (...args: unknown[]) => fn({ strapi }, ...args);\n\n // const job = new Job(null, fnWithStrapi);\n const job = new Job(fnWithStrapi);\n jobsSpecs.push({ job, options, name: taskName });\n\n if (running) {\n job.schedule(options);\n }\n }\n return this;\n },\n\n remove(name: string) {\n if (!name) throw new Error('You must provide a name to remove a cron job.');\n const matchingJobsSpecs = jobsSpecs.filter(({ name: jobSpecName }, index) => {\n if (jobSpecName === name) {\n jobsSpecs.splice(index, 1);\n return true;\n }\n return false;\n });\n matchingJobsSpecs.forEach(({ job }) => job.cancel());\n return this;\n },\n\n start() {\n jobsSpecs.forEach(({ job, options }) => job.schedule(options));\n running = true;\n return this;\n },\n\n stop() {\n jobsSpecs.forEach(({ job }) => job.cancel());\n running = false;\n return this;\n },\n\n destroy() {\n this.stop();\n jobsSpecs = [];\n return this;\n },\n jobs: jobsSpecs,\n };\n};\n\nexport default createCronService;\n"],"names":[],"mappings":";;AAuBA,MAAM,oBAAoB,MAAM;AAC9B,MAAI,YAAuB,CAAC;AAC5B,MAAI,UAAU;AAEP,SAAA;AAAA,IACL,IAAI,QAAe,IAAI;AACrB,iBAAW,kBAAkB,OAAO,KAAK,KAAK,GAAG;AACzC,cAAA,YAAY,MAAM,cAAc;AAElC,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA,WAAW,SAAS,GAAG;AAEd,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK;AACf,oBAAA;AAAA,QACD,WAAA,WAAW,UAAU,IAAI,GAAG;AAE1B,qBAAA;AACN,eAAA,UAAU,KAAK,KAAK,SAAS;AAClC,oBAAU,UAAU;AAAA,QAAA,OACf;AACL,gBAAM,IAAI;AAAA,YACR,sCAAsC,cAAc;AAAA,UACtD;AAAA,QAAA;AAGI,cAAA,eAAe,IAAI,SAAoB,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI;AAG7D,cAAA,MAAM,IAAI,IAAI,YAAY;AAChC,kBAAU,KAAK,EAAE,KAAK,SAAS,MAAM,UAAU;AAE/C,YAAI,SAAS;AACX,cAAI,SAAS,OAAO;AAAA,QAAA;AAAA,MACtB;AAEK,aAAA;AAAA,IACT;AAAA,IAEA,OAAO,MAAc;AACnB,UAAI,CAAC,KAAY,OAAA,IAAI,MAAM,+CAA+C;AACpE,YAAA,oBAAoB,UAAU,OAAO,CAAC,EAAE,MAAM,eAAe,UAAU;AAC3E,YAAI,gBAAgB,MAAM;AACd,oBAAA,OAAO,OAAO,CAAC;AAClB,iBAAA;AAAA,QAAA;AAEF,eAAA;AAAA,MAAA,CACR;AACD,wBAAkB,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AAC5C,aAAA;AAAA,IACT;AAAA,IAEA,QAAQ;AACI,gBAAA,QAAQ,CAAC,EAAE,KAAK,cAAc,IAAI,SAAS,OAAO,CAAC;AACnD,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,OAAO;AACL,gBAAU,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AACjC,gBAAA;AACH,aAAA;AAAA,IACT;AAAA,IAEA,UAAU;AACR,WAAK,KAAK;AACV,kBAAY,CAAC;AACN,aAAA;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EACR;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"custom-fields.js","sources":["../../src/services/custom-fields.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nconst createCustomFields = (strapi: Core.Strapi): Modules.CustomFields.CustomFields => {\n return {\n register(customField) {\n strapi.get('custom-fields').add(customField);\n },\n };\n};\n\nexport default createCustomFields;\n"],"names":[],"mappings":";AAEM,MAAA,qBAAqB,CAAC,WAA2D;AAC9E,SAAA;AAAA,IACL,SAAS,aAAa;AACpB,aAAO,IAAI,eAAe,EAAE,IAAI,WAAW;AAAA,
|
1
|
+
{"version":3,"file":"custom-fields.js","sources":["../../src/services/custom-fields.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nconst createCustomFields = (strapi: Core.Strapi): Modules.CustomFields.CustomFields => {\n return {\n register(customField) {\n strapi.get('custom-fields').add(customField);\n },\n };\n};\n\nexport default createCustomFields;\n"],"names":[],"mappings":";AAEM,MAAA,qBAAqB,CAAC,WAA2D;AAC9E,SAAA;AAAA,IACL,SAAS,aAAa;AACpB,aAAO,IAAI,eAAe,EAAE,IAAI,WAAW;AAAA,IAAA;AAAA,EAE/C;AACF;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"custom-fields.mjs","sources":["../../src/services/custom-fields.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nconst createCustomFields = (strapi: Core.Strapi): Modules.CustomFields.CustomFields => {\n return {\n register(customField) {\n strapi.get('custom-fields').add(customField);\n },\n };\n};\n\nexport default createCustomFields;\n"],"names":[],"mappings":"AAEM,MAAA,qBAAqB,CAAC,WAA2D;AAC9E,SAAA;AAAA,IACL,SAAS,aAAa;AACpB,aAAO,IAAI,eAAe,EAAE,IAAI,WAAW;AAAA,
|
1
|
+
{"version":3,"file":"custom-fields.mjs","sources":["../../src/services/custom-fields.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nconst createCustomFields = (strapi: Core.Strapi): Modules.CustomFields.CustomFields => {\n return {\n register(customField) {\n strapi.get('custom-fields').add(customField);\n },\n };\n};\n\nexport default createCustomFields;\n"],"names":[],"mappings":"AAEM,MAAA,qBAAqB,CAAC,WAA2D;AAC9E,SAAA;AAAA,IACL,SAAS,aAAa;AACpB,aAAO,IAAI,eAAe,EAAE,IAAI,WAAW;AAAA,IAAA;AAAA,EAE/C;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/services/document-service/attributes/index.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID, Modules, Schema } from '@strapi/types';\n\nimport transforms from './transforms';\n\n// aliasing the type to make it easier to read\ntype Data = Modules.Documents.Params.Data.Input<UID.Schema>;\n\nconst applyTransforms = curry((schema: Schema.Schema, data: Data) => {\n const attributeNames = Object.keys(data) as Array<keyof typeof data & string>;\n\n for (const attributeName of attributeNames) {\n const value = data[attributeName];\n\n const attribute = schema.attributes[attributeName];\n\n if (!attribute) {\n continue;\n }\n\n const transform = transforms[attribute.type];\n\n if (transform) {\n const attributeContext = { attributeName, attribute };\n\n data[attributeName] = transform(value, attributeContext);\n }\n }\n\n return data;\n});\n\nexport { applyTransforms };\n"],"names":["curry"],"mappings":";;;;AASA,MAAM,kBAAkBA,GAAA,MAAM,CAAC,QAAuB,SAAe;AAC7D,QAAA,iBAAiB,OAAO,KAAK,IAAI;AAEvC,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,QAAQ,KAAK,aAAa;AAE1B,UAAA,YAAY,OAAO,WAAW,aAAa;AAEjD,QAAI,CAAC,WAAW;AACd;AAAA,
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/services/document-service/attributes/index.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID, Modules, Schema } from '@strapi/types';\n\nimport transforms from './transforms';\n\n// aliasing the type to make it easier to read\ntype Data = Modules.Documents.Params.Data.Input<UID.Schema>;\n\nconst applyTransforms = curry((schema: Schema.Schema, data: Data) => {\n const attributeNames = Object.keys(data) as Array<keyof typeof data & string>;\n\n for (const attributeName of attributeNames) {\n const value = data[attributeName];\n\n const attribute = schema.attributes[attributeName];\n\n if (!attribute) {\n continue;\n }\n\n const transform = transforms[attribute.type];\n\n if (transform) {\n const attributeContext = { attributeName, attribute };\n\n data[attributeName] = transform(value, attributeContext);\n }\n }\n\n return data;\n});\n\nexport { applyTransforms };\n"],"names":["curry"],"mappings":";;;;AASA,MAAM,kBAAkBA,GAAA,MAAM,CAAC,QAAuB,SAAe;AAC7D,QAAA,iBAAiB,OAAO,KAAK,IAAI;AAEvC,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,QAAQ,KAAK,aAAa;AAE1B,UAAA,YAAY,OAAO,WAAW,aAAa;AAEjD,QAAI,CAAC,WAAW;AACd;AAAA,IAAA;AAGI,UAAA,YAAY,WAAW,UAAU,IAAI;AAE3C,QAAI,WAAW;AACP,YAAA,mBAAmB,EAAE,eAAe,UAAU;AAEpD,WAAK,aAAa,IAAI,UAAU,OAAO,gBAAgB;AAAA,IAAA;AAAA,EACzD;AAGK,SAAA;AACT,CAAC;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/services/document-service/attributes/index.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID, Modules, Schema } from '@strapi/types';\n\nimport transforms from './transforms';\n\n// aliasing the type to make it easier to read\ntype Data = Modules.Documents.Params.Data.Input<UID.Schema>;\n\nconst applyTransforms = curry((schema: Schema.Schema, data: Data) => {\n const attributeNames = Object.keys(data) as Array<keyof typeof data & string>;\n\n for (const attributeName of attributeNames) {\n const value = data[attributeName];\n\n const attribute = schema.attributes[attributeName];\n\n if (!attribute) {\n continue;\n }\n\n const transform = transforms[attribute.type];\n\n if (transform) {\n const attributeContext = { attributeName, attribute };\n\n data[attributeName] = transform(value, attributeContext);\n }\n }\n\n return data;\n});\n\nexport { applyTransforms };\n"],"names":[],"mappings":";;AASA,MAAM,kBAAkB,MAAM,CAAC,QAAuB,SAAe;AAC7D,QAAA,iBAAiB,OAAO,KAAK,IAAI;AAEvC,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,QAAQ,KAAK,aAAa;AAE1B,UAAA,YAAY,OAAO,WAAW,aAAa;AAEjD,QAAI,CAAC,WAAW;AACd;AAAA,
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/services/document-service/attributes/index.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID, Modules, Schema } from '@strapi/types';\n\nimport transforms from './transforms';\n\n// aliasing the type to make it easier to read\ntype Data = Modules.Documents.Params.Data.Input<UID.Schema>;\n\nconst applyTransforms = curry((schema: Schema.Schema, data: Data) => {\n const attributeNames = Object.keys(data) as Array<keyof typeof data & string>;\n\n for (const attributeName of attributeNames) {\n const value = data[attributeName];\n\n const attribute = schema.attributes[attributeName];\n\n if (!attribute) {\n continue;\n }\n\n const transform = transforms[attribute.type];\n\n if (transform) {\n const attributeContext = { attributeName, attribute };\n\n data[attributeName] = transform(value, attributeContext);\n }\n }\n\n return data;\n});\n\nexport { applyTransforms };\n"],"names":[],"mappings":";;AASA,MAAM,kBAAkB,MAAM,CAAC,QAAuB,SAAe;AAC7D,QAAA,iBAAiB,OAAO,KAAK,IAAI;AAEvC,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,QAAQ,KAAK,aAAa;AAE1B,UAAA,YAAY,OAAO,WAAW,aAAa;AAEjD,QAAI,CAAC,WAAW;AACd;AAAA,IAAA;AAGI,UAAA,YAAY,WAAW,UAAU,IAAI;AAE3C,QAAI,WAAW;AACP,YAAA,mBAAmB,EAAE,eAAe,UAAU;AAEpD,WAAK,aAAa,IAAI,UAAU,OAAO,gBAAgB;AAAA,IAAA;AAAA,EACzD;AAGK,SAAA;AACT,CAAC;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transforms.js","sources":["../../../../src/services/document-service/attributes/transforms.ts"],"sourcesContent":["import { getOr, toNumber, isString } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\nimport bcrypt from 'bcryptjs';\n\ntype Transforms = {\n [TKind in Schema.Attribute.Kind]?: (\n value: unknown,\n context: {\n attribute: Schema.Attribute.AnyAttribute;\n attributeName: string;\n }\n ) => any;\n};\n\nconst transforms: Transforms = {\n password(value, context) {\n const { attribute } = context;\n\n if (attribute.type !== 'password') {\n throw new Error('Invalid attribute type');\n }\n\n if (!isString(value) && !(value instanceof Buffer)) {\n return value;\n }\n\n const rounds = toNumber(getOr(10, 'encryption.rounds', attribute));\n\n return bcrypt.hashSync(value.toString(), rounds);\n },\n};\n\nexport default transforms;\n"],"names":["isString","toNumber","getOr","bcrypt"],"mappings":";;;;;AAcA,MAAM,aAAyB;AAAA,EAC7B,SAAS,OAAO,SAAS;AACjB,UAAA,EAAE,
|
1
|
+
{"version":3,"file":"transforms.js","sources":["../../../../src/services/document-service/attributes/transforms.ts"],"sourcesContent":["import { getOr, toNumber, isString } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\nimport bcrypt from 'bcryptjs';\n\ntype Transforms = {\n [TKind in Schema.Attribute.Kind]?: (\n value: unknown,\n context: {\n attribute: Schema.Attribute.AnyAttribute;\n attributeName: string;\n }\n ) => any;\n};\n\nconst transforms: Transforms = {\n password(value, context) {\n const { attribute } = context;\n\n if (attribute.type !== 'password') {\n throw new Error('Invalid attribute type');\n }\n\n if (!isString(value) && !(value instanceof Buffer)) {\n return value;\n }\n\n const rounds = toNumber(getOr(10, 'encryption.rounds', attribute));\n\n return bcrypt.hashSync(value.toString(), rounds);\n },\n};\n\nexport default transforms;\n"],"names":["isString","toNumber","getOr","bcrypt"],"mappings":";;;;;AAcA,MAAM,aAAyB;AAAA,EAC7B,SAAS,OAAO,SAAS;AACjB,UAAA,EAAE,cAAc;AAElB,QAAA,UAAU,SAAS,YAAY;AAC3B,YAAA,IAAI,MAAM,wBAAwB;AAAA,IAAA;AAG1C,QAAI,CAACA,GAAS,SAAA,KAAK,KAAK,EAAE,iBAAiB,SAAS;AAC3C,aAAA;AAAA,IAAA;AAGT,UAAM,SAASC,GAAAA,SAASC,GAAAA,MAAM,IAAI,qBAAqB,SAAS,CAAC;AAEjE,WAAOC,gBAAO,QAAA,SAAS,MAAM,SAAA,GAAY,MAAM;AAAA,EAAA;AAEnD;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transforms.mjs","sources":["../../../../src/services/document-service/attributes/transforms.ts"],"sourcesContent":["import { getOr, toNumber, isString } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\nimport bcrypt from 'bcryptjs';\n\ntype Transforms = {\n [TKind in Schema.Attribute.Kind]?: (\n value: unknown,\n context: {\n attribute: Schema.Attribute.AnyAttribute;\n attributeName: string;\n }\n ) => any;\n};\n\nconst transforms: Transforms = {\n password(value, context) {\n const { attribute } = context;\n\n if (attribute.type !== 'password') {\n throw new Error('Invalid attribute type');\n }\n\n if (!isString(value) && !(value instanceof Buffer)) {\n return value;\n }\n\n const rounds = toNumber(getOr(10, 'encryption.rounds', attribute));\n\n return bcrypt.hashSync(value.toString(), rounds);\n },\n};\n\nexport default transforms;\n"],"names":[],"mappings":";;AAcA,MAAM,aAAyB;AAAA,EAC7B,SAAS,OAAO,SAAS;AACjB,UAAA,EAAE,
|
1
|
+
{"version":3,"file":"transforms.mjs","sources":["../../../../src/services/document-service/attributes/transforms.ts"],"sourcesContent":["import { getOr, toNumber, isString } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\nimport bcrypt from 'bcryptjs';\n\ntype Transforms = {\n [TKind in Schema.Attribute.Kind]?: (\n value: unknown,\n context: {\n attribute: Schema.Attribute.AnyAttribute;\n attributeName: string;\n }\n ) => any;\n};\n\nconst transforms: Transforms = {\n password(value, context) {\n const { attribute } = context;\n\n if (attribute.type !== 'password') {\n throw new Error('Invalid attribute type');\n }\n\n if (!isString(value) && !(value instanceof Buffer)) {\n return value;\n }\n\n const rounds = toNumber(getOr(10, 'encryption.rounds', attribute));\n\n return bcrypt.hashSync(value.toString(), rounds);\n },\n};\n\nexport default transforms;\n"],"names":[],"mappings":";;AAcA,MAAM,aAAyB;AAAA,EAC7B,SAAS,OAAO,SAAS;AACjB,UAAA,EAAE,cAAc;AAElB,QAAA,UAAU,SAAS,YAAY;AAC3B,YAAA,IAAI,MAAM,wBAAwB;AAAA,IAAA;AAG1C,QAAI,CAAC,SAAS,KAAK,KAAK,EAAE,iBAAiB,SAAS;AAC3C,aAAA;AAAA,IAAA;AAGT,UAAM,SAAS,SAAS,MAAM,IAAI,qBAAqB,SAAS,CAAC;AAEjE,WAAO,OAAO,SAAS,MAAM,SAAA,GAAY,MAAM;AAAA,EAAA;AAEnD;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../../../src/services/document-service/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, omit, pipe, assign, curry } from 'lodash/fp';\nimport type { Utils, UID, Schema, Data, Modules } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async, errors } from '@strapi/utils';\n\n// type aliases for readability\ntype Input<T extends UID.Schema> = Modules.Documents.Params.Data.Input<T>;\n\ntype LoadedComponents<TUID extends UID.Schema> = Data.Entity<\n TUID,\n Schema.AttributeNamesByType<TUID, 'component' | 'dynamiczone'>\n>;\n\ntype SingleComponentValue = Schema.Attribute.ComponentValue<UID.Component, false>;\ntype RepeatableComponentValue = Schema.Attribute.ComponentValue<UID.Component, true>;\n\ntype ComponentValue = SingleComponentValue | RepeatableComponentValue;\n\ntype DynamicZoneValue = Schema.Attribute.DynamicZoneValue<UID.Component[]>;\n\ntype ComponentBody = {\n [key: string]: ComponentValue | DynamicZoneValue;\n};\n\nconst omitComponentData = curry(\n (schema: Schema.Schema, data: Input<UID.Schema>): Partial<Input<UID.Schema>> => {\n const { attributes } = schema;\n const componentAttributes = Object.keys(attributes).filter((attributeName) =>\n contentTypesUtils.isComponentAttribute(attributes[attributeName])\n );\n\n return omit(componentAttributes, data);\n }\n);\n\n// NOTE: we could generalize the logic to allow CRUD of relation directly in the DB layer\nconst createComponents = async <TUID extends UID.Schema, TData extends Input<TUID>>(\n uid: TUID,\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data) || !contentTypesUtils.isComponentAttribute(attribute)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData];\n\n if (componentValue === null) {\n continue;\n }\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n createComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await createComponent(\n componentUID,\n componentValue as Input<UID.Component>\n );\n\n componentBody[attributeName] = {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[\n attributeName as keyof TData\n ] as Modules.EntityService.Params.Attribute.GetValue<Schema.Attribute.DynamicZone>;\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const createDynamicZoneComponents = async (\n value: Utils.Array.Values<typeof dynamiczoneValues>\n ) => {\n const { id } = await createComponent(value.__component, value);\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n };\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(\n dynamiczoneValues,\n createDynamicZoneComponents\n );\n\n continue;\n }\n }\n\n return componentBody;\n};\n\nconst getComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entity: { id: Modules.EntityService.Params.Attribute.ID }\n): Promise<LoadedComponents<TUID>> => {\n const componentAttributes = contentTypesUtils.getComponentAttributes(strapi.getModel(uid));\n\n if (_.isEmpty(componentAttributes)) {\n return {} as LoadedComponents<TUID>;\n }\n\n return strapi.db.query(uid).load(entity, componentAttributes) as Promise<LoadedComponents<TUID>>;\n};\n\n/*\n delete old components\n create or update\n*/\nconst updateComponents = async <TUID extends UID.Schema, TData extends Partial<Input<TUID>>>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n for (const attributeName of Object.keys(attributes)) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData] as ComponentValue;\n\n await deleteOldComponents(uid, componentUID, entityToUpdate, attributeName, componentValue);\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n updateOrCreateComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.filter(_.negate(_.isNil)).map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await updateOrCreateComponent(componentUID, componentValue);\n componentBody[attributeName] = component && {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[attributeName as keyof TData] as DynamicZoneValue;\n\n await deleteOldDZComponents(uid, entityToUpdate, attributeName, dynamiczoneValues);\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(dynamiczoneValues, async (value: any) => {\n const { id } = await updateOrCreateComponent(value.__component, value);\n\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n });\n }\n }\n\n return componentBody;\n};\n\nconst pickStringifiedId = ({\n id,\n}: {\n id: Modules.EntityService.Params.Attribute.ID;\n}): Modules.EntityService.Params.Attribute.ID & string => {\n if (typeof id === 'string') {\n return id;\n }\n\n return `${id}`;\n};\n\nconst deleteOldComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n componentUID: UID.Component,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n componentValue: ComponentValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as ComponentValue;\n\n const idsToKeep = _.castArray(componentValue).filter(has('id')).map(pickStringifiedId);\n const allIds = _.castArray(previousValue).filter(has('id')).map(pickStringifiedId);\n\n idsToKeep.forEach((id) => {\n if (!allIds.includes(id)) {\n throw new errors.ApplicationError(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n }\n });\n\n const idsToDelete = _.difference(allIds, idsToKeep);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n await deleteComponent(componentUID, { id: idToDelete });\n }\n }\n};\n\nconst deleteOldDZComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n dynamiczoneValues: DynamicZoneValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as DynamicZoneValue;\n\n const idsToKeep = _.castArray(dynamiczoneValues)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n const allIds = _.castArray(previousValue)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n idsToKeep.forEach(({ id, __component }) => {\n if (!allIds.find((el) => el.id === id && el.__component === __component)) {\n const err = new Error(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n\n Object.assign(err, { status: 400 });\n throw err;\n }\n });\n\n type IdsToDelete = DynamicZoneValue;\n\n const idsToDelete = allIds.reduce((acc, { id, __component }) => {\n if (!idsToKeep.find((el) => el.id === id && el.__component === __component)) {\n acc.push({ id, __component });\n }\n\n return acc;\n }, [] as IdsToDelete);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n const { id, __component } = idToDelete;\n await deleteComponent(__component, { id });\n }\n }\n};\n\nconst deleteComponents = async <TUID extends UID.Schema, TEntity extends Data.Entity<TUID>>(\n uid: TUID,\n entityToDelete: TEntity,\n { loadComponents = true } = {}\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute.type === 'component' || attribute.type === 'dynamiczone') {\n let value;\n\n if (loadComponents) {\n value = await strapi.db.query(uid).load(entityToDelete, attributeName);\n } else {\n value = entityToDelete[attributeName as keyof TEntity];\n }\n\n if (!value) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID } = attribute;\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(componentUID, subValue)\n );\n } else {\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(subValue.__component, subValue)\n );\n }\n\n continue;\n }\n }\n};\n\n/** *************************\n Component queries\n************************** */\n\n// components can have nested compos so this must be recursive\nconst createComponent = async <TUID extends UID.Component>(uid: TUID, data: Input<TUID>) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await createComponents(uid, data);\n\n const transform = pipe(\n // Make sure we don't save the component with a pre-defined ID\n omit('id'),\n assignComponentData(schema, componentData)\n );\n\n return strapi.db.query(uid).create({ data: transform(data) });\n};\n\n// components can have nested compos so this must be recursive\nconst updateComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: Input<TUID>\n) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await updateComponents(uid, componentToUpdate, data);\n\n return strapi.db.query(uid).update({\n where: {\n id: componentToUpdate.id,\n },\n data: assignComponentData(schema, componentData, data),\n });\n};\n\nconst updateOrCreateComponent = <TUID extends UID.Component>(\n componentUID: TUID,\n value: Input<TUID>\n) => {\n if (value === null) {\n return null;\n }\n\n // update\n if ('id' in value && typeof value.id !== 'undefined') {\n // TODO: verify the compo is associated with the entity\n return updateComponent(componentUID, { id: value.id }, value);\n }\n\n // create\n return createComponent(componentUID, value);\n};\n\nconst deleteComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToDelete: Data.Component<TUID>\n) => {\n await deleteComponents(uid, componentToDelete);\n await strapi.db.query(uid).delete({ where: { id: componentToDelete.id } });\n};\n\nconst assignComponentData = curry(\n (schema: Schema.Schema, componentData: ComponentBody, data: Input<UID.Schema>) => {\n return pipe(omitComponentData(schema), assign(componentData))(data);\n }\n);\n\nexport {\n omitComponentData,\n assignComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n deleteComponent,\n};\n"],"names":["curry","contentTypesUtils","omit","has","async","_","errors","pipe","assign"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"components.js","sources":["../../../src/services/document-service/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, omit, pipe, assign, curry } from 'lodash/fp';\nimport type { Utils, UID, Schema, Data, Modules } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async, errors } from '@strapi/utils';\n\n// type aliases for readability\ntype Input<T extends UID.Schema> = Modules.Documents.Params.Data.Input<T>;\n\ntype LoadedComponents<TUID extends UID.Schema> = Data.Entity<\n TUID,\n Schema.AttributeNamesByType<TUID, 'component' | 'dynamiczone'>\n>;\n\ntype SingleComponentValue = Schema.Attribute.ComponentValue<UID.Component, false>;\ntype RepeatableComponentValue = Schema.Attribute.ComponentValue<UID.Component, true>;\n\ntype ComponentValue = SingleComponentValue | RepeatableComponentValue;\n\ntype DynamicZoneValue = Schema.Attribute.DynamicZoneValue<UID.Component[]>;\n\ntype ComponentBody = {\n [key: string]: ComponentValue | DynamicZoneValue;\n};\n\nconst omitComponentData = curry(\n (schema: Schema.Schema, data: Input<UID.Schema>): Partial<Input<UID.Schema>> => {\n const { attributes } = schema;\n const componentAttributes = Object.keys(attributes).filter((attributeName) =>\n contentTypesUtils.isComponentAttribute(attributes[attributeName])\n );\n\n return omit(componentAttributes, data);\n }\n);\n\n// NOTE: we could generalize the logic to allow CRUD of relation directly in the DB layer\nconst createComponents = async <TUID extends UID.Schema, TData extends Input<TUID>>(\n uid: TUID,\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data) || !contentTypesUtils.isComponentAttribute(attribute)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData];\n\n if (componentValue === null) {\n continue;\n }\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n createComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await createComponent(\n componentUID,\n componentValue as Input<UID.Component>\n );\n\n componentBody[attributeName] = {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[\n attributeName as keyof TData\n ] as Modules.EntityService.Params.Attribute.GetValue<Schema.Attribute.DynamicZone>;\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const createDynamicZoneComponents = async (\n value: Utils.Array.Values<typeof dynamiczoneValues>\n ) => {\n const { id } = await createComponent(value.__component, value);\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n };\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(\n dynamiczoneValues,\n createDynamicZoneComponents\n );\n\n continue;\n }\n }\n\n return componentBody;\n};\n\nconst getComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entity: { id: Modules.EntityService.Params.Attribute.ID }\n): Promise<LoadedComponents<TUID>> => {\n const componentAttributes = contentTypesUtils.getComponentAttributes(strapi.getModel(uid));\n\n if (_.isEmpty(componentAttributes)) {\n return {} as LoadedComponents<TUID>;\n }\n\n return strapi.db.query(uid).load(entity, componentAttributes) as Promise<LoadedComponents<TUID>>;\n};\n\n/*\n delete old components\n create or update\n*/\nconst updateComponents = async <TUID extends UID.Schema, TData extends Partial<Input<TUID>>>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n for (const attributeName of Object.keys(attributes)) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData] as ComponentValue;\n\n await deleteOldComponents(uid, componentUID, entityToUpdate, attributeName, componentValue);\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n updateOrCreateComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.filter(_.negate(_.isNil)).map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await updateOrCreateComponent(componentUID, componentValue);\n componentBody[attributeName] = component && {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[attributeName as keyof TData] as DynamicZoneValue;\n\n await deleteOldDZComponents(uid, entityToUpdate, attributeName, dynamiczoneValues);\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(dynamiczoneValues, async (value: any) => {\n const { id } = await updateOrCreateComponent(value.__component, value);\n\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n });\n }\n }\n\n return componentBody;\n};\n\nconst pickStringifiedId = ({\n id,\n}: {\n id: Modules.EntityService.Params.Attribute.ID;\n}): Modules.EntityService.Params.Attribute.ID & string => {\n if (typeof id === 'string') {\n return id;\n }\n\n return `${id}`;\n};\n\nconst deleteOldComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n componentUID: UID.Component,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n componentValue: ComponentValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as ComponentValue;\n\n const idsToKeep = _.castArray(componentValue).filter(has('id')).map(pickStringifiedId);\n const allIds = _.castArray(previousValue).filter(has('id')).map(pickStringifiedId);\n\n idsToKeep.forEach((id) => {\n if (!allIds.includes(id)) {\n throw new errors.ApplicationError(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n }\n });\n\n const idsToDelete = _.difference(allIds, idsToKeep);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n await deleteComponent(componentUID, { id: idToDelete });\n }\n }\n};\n\nconst deleteOldDZComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n dynamiczoneValues: DynamicZoneValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as DynamicZoneValue;\n\n const idsToKeep = _.castArray(dynamiczoneValues)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n const allIds = _.castArray(previousValue)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n idsToKeep.forEach(({ id, __component }) => {\n if (!allIds.find((el) => el.id === id && el.__component === __component)) {\n const err = new Error(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n\n Object.assign(err, { status: 400 });\n throw err;\n }\n });\n\n type IdsToDelete = DynamicZoneValue;\n\n const idsToDelete = allIds.reduce((acc, { id, __component }) => {\n if (!idsToKeep.find((el) => el.id === id && el.__component === __component)) {\n acc.push({ id, __component });\n }\n\n return acc;\n }, [] as IdsToDelete);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n const { id, __component } = idToDelete;\n await deleteComponent(__component, { id });\n }\n }\n};\n\nconst deleteComponents = async <TUID extends UID.Schema, TEntity extends Data.Entity<TUID>>(\n uid: TUID,\n entityToDelete: TEntity,\n { loadComponents = true } = {}\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute.type === 'component' || attribute.type === 'dynamiczone') {\n let value;\n\n if (loadComponents) {\n value = await strapi.db.query(uid).load(entityToDelete, attributeName);\n } else {\n value = entityToDelete[attributeName as keyof TEntity];\n }\n\n if (!value) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID } = attribute;\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(componentUID, subValue)\n );\n } else {\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(subValue.__component, subValue)\n );\n }\n\n continue;\n }\n }\n};\n\n/** *************************\n Component queries\n************************** */\n\n// components can have nested compos so this must be recursive\nconst createComponent = async <TUID extends UID.Component>(uid: TUID, data: Input<TUID>) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await createComponents(uid, data);\n\n const transform = pipe(\n // Make sure we don't save the component with a pre-defined ID\n omit('id'),\n assignComponentData(schema, componentData)\n );\n\n return strapi.db.query(uid).create({ data: transform(data) });\n};\n\n// components can have nested compos so this must be recursive\nconst updateComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: Input<TUID>\n) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await updateComponents(uid, componentToUpdate, data);\n\n return strapi.db.query(uid).update({\n where: {\n id: componentToUpdate.id,\n },\n data: assignComponentData(schema, componentData, data),\n });\n};\n\nconst updateOrCreateComponent = <TUID extends UID.Component>(\n componentUID: TUID,\n value: Input<TUID>\n) => {\n if (value === null) {\n return null;\n }\n\n // update\n if ('id' in value && typeof value.id !== 'undefined') {\n // TODO: verify the compo is associated with the entity\n return updateComponent(componentUID, { id: value.id }, value);\n }\n\n // create\n return createComponent(componentUID, value);\n};\n\nconst deleteComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToDelete: Data.Component<TUID>\n) => {\n await deleteComponents(uid, componentToDelete);\n await strapi.db.query(uid).delete({ where: { id: componentToDelete.id } });\n};\n\nconst assignComponentData = curry(\n (schema: Schema.Schema, componentData: ComponentBody, data: Input<UID.Schema>) => {\n return pipe(omitComponentData(schema), assign(componentData))(data);\n }\n);\n\nexport {\n omitComponentData,\n assignComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n deleteComponent,\n};\n"],"names":["curry","contentTypesUtils","omit","has","async","_","errors","pipe","assign"],"mappings":";;;;;;;AAwBA,MAAM,oBAAoBA,GAAA;AAAA,EACxB,CAAC,QAAuB,SAAwD;AACxE,UAAA,EAAE,eAAe;AACvB,UAAM,sBAAsB,OAAO,KAAK,UAAU,EAAE;AAAA,MAAO,CAAC,kBAC1DC,YAAA,aAAkB,qBAAqB,WAAW,aAAa,CAAC;AAAA,IAClE;AAEO,WAAAC,GAAA,KAAK,qBAAqB,IAAI;AAAA,EAAA;AAEzC;AAGM,MAAA,mBAAmB,OACvB,KACA,SACG;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAE/C,QAAM,gBAA+B,CAAC;AAEhC,QAAA,iBAAiB,OAAO,KAAK,UAAU;AAE7C,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,YAAY,WAAW,aAAa;AAEtC,QAAA,CAACC,GAAAA,IAAI,eAAe,IAAI,KAAK,CAACF,yBAAkB,qBAAqB,SAAS,GAAG;AACnF;AAAA,IAAA;AAGE,QAAA,UAAU,SAAS,aAAa;AAClC,YAAM,EAAE,WAAW,cAAc,aAAa,MAAU,IAAA;AAElD,YAAA,iBAAiB,KAAK,aAA4B;AAExD,UAAI,mBAAmB,MAAM;AAC3B;AAAA,MAAA;AAGF,UAAI,eAAe,MAAM;AACvB,YAAI,CAAC,MAAM,QAAQ,cAAc,GAAG;AAC5B,gBAAA,IAAI,MAAM,kDAAkD;AAAA,QAAA;AAG9D,cAAA,aAAuC,MAAMG,YAAAA,MAAM;AAAA,UAAI;AAAA,UAAgB,CAAC,UAC5E,gBAAgB,cAAc,KAAK;AAAA,QACrC;AAEA,sBAAc,aAAa,IAAI,WAAW,IAAI,CAAC,EAAE,SAAS;AACjD,iBAAA;AAAA,YACL;AAAA,YACA,SAAS;AAAA,cACP,OAAO;AAAA,cACP,gBAAgB;AAAA,YAAA;AAAA,UAEpB;AAAA,QAAA,CACD;AAAA,MAAA,OACI;AACL,cAAM,YAAY,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAEA,sBAAc,aAAa,IAAI;AAAA,UAC7B,IAAI,UAAU;AAAA,UACd,SAAS;AAAA,YACP,OAAO;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,QAEpB;AAAA,MAAA;AAGF;AAAA,IAAA;AAGE,QAAA,UAAU,SAAS,eAAe;AAC9B,YAAA,oBAAoB,KACxB,aACF;AAEA,UAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AAC/B,cAAA,IAAI,MAAM,kDAAkD;AAAA,MAAA;AAG9D,YAAA,8BAA8B,OAClC,UACG;AACH,cAAM,EAAE,GAAG,IAAI,MAAM,gBAAgB,MAAM,aAAa,KAAK;AACtD,eAAA;AAAA,UACL;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,SAAS;AAAA,YACP,OAAO;AAAA,UAAA;AAAA,QAEX;AAAA,MACF;AAGc,oBAAA,aAAa,IAAI,MAAMA,YAAAA,MAAM;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAEA;AAAA,IAAA;AAAA,EACF;AAGK,SAAA;AACT;AAEM,MAAA,gBAAgB,OACpB,KACA,WACoC;AACpC,QAAM,sBAAsBH,YAAAA,aAAkB,uBAAuB,OAAO,SAAS,GAAG,CAAC;AAErF,MAAAI,WAAA,QAAE,QAAQ,mBAAmB,GAAG;AAClC,WAAO,CAAC;AAAA,EAAA;AAGV,SAAO,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,QAAQ,mBAAmB;AAC9D;AAMA,MAAM,mBAAmB,OACvB,KACA,gBACA,SACG;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAE/C,QAAM,gBAA+B,CAAC;AAEtC,aAAW,iBAAiB,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAA,YAAY,WAAW,aAAa;AAE1C,QAAI,CAACF,GAAA,IAAI,eAAe,IAAI,GAAG;AAC7B;AAAA,IAAA;AAGE,QAAA,UAAU,SAAS,aAAa;AAClC,YAAM,EAAE,WAAW,cAAc,aAAa,MAAU,IAAA;AAElD,YAAA,iBAAiB,KAAK,aAA4B;AAExD,YAAM,oBAAoB,KAAK,cAAc,gBAAgB,eAAe,cAAc;AAE1F,UAAI,eAAe,MAAM;AACvB,YAAI,CAAC,MAAM,QAAQ,cAAc,GAAG;AAC5B,gBAAA,IAAI,MAAM,kDAAkD;AAAA,QAAA;AAI9D,cAAA,aAAuC,MAAMC,YAAAA,MAAM;AAAA,UAAI;AAAA,UAAgB,CAAC,UAC5E,wBAAwB,cAAc,KAAK;AAAA,QAC7C;AAEA,sBAAc,aAAa,IAAI,WAAW,OAAOC,WAAAA,QAAE,OAAOA,WAAA,QAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3E,iBAAA;AAAA,YACL;AAAA,YACA,SAAS;AAAA,cACP,OAAO;AAAA,cACP,gBAAgB;AAAA,YAAA;AAAA,UAEpB;AAAA,QAAA,CACD;AAAA,MAAA,OACI;AACL,cAAM,YAAY,MAAM,wBAAwB,cAAc,cAAc;AAC9D,sBAAA,aAAa,IAAI,aAAa;AAAA,UAC1C,IAAI,UAAU;AAAA,UACd,SAAS;AAAA,YACP,OAAO;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,QAEpB;AAAA,MAAA;AAAA,IACF,WACS,UAAU,SAAS,eAAe;AACrC,YAAA,oBAAoB,KAAK,aAA4B;AAE3D,YAAM,sBAAsB,KAAK,gBAAgB,eAAe,iBAAiB;AAEjF,UAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AAC/B,cAAA,IAAI,MAAM,kDAAkD;AAAA,MAAA;AAIpE,oBAAc,aAAa,IAAI,MAAMD,YAAAA,MAAM,IAAI,mBAAmB,OAAO,UAAe;AACtF,cAAM,EAAE,GAAG,IAAI,MAAM,wBAAwB,MAAM,aAAa,KAAK;AAE9D,eAAA;AAAA,UACL;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,SAAS;AAAA,YACP,OAAO;AAAA,UAAA;AAAA,QAEX;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EACH;AAGK,SAAA;AACT;AAEA,MAAM,oBAAoB,CAAC;AAAA,EACzB;AACF,MAE0D;AACpD,MAAA,OAAO,OAAO,UAAU;AACnB,WAAA;AAAA,EAAA;AAGT,SAAO,GAAG,EAAE;AACd;AAEA,MAAM,sBAAsB,OAC1B,KACA,cACA,gBACA,eACA,mBACG;AACG,QAAA,gBAAiB,MAAM,OAAO,GACjC,MAAM,GAAG,EACT,KAAK,gBAAgB,aAAa;AAE/B,QAAA,YAAYC,WAAAA,QAAE,UAAU,cAAc,EAAE,OAAOF,GAAAA,IAAI,IAAI,CAAC,EAAE,IAAI,iBAAiB;AAC/E,QAAA,SAASE,WAAAA,QAAE,UAAU,aAAa,EAAE,OAAOF,GAAAA,IAAI,IAAI,CAAC,EAAE,IAAI,iBAAiB;AAEvE,YAAA,QAAQ,CAAC,OAAO;AACxB,QAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AACxB,YAAM,IAAIG,YAAO,OAAA;AAAA,QACf,sCAAsC,aAAa;AAAA,MACrD;AAAA,IAAA;AAAA,EACF,CACD;AAED,QAAM,cAAcD,WAAA,QAAE,WAAW,QAAQ,SAAS;AAE9C,MAAA,YAAY,SAAS,GAAG;AAC1B,eAAW,cAAc,aAAa;AACpC,YAAM,gBAAgB,cAAc,EAAE,IAAI,YAAY;AAAA,IAAA;AAAA,EACxD;AAEJ;AAEA,MAAM,wBAAwB,OAC5B,KACA,gBACA,eACA,sBACG;AACG,QAAA,gBAAiB,MAAM,OAAO,GACjC,MAAM,GAAG,EACT,KAAK,gBAAgB,aAAa;AAErC,QAAM,YAAYA,WAAAA,QAAE,UAAU,iBAAiB,EAC5C,OAAOF,GAAI,IAAA,IAAI,CAAC,EAChB,IAAI,CAAC,OAAO;AAAA,IACX,IAAI,kBAAkB,CAAC;AAAA,IACvB,aAAa,EAAE;AAAA,EAAA,EACf;AAEJ,QAAM,SAASE,WAAAA,QAAE,UAAU,aAAa,EACrC,OAAOF,GAAI,IAAA,IAAI,CAAC,EAChB,IAAI,CAAC,OAAO;AAAA,IACX,IAAI,kBAAkB,CAAC;AAAA,IACvB,aAAa,EAAE;AAAA,EAAA,EACf;AAEJ,YAAU,QAAQ,CAAC,EAAE,IAAI,kBAAkB;AACrC,QAAA,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,GAAG,gBAAgB,WAAW,GAAG;AACxE,YAAM,MAAM,IAAI;AAAA,QACd,sCAAsC,aAAa;AAAA,MACrD;AAEA,aAAO,OAAO,KAAK,EAAE,QAAQ,KAAK;AAC5B,YAAA;AAAA,IAAA;AAAA,EACR,CACD;AAIK,QAAA,cAAc,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,kBAAkB;AAC1D,QAAA,CAAC,UAAU,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,GAAG,gBAAgB,WAAW,GAAG;AAC3E,UAAI,KAAK,EAAE,IAAI,YAAA,CAAa;AAAA,IAAA;AAGvB,WAAA;AAAA,EACT,GAAG,EAAiB;AAEhB,MAAA,YAAY,SAAS,GAAG;AAC1B,eAAW,cAAc,aAAa;AAC9B,YAAA,EAAE,IAAI,YAAA,IAAgB;AAC5B,YAAM,gBAAgB,aAAa,EAAE,IAAI;AAAA,IAAA;AAAA,EAC3C;AAEJ;AAEM,MAAA,mBAAmB,OACvB,KACA,gBACA,EAAE,iBAAiB,KAAS,IAAA,OACzB;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAEzC,QAAA,iBAAiB,OAAO,KAAK,UAAU;AAE7C,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,YAAY,WAAW,aAAa;AAE1C,QAAI,UAAU,SAAS,eAAe,UAAU,SAAS,eAAe;AAClE,UAAA;AAEJ,UAAI,gBAAgB;AACV,gBAAA,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,gBAAgB,aAAa;AAAA,MAAA,OAChE;AACL,gBAAQ,eAAe,aAA8B;AAAA,MAAA;AAGvD,UAAI,CAAC,OAAO;AACV;AAAA,MAAA;AAGE,UAAA,UAAU,SAAS,aAAa;AAC5B,cAAA,EAAE,WAAW,aAAA,IAAiB;AACpC,cAAMC,YAAM,MAAA;AAAA,UAAIC,WAAA,QAAE,UAAU,KAAK;AAAA,UAAG,CAAC,aACnC,gBAAgB,cAAc,QAAQ;AAAA,QACxC;AAAA,MAAA,OACK;AACL,cAAMD,YAAM,MAAA;AAAA,UAAIC,WAAA,QAAE,UAAU,KAAK;AAAA,UAAG,CAAC,aACnC,gBAAgB,SAAS,aAAa,QAAQ;AAAA,QAChD;AAAA,MAAA;AAGF;AAAA,IAAA;AAAA,EACF;AAEJ;AAOA,MAAM,kBAAkB,OAAmC,KAAW,SAAsB;AACpF,QAAA,SAAS,OAAO,SAAS,GAAG;AAElC,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,IAAI;AAEtD,QAAM,YAAYE,GAAA;AAAA;AAAA,IAEhBL,GAAAA,KAAK,IAAI;AAAA,IACT,oBAAoB,QAAQ,aAAa;AAAA,EAC3C;AAEO,SAAA,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,IAAI,GAAG;AAC9D;AAGA,MAAM,kBAAkB,OACtB,KACA,mBACA,SACG;AACG,QAAA,SAAS,OAAO,SAAS,GAAG;AAElC,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,mBAAmB,IAAI;AAEzE,SAAO,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO;AAAA,IACjC,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,IACxB;AAAA,IACA,MAAM,oBAAoB,QAAQ,eAAe,IAAI;AAAA,EAAA,CACtD;AACH;AAEA,MAAM,0BAA0B,CAC9B,cACA,UACG;AACH,MAAI,UAAU,MAAM;AACX,WAAA;AAAA,EAAA;AAIT,MAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,aAAa;AAEpD,WAAO,gBAAgB,cAAc,EAAE,IAAI,MAAM,MAAM,KAAK;AAAA,EAAA;AAIvD,SAAA,gBAAgB,cAAc,KAAK;AAC5C;AAEM,MAAA,kBAAkB,OACtB,KACA,sBACG;AACG,QAAA,iBAAiB,KAAK,iBAAiB;AAC7C,QAAM,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,kBAAkB,MAAM;AAC3E;AAEA,MAAM,sBAAsBF,GAAA;AAAA,EAC1B,CAAC,QAAuB,eAA8B,SAA4B;AACzE,WAAAO,GAAAA,KAAK,kBAAkB,MAAM,GAAGC,GAAAA,OAAO,aAAa,CAAC,EAAE,IAAI;AAAA,EAAA;AAEtE;;;;;;;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"components.mjs","sources":["../../../src/services/document-service/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, omit, pipe, assign, curry } from 'lodash/fp';\nimport type { Utils, UID, Schema, Data, Modules } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async, errors } from '@strapi/utils';\n\n// type aliases for readability\ntype Input<T extends UID.Schema> = Modules.Documents.Params.Data.Input<T>;\n\ntype LoadedComponents<TUID extends UID.Schema> = Data.Entity<\n TUID,\n Schema.AttributeNamesByType<TUID, 'component' | 'dynamiczone'>\n>;\n\ntype SingleComponentValue = Schema.Attribute.ComponentValue<UID.Component, false>;\ntype RepeatableComponentValue = Schema.Attribute.ComponentValue<UID.Component, true>;\n\ntype ComponentValue = SingleComponentValue | RepeatableComponentValue;\n\ntype DynamicZoneValue = Schema.Attribute.DynamicZoneValue<UID.Component[]>;\n\ntype ComponentBody = {\n [key: string]: ComponentValue | DynamicZoneValue;\n};\n\nconst omitComponentData = curry(\n (schema: Schema.Schema, data: Input<UID.Schema>): Partial<Input<UID.Schema>> => {\n const { attributes } = schema;\n const componentAttributes = Object.keys(attributes).filter((attributeName) =>\n contentTypesUtils.isComponentAttribute(attributes[attributeName])\n );\n\n return omit(componentAttributes, data);\n }\n);\n\n// NOTE: we could generalize the logic to allow CRUD of relation directly in the DB layer\nconst createComponents = async <TUID extends UID.Schema, TData extends Input<TUID>>(\n uid: TUID,\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data) || !contentTypesUtils.isComponentAttribute(attribute)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData];\n\n if (componentValue === null) {\n continue;\n }\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n createComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await createComponent(\n componentUID,\n componentValue as Input<UID.Component>\n );\n\n componentBody[attributeName] = {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[\n attributeName as keyof TData\n ] as Modules.EntityService.Params.Attribute.GetValue<Schema.Attribute.DynamicZone>;\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const createDynamicZoneComponents = async (\n value: Utils.Array.Values<typeof dynamiczoneValues>\n ) => {\n const { id } = await createComponent(value.__component, value);\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n };\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(\n dynamiczoneValues,\n createDynamicZoneComponents\n );\n\n continue;\n }\n }\n\n return componentBody;\n};\n\nconst getComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entity: { id: Modules.EntityService.Params.Attribute.ID }\n): Promise<LoadedComponents<TUID>> => {\n const componentAttributes = contentTypesUtils.getComponentAttributes(strapi.getModel(uid));\n\n if (_.isEmpty(componentAttributes)) {\n return {} as LoadedComponents<TUID>;\n }\n\n return strapi.db.query(uid).load(entity, componentAttributes) as Promise<LoadedComponents<TUID>>;\n};\n\n/*\n delete old components\n create or update\n*/\nconst updateComponents = async <TUID extends UID.Schema, TData extends Partial<Input<TUID>>>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n for (const attributeName of Object.keys(attributes)) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData] as ComponentValue;\n\n await deleteOldComponents(uid, componentUID, entityToUpdate, attributeName, componentValue);\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n updateOrCreateComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.filter(_.negate(_.isNil)).map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await updateOrCreateComponent(componentUID, componentValue);\n componentBody[attributeName] = component && {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[attributeName as keyof TData] as DynamicZoneValue;\n\n await deleteOldDZComponents(uid, entityToUpdate, attributeName, dynamiczoneValues);\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(dynamiczoneValues, async (value: any) => {\n const { id } = await updateOrCreateComponent(value.__component, value);\n\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n });\n }\n }\n\n return componentBody;\n};\n\nconst pickStringifiedId = ({\n id,\n}: {\n id: Modules.EntityService.Params.Attribute.ID;\n}): Modules.EntityService.Params.Attribute.ID & string => {\n if (typeof id === 'string') {\n return id;\n }\n\n return `${id}`;\n};\n\nconst deleteOldComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n componentUID: UID.Component,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n componentValue: ComponentValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as ComponentValue;\n\n const idsToKeep = _.castArray(componentValue).filter(has('id')).map(pickStringifiedId);\n const allIds = _.castArray(previousValue).filter(has('id')).map(pickStringifiedId);\n\n idsToKeep.forEach((id) => {\n if (!allIds.includes(id)) {\n throw new errors.ApplicationError(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n }\n });\n\n const idsToDelete = _.difference(allIds, idsToKeep);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n await deleteComponent(componentUID, { id: idToDelete });\n }\n }\n};\n\nconst deleteOldDZComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n dynamiczoneValues: DynamicZoneValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as DynamicZoneValue;\n\n const idsToKeep = _.castArray(dynamiczoneValues)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n const allIds = _.castArray(previousValue)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n idsToKeep.forEach(({ id, __component }) => {\n if (!allIds.find((el) => el.id === id && el.__component === __component)) {\n const err = new Error(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n\n Object.assign(err, { status: 400 });\n throw err;\n }\n });\n\n type IdsToDelete = DynamicZoneValue;\n\n const idsToDelete = allIds.reduce((acc, { id, __component }) => {\n if (!idsToKeep.find((el) => el.id === id && el.__component === __component)) {\n acc.push({ id, __component });\n }\n\n return acc;\n }, [] as IdsToDelete);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n const { id, __component } = idToDelete;\n await deleteComponent(__component, { id });\n }\n }\n};\n\nconst deleteComponents = async <TUID extends UID.Schema, TEntity extends Data.Entity<TUID>>(\n uid: TUID,\n entityToDelete: TEntity,\n { loadComponents = true } = {}\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute.type === 'component' || attribute.type === 'dynamiczone') {\n let value;\n\n if (loadComponents) {\n value = await strapi.db.query(uid).load(entityToDelete, attributeName);\n } else {\n value = entityToDelete[attributeName as keyof TEntity];\n }\n\n if (!value) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID } = attribute;\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(componentUID, subValue)\n );\n } else {\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(subValue.__component, subValue)\n );\n }\n\n continue;\n }\n }\n};\n\n/** *************************\n Component queries\n************************** */\n\n// components can have nested compos so this must be recursive\nconst createComponent = async <TUID extends UID.Component>(uid: TUID, data: Input<TUID>) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await createComponents(uid, data);\n\n const transform = pipe(\n // Make sure we don't save the component with a pre-defined ID\n omit('id'),\n assignComponentData(schema, componentData)\n );\n\n return strapi.db.query(uid).create({ data: transform(data) });\n};\n\n// components can have nested compos so this must be recursive\nconst updateComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: Input<TUID>\n) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await updateComponents(uid, componentToUpdate, data);\n\n return strapi.db.query(uid).update({\n where: {\n id: componentToUpdate.id,\n },\n data: assignComponentData(schema, componentData, data),\n });\n};\n\nconst updateOrCreateComponent = <TUID extends UID.Component>(\n componentUID: TUID,\n value: Input<TUID>\n) => {\n if (value === null) {\n return null;\n }\n\n // update\n if ('id' in value && typeof value.id !== 'undefined') {\n // TODO: verify the compo is associated with the entity\n return updateComponent(componentUID, { id: value.id }, value);\n }\n\n // create\n return createComponent(componentUID, value);\n};\n\nconst deleteComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToDelete: Data.Component<TUID>\n) => {\n await deleteComponents(uid, componentToDelete);\n await strapi.db.query(uid).delete({ where: { id: componentToDelete.id } });\n};\n\nconst assignComponentData = curry(\n (schema: Schema.Schema, componentData: ComponentBody, data: Input<UID.Schema>) => {\n return pipe(omitComponentData(schema), assign(componentData))(data);\n }\n);\n\nexport {\n omitComponentData,\n assignComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n deleteComponent,\n};\n"],"names":["contentTypesUtils"],"mappings":";;;AAwBA,MAAM,oBAAoB;AAAA,EACxB,CAAC,QAAuB,SAAwD;AACxE,UAAA,EAAE,WAAe,IAAA;AACvB,UAAM,sBAAsB,OAAO,KAAK,UAAU,EAAE;AAAA,MAAO,CAAC,kBAC1DA,aAAkB,qBAAqB,WAAW,aAAa,CAAC;AAAA,IAAA;AAG3D,WAAA,KAAK,qBAAqB,IAAI;AAAA,EACvC;AACF;AAGM,MAAA,mBAAmB,OACvB,KACA,SACG;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAE/C,QAAM,gBAA+B,CAAA;AAE/B,QAAA,iBAAiB,OAAO,KAAK,UAAU;AAE7C,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,YAAY,WAAW,aAAa;AAEtC,QAAA,CAAC,IAAI,eAAe,IAAI,KAAK,CAACA,aAAkB,qBAAqB,SAAS,GAAG;AACnF;AAAA,IACF;AAEI,QAAA,UAAU,SAAS,aAAa;AAClC,YAAM,EAAE,WAAW,cAAc,aAAa,UAAU;AAElD,YAAA,iBAAiB,KAAK,aAA4B;AAExD,UAAI,mBAAmB,MAAM;AAC3B;AAAA,MACF;AAEA,UAAI,eAAe,MAAM;AACvB,YAAI,CAAC,MAAM,QAAQ,cAAc,GAAG;AAC5B,gBAAA,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEM,cAAA,aAAuC,MAAM,MAAM;AAAA,UAAI;AAAA,UAAgB,CAAC,UAC5E,gBAAgB,cAAc,KAAK;AAAA,QAAA;AAGrC,sBAAc,aAAa,IAAI,WAAW,IAAI,CAAC,EAAE,SAAS;AACjD,iBAAA;AAAA,YACL;AAAA,YACA,SAAS;AAAA,cACP,OAAO;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA,OACI;AACL,cAAM,YAAY,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,QAAA;AAGF,sBAAc,aAAa,IAAI;AAAA,UAC7B,IAAI,UAAU;AAAA,UACd,SAAS;AAAA,YACP,OAAO;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,QAAA;AAAA,MAEJ;AAEA;AAAA,IACF;AAEI,QAAA,UAAU,SAAS,eAAe;AAC9B,YAAA,oBAAoB,KACxB,aACF;AAEA,UAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AAC/B,cAAA,IAAI,MAAM,kDAAkD;AAAA,MACpE;AAEM,YAAA,8BAA8B,OAClC,UACG;AACH,cAAM,EAAE,GAAG,IAAI,MAAM,gBAAgB,MAAM,aAAa,KAAK;AACtD,eAAA;AAAA,UACL;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,SAAS;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QAAA;AAAA,MACF;AAIY,oBAAA,aAAa,IAAI,MAAM,MAAM;AAAA,QACzC;AAAA,QACA;AAAA,MAAA;AAGF;AAAA,IACF;AAAA,EACF;AAEO,SAAA;AACT;AAEM,MAAA,gBAAgB,OACpB,KACA,WACoC;AACpC,QAAM,sBAAsBA,aAAkB,uBAAuB,OAAO,SAAS,GAAG,CAAC;AAErF,MAAA,EAAE,QAAQ,mBAAmB,GAAG;AAClC,WAAO;EACT;AAEA,SAAO,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,QAAQ,mBAAmB;AAC9D;AAMA,MAAM,mBAAmB,OACvB,KACA,gBACA,SACG;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAE/C,QAAM,gBAA+B,CAAA;AAErC,aAAW,iBAAiB,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAA,YAAY,WAAW,aAAa;AAE1C,QAAI,CAAC,IAAI,eAAe,IAAI,GAAG;AAC7B;AAAA,IACF;AAEI,QAAA,UAAU,SAAS,aAAa;AAClC,YAAM,EAAE,WAAW,cAAc,aAAa,UAAU;AAElD,YAAA,iBAAiB,KAAK,aAA4B;AAExD,YAAM,oBAAoB,KAAK,cAAc,gBAAgB,eAAe,cAAc;AAE1F,UAAI,eAAe,MAAM;AACvB,YAAI,CAAC,MAAM,QAAQ,cAAc,GAAG;AAC5B,gBAAA,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAGM,cAAA,aAAuC,MAAM,MAAM;AAAA,UAAI;AAAA,UAAgB,CAAC,UAC5E,wBAAwB,cAAc,KAAK;AAAA,QAAA;AAG7C,sBAAc,aAAa,IAAI,WAAW,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3E,iBAAA;AAAA,YACL;AAAA,YACA,SAAS;AAAA,cACP,OAAO;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA,OACI;AACL,cAAM,YAAY,MAAM,wBAAwB,cAAc,cAAc;AAC9D,sBAAA,aAAa,IAAI,aAAa;AAAA,UAC1C,IAAI,UAAU;AAAA,UACd,SAAS;AAAA,YACP,OAAO;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA,WACS,UAAU,SAAS,eAAe;AACrC,YAAA,oBAAoB,KAAK,aAA4B;AAE3D,YAAM,sBAAsB,KAAK,gBAAgB,eAAe,iBAAiB;AAEjF,UAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AAC/B,cAAA,IAAI,MAAM,kDAAkD;AAAA,MACpE;AAGA,oBAAc,aAAa,IAAI,MAAM,MAAM,IAAI,mBAAmB,OAAO,UAAe;AACtF,cAAM,EAAE,GAAG,IAAI,MAAM,wBAAwB,MAAM,aAAa,KAAK;AAE9D,eAAA;AAAA,UACL;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,SAAS;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QAAA;AAAA,MACF,CACD;AAAA,IACH;AAAA,EACF;AAEO,SAAA;AACT;AAEA,MAAM,oBAAoB,CAAC;AAAA,EACzB;AACF,MAE0D;AACpD,MAAA,OAAO,OAAO,UAAU;AACnB,WAAA;AAAA,EACT;AAEA,SAAO,GAAG,EAAE;AACd;AAEA,MAAM,sBAAsB,OAC1B,KACA,cACA,gBACA,eACA,mBACG;AACG,QAAA,gBAAiB,MAAM,OAAO,GACjC,MAAM,GAAG,EACT,KAAK,gBAAgB,aAAa;AAE/B,QAAA,YAAY,EAAE,UAAU,cAAc,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,iBAAiB;AAC/E,QAAA,SAAS,EAAE,UAAU,aAAa,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,iBAAiB;AAEvE,YAAA,QAAQ,CAAC,OAAO;AACxB,QAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AACxB,YAAM,IAAI,OAAO;AAAA,QACf,sCAAsC,aAAa;AAAA,MAAA;AAAA,IAEvD;AAAA,EAAA,CACD;AAED,QAAM,cAAc,EAAE,WAAW,QAAQ,SAAS;AAE9C,MAAA,YAAY,SAAS,GAAG;AAC1B,eAAW,cAAc,aAAa;AACpC,YAAM,gBAAgB,cAAc,EAAE,IAAI,WAAY,CAAA;AAAA,IACxD;AAAA,EACF;AACF;AAEA,MAAM,wBAAwB,OAC5B,KACA,gBACA,eACA,sBACG;AACG,QAAA,gBAAiB,MAAM,OAAO,GACjC,MAAM,GAAG,EACT,KAAK,gBAAgB,aAAa;AAErC,QAAM,YAAY,EAAE,UAAU,iBAAiB,EAC5C,OAAO,IAAI,IAAI,CAAC,EAChB,IAAI,CAAC,OAAO;AAAA,IACX,IAAI,kBAAkB,CAAC;AAAA,IACvB,aAAa,EAAE;AAAA,EACf,EAAA;AAEJ,QAAM,SAAS,EAAE,UAAU,aAAa,EACrC,OAAO,IAAI,IAAI,CAAC,EAChB,IAAI,CAAC,OAAO;AAAA,IACX,IAAI,kBAAkB,CAAC;AAAA,IACvB,aAAa,EAAE;AAAA,EACf,EAAA;AAEJ,YAAU,QAAQ,CAAC,EAAE,IAAI,kBAAkB;AACrC,QAAA,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,GAAG,gBAAgB,WAAW,GAAG;AACxE,YAAM,MAAM,IAAI;AAAA,QACd,sCAAsC,aAAa;AAAA,MAAA;AAGrD,aAAO,OAAO,KAAK,EAAE,QAAQ,IAAK,CAAA;AAC5B,YAAA;AAAA,IACR;AAAA,EAAA,CACD;AAIK,QAAA,cAAc,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,kBAAkB;AAC1D,QAAA,CAAC,UAAU,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,GAAG,gBAAgB,WAAW,GAAG;AAC3E,UAAI,KAAK,EAAE,IAAI,YAAa,CAAA;AAAA,IAC9B;AAEO,WAAA;AAAA,EACT,GAAG,CAAiB,CAAA;AAEhB,MAAA,YAAY,SAAS,GAAG;AAC1B,eAAW,cAAc,aAAa;AAC9B,YAAA,EAAE,IAAI,YAAgB,IAAA;AAC5B,YAAM,gBAAgB,aAAa,EAAE,GAAI,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AAEM,MAAA,mBAAmB,OACvB,KACA,gBACA,EAAE,iBAAiB,KAAS,IAAA,OACzB;AACH,QAAM,EAAE,aAAa,OAAO,OAAO,SAAS,GAAG;AAEzC,QAAA,iBAAiB,OAAO,KAAK,UAAU;AAE7C,aAAW,iBAAiB,gBAAgB;AACpC,UAAA,YAAY,WAAW,aAAa;AAE1C,QAAI,UAAU,SAAS,eAAe,UAAU,SAAS,eAAe;AAClE,UAAA;AAEJ,UAAI,gBAAgB;AACV,gBAAA,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,gBAAgB,aAAa;AAAA,MAAA,OAChE;AACL,gBAAQ,eAAe,aAA8B;AAAA,MACvD;AAEA,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEI,UAAA,UAAU,SAAS,aAAa;AAC5B,cAAA,EAAE,WAAW,aAAiB,IAAA;AACpC,cAAM,MAAM;AAAA,UAAI,EAAE,UAAU,KAAK;AAAA,UAAG,CAAC,aACnC,gBAAgB,cAAc,QAAQ;AAAA,QAAA;AAAA,MACxC,OACK;AACL,cAAM,MAAM;AAAA,UAAI,EAAE,UAAU,KAAK;AAAA,UAAG,CAAC,aACnC,gBAAgB,SAAS,aAAa,QAAQ;AAAA,QAAA;AAAA,MAElD;AAEA;AAAA,IACF;AAAA,EACF;AACF;AAOA,MAAM,kBAAkB,OAAmC,KAAW,SAAsB;AACpF,QAAA,SAAS,OAAO,SAAS,GAAG;AAElC,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,IAAI;AAEtD,QAAM,YAAY;AAAA;AAAA,IAEhB,KAAK,IAAI;AAAA,IACT,oBAAoB,QAAQ,aAAa;AAAA,EAAA;AAGpC,SAAA,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,IAAI,EAAG,CAAA;AAC9D;AAGA,MAAM,kBAAkB,OACtB,KACA,mBACA,SACG;AACG,QAAA,SAAS,OAAO,SAAS,GAAG;AAElC,QAAM,gBAAgB,MAAM,iBAAiB,KAAK,mBAAmB,IAAI;AAEzE,SAAO,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO;AAAA,IACjC,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,IACxB;AAAA,IACA,MAAM,oBAAoB,QAAQ,eAAe,IAAI;AAAA,EAAA,CACtD;AACH;AAEA,MAAM,0BAA0B,CAC9B,cACA,UACG;AACH,MAAI,UAAU,MAAM;AACX,WAAA;AAAA,EACT;AAGA,MAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,aAAa;AAEpD,WAAO,gBAAgB,cAAc,EAAE,IAAI,MAAM,GAAA,GAAM,KAAK;AAAA,EAC9D;AAGO,SAAA,gBAAgB,cAAc,KAAK;AAC5C;AAEM,MAAA,kBAAkB,OACtB,KACA,sBACG;AACG,QAAA,iBAAiB,KAAK,iBAAiB;AAC7C,QAAM,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,kBAAkB,GAAA,EAAM,CAAA;AAC3E;AAEA,MAAM,sBAAsB;AAAA,EAC1B,CAAC,QAAuB,eAA8B,SAA4B;AACzE,WAAA,KAAK,kBAAkB,MAAM,GAAG,OAAO,aAAa,CAAC,EAAE,IAAI;AAAA,EACpE;AACF;"}
|
1
|
+
{"version":3,"file":"components.mjs","sources":["../../../src/services/document-service/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, omit, pipe, assign, curry } from 'lodash/fp';\nimport type { Utils, UID, Schema, Data, Modules } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async, errors } from '@strapi/utils';\n\n// type aliases for readability\ntype Input<T extends UID.Schema> = Modules.Documents.Params.Data.Input<T>;\n\ntype LoadedComponents<TUID extends UID.Schema> = Data.Entity<\n TUID,\n Schema.AttributeNamesByType<TUID, 'component' | 'dynamiczone'>\n>;\n\ntype SingleComponentValue = Schema.Attribute.ComponentValue<UID.Component, false>;\ntype RepeatableComponentValue = Schema.Attribute.ComponentValue<UID.Component, true>;\n\ntype ComponentValue = SingleComponentValue | RepeatableComponentValue;\n\ntype DynamicZoneValue = Schema.Attribute.DynamicZoneValue<UID.Component[]>;\n\ntype ComponentBody = {\n [key: string]: ComponentValue | DynamicZoneValue;\n};\n\nconst omitComponentData = curry(\n (schema: Schema.Schema, data: Input<UID.Schema>): Partial<Input<UID.Schema>> => {\n const { attributes } = schema;\n const componentAttributes = Object.keys(attributes).filter((attributeName) =>\n contentTypesUtils.isComponentAttribute(attributes[attributeName])\n );\n\n return omit(componentAttributes, data);\n }\n);\n\n// NOTE: we could generalize the logic to allow CRUD of relation directly in the DB layer\nconst createComponents = async <TUID extends UID.Schema, TData extends Input<TUID>>(\n uid: TUID,\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data) || !contentTypesUtils.isComponentAttribute(attribute)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData];\n\n if (componentValue === null) {\n continue;\n }\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n createComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await createComponent(\n componentUID,\n componentValue as Input<UID.Component>\n );\n\n componentBody[attributeName] = {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[\n attributeName as keyof TData\n ] as Modules.EntityService.Params.Attribute.GetValue<Schema.Attribute.DynamicZone>;\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n const createDynamicZoneComponents = async (\n value: Utils.Array.Values<typeof dynamiczoneValues>\n ) => {\n const { id } = await createComponent(value.__component, value);\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n };\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(\n dynamiczoneValues,\n createDynamicZoneComponents\n );\n\n continue;\n }\n }\n\n return componentBody;\n};\n\nconst getComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entity: { id: Modules.EntityService.Params.Attribute.ID }\n): Promise<LoadedComponents<TUID>> => {\n const componentAttributes = contentTypesUtils.getComponentAttributes(strapi.getModel(uid));\n\n if (_.isEmpty(componentAttributes)) {\n return {} as LoadedComponents<TUID>;\n }\n\n return strapi.db.query(uid).load(entity, componentAttributes) as Promise<LoadedComponents<TUID>>;\n};\n\n/*\n delete old components\n create or update\n*/\nconst updateComponents = async <TUID extends UID.Schema, TData extends Partial<Input<TUID>>>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: TData\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const componentBody: ComponentBody = {};\n\n for (const attributeName of Object.keys(attributes)) {\n const attribute = attributes[attributeName];\n\n if (!has(attributeName, data)) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID, repeatable = false } = attribute;\n\n const componentValue = data[attributeName as keyof TData] as ComponentValue;\n\n await deleteOldComponents(uid, componentUID, entityToUpdate, attributeName, componentValue);\n\n if (repeatable === true) {\n if (!Array.isArray(componentValue)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n const components: RepeatableComponentValue = await async.map(componentValue, (value: any) =>\n updateOrCreateComponent(componentUID, value)\n );\n\n componentBody[attributeName] = components.filter(_.negate(_.isNil)).map(({ id }) => {\n return {\n id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n });\n } else {\n const component = await updateOrCreateComponent(componentUID, componentValue);\n componentBody[attributeName] = component && {\n id: component.id,\n __pivot: {\n field: attributeName,\n component_type: componentUID,\n },\n };\n }\n } else if (attribute.type === 'dynamiczone') {\n const dynamiczoneValues = data[attributeName as keyof TData] as DynamicZoneValue;\n\n await deleteOldDZComponents(uid, entityToUpdate, attributeName, dynamiczoneValues);\n\n if (!Array.isArray(dynamiczoneValues)) {\n throw new Error('Expected an array to create repeatable component');\n }\n\n // MySQL/MariaDB can cause deadlocks here if concurrency higher than 1\n componentBody[attributeName] = await async.map(dynamiczoneValues, async (value: any) => {\n const { id } = await updateOrCreateComponent(value.__component, value);\n\n return {\n id,\n __component: value.__component,\n __pivot: {\n field: attributeName,\n },\n };\n });\n }\n }\n\n return componentBody;\n};\n\nconst pickStringifiedId = ({\n id,\n}: {\n id: Modules.EntityService.Params.Attribute.ID;\n}): Modules.EntityService.Params.Attribute.ID & string => {\n if (typeof id === 'string') {\n return id;\n }\n\n return `${id}`;\n};\n\nconst deleteOldComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n componentUID: UID.Component,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n componentValue: ComponentValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as ComponentValue;\n\n const idsToKeep = _.castArray(componentValue).filter(has('id')).map(pickStringifiedId);\n const allIds = _.castArray(previousValue).filter(has('id')).map(pickStringifiedId);\n\n idsToKeep.forEach((id) => {\n if (!allIds.includes(id)) {\n throw new errors.ApplicationError(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n }\n });\n\n const idsToDelete = _.difference(allIds, idsToKeep);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n await deleteComponent(componentUID, { id: idToDelete });\n }\n }\n};\n\nconst deleteOldDZComponents = async <TUID extends UID.Schema>(\n uid: TUID,\n entityToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n attributeName: string,\n dynamiczoneValues: DynamicZoneValue\n) => {\n const previousValue = (await strapi.db\n .query(uid)\n .load(entityToUpdate, attributeName)) as DynamicZoneValue;\n\n const idsToKeep = _.castArray(dynamiczoneValues)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n const allIds = _.castArray(previousValue)\n .filter(has('id'))\n .map((v) => ({\n id: pickStringifiedId(v),\n __component: v.__component,\n }));\n\n idsToKeep.forEach(({ id, __component }) => {\n if (!allIds.find((el) => el.id === id && el.__component === __component)) {\n const err = new Error(\n `Some of the provided components in ${attributeName} are not related to the entity`\n );\n\n Object.assign(err, { status: 400 });\n throw err;\n }\n });\n\n type IdsToDelete = DynamicZoneValue;\n\n const idsToDelete = allIds.reduce((acc, { id, __component }) => {\n if (!idsToKeep.find((el) => el.id === id && el.__component === __component)) {\n acc.push({ id, __component });\n }\n\n return acc;\n }, [] as IdsToDelete);\n\n if (idsToDelete.length > 0) {\n for (const idToDelete of idsToDelete) {\n const { id, __component } = idToDelete;\n await deleteComponent(__component, { id });\n }\n }\n};\n\nconst deleteComponents = async <TUID extends UID.Schema, TEntity extends Data.Entity<TUID>>(\n uid: TUID,\n entityToDelete: TEntity,\n { loadComponents = true } = {}\n) => {\n const { attributes = {} } = strapi.getModel(uid);\n\n const attributeNames = Object.keys(attributes);\n\n for (const attributeName of attributeNames) {\n const attribute = attributes[attributeName];\n\n if (attribute.type === 'component' || attribute.type === 'dynamiczone') {\n let value;\n\n if (loadComponents) {\n value = await strapi.db.query(uid).load(entityToDelete, attributeName);\n } else {\n value = entityToDelete[attributeName as keyof TEntity];\n }\n\n if (!value) {\n continue;\n }\n\n if (attribute.type === 'component') {\n const { component: componentUID } = attribute;\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(componentUID, subValue)\n );\n } else {\n await async.map(_.castArray(value), (subValue: any) =>\n deleteComponent(subValue.__component, subValue)\n );\n }\n\n continue;\n }\n }\n};\n\n/** *************************\n Component queries\n************************** */\n\n// components can have nested compos so this must be recursive\nconst createComponent = async <TUID extends UID.Component>(uid: TUID, data: Input<TUID>) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await createComponents(uid, data);\n\n const transform = pipe(\n // Make sure we don't save the component with a pre-defined ID\n omit('id'),\n assignComponentData(schema, componentData)\n );\n\n return strapi.db.query(uid).create({ data: transform(data) });\n};\n\n// components can have nested compos so this must be recursive\nconst updateComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToUpdate: { id: Modules.EntityService.Params.Attribute.ID },\n data: Input<TUID>\n) => {\n const schema = strapi.getModel(uid);\n\n const componentData = await updateComponents(uid, componentToUpdate, data);\n\n return strapi.db.query(uid).update({\n where: {\n id: componentToUpdate.id,\n },\n data: assignComponentData(schema, componentData, data),\n });\n};\n\nconst updateOrCreateComponent = <TUID extends UID.Component>(\n componentUID: TUID,\n value: Input<TUID>\n) => {\n if (value === null) {\n return null;\n }\n\n // update\n if ('id' in value && typeof value.id !== 'undefined') {\n // TODO: verify the compo is associated with the entity\n return updateComponent(componentUID, { id: value.id }, value);\n }\n\n // create\n return createComponent(componentUID, value);\n};\n\nconst deleteComponent = async <TUID extends UID.Component>(\n uid: TUID,\n componentToDelete: Data.Component<TUID>\n) => {\n await deleteComponents(uid, componentToDelete);\n await strapi.db.query(uid).delete({ where: { id: componentToDelete.id } });\n};\n\nconst assignComponentData = curry(\n (schema: Schema.Schema, componentData: ComponentBody, data: Input<UID.Schema>) => {\n return pipe(omitComponentData(schema), assign(componentData))(data);\n }\n);\n\nexport {\n omitComponentData,\n assignComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n deleteComponent,\n};\n"],"names":["contentTypesUtils"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"draft-and-publish.js","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":["contentTypes","assoc","curry"],"mappings":";;;;AAgBA,MAAM,mBAA6C,CAAC,aAAa,WAAW;AAC1E,MAAI,CAACA,YAAa,aAAA,mBAAmB,WAAW,KAAK,OAAO,QAAQ;AAC3D,WAAA;AAAA,
|
1
|
+
{"version":3,"file":"draft-and-publish.js","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":["contentTypes","assoc","curry"],"mappings":";;;;AAgBA,MAAM,mBAA6C,CAAC,aAAa,WAAW;AAC1E,MAAI,CAACA,YAAa,aAAA,mBAAmB,WAAW,KAAK,OAAO,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAGF,SAAAC,SAAM,UAAU,SAAS,MAAM;AACxC;AAKA,MAAM,iBAAkC,CAAC,WAAW;AAElD,MAAI,CAAC,OAAO,UAAU,OAAO,WAAW,aAAa;AAC5C,WAAAA,SAAM,UAAU,SAAS,MAAM;AAAA,EAAA;AAGjC,SAAA;AACT;AAMA,MAAM,gBAA0C,CAAC,aAAa,WAAW;AACvE,MAAI,CAACD,YAAA,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAA;AAAA,EAAA;AAIT,MAAI,CAAC,OAAO,UAAU,OAAO,WAAW,aAAa;AACnD,WAAO,eAAe,MAAM;AAAA,EAAA;AAGvB,SAAA;AACT;AAKA,MAAM,wBAAyC,CAAC,WAAW;AACrD,MAAA,QAAQ,MAAM,aAAa;AAC7B,WAAOC,GAAAA,MAAM,CAAC,QAAQ,aAAa,GAAG,MAAM,MAAM;AAAA,EAAA;AAG7C,SAAA;AACT;AAKA,MAAM,iBAA2C,CAAC,aAAa,WAAW;AACxE,MAAI,CAACD,YAAA,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAA;AAAA,EAAA;AAGH,QAAA,SAAS,OAAO,UAAU,CAAC;AAEjC,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACI,aAAAC,GAAA,MAAM,CAAC,UAAU,aAAa,GAAG,EAAE,UAAU,KAAK,GAAG,MAAM;AAAA,IACpE,KAAK;AACI,aAAAA,GAAA,MAAM,CAAC,UAAU,aAAa,GAAG,EAAE,OAAO,KAAK,GAAG,MAAM;AAAA,EAE/D;AAGG,SAAAA,SAAM,UAAU,QAAQ,MAAM;AACvC;AAKA,MAAM,eAAyC,CAAC,aAAa,WAAW;AACtE,MAAI,CAACD,YAAA,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAAC,GAAAA,MAAM,CAAC,QAAQ,aAAa,GAAO,oBAAA,QAAQ,MAAM;AAAA,EAAA;AAG1D,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACI,aAAAA,GAAAA,MAAM,CAAC,QAAQ,aAAa,GAAO,oBAAA,QAAQ,MAAM;AAAA,IAC1D,KAAK;AACH,aAAOA,GAAAA,MAAM,CAAC,QAAQ,aAAa,GAAG,MAAM,MAAM;AAAA,EAElD;AAGG,SAAA;AACT;AAEM,MAAA,wBAAwBC,SAAM,gBAAgB;AAC9C,MAAA,sBAAsBA,SAAM,cAAc;AAC1C,MAAA,qBAAqBA,SAAM,aAAa;AACxC,MAAA,6BAA6BA,SAAM,qBAAqB;AACxD,MAAA,sBAAsBA,SAAM,cAAc;AAC1C,MAAA,oBAAoBA,SAAM,YAAY;;;;;;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":[],"mappings":";;AAgBA,MAAM,mBAA6C,CAAC,aAAa,WAAW;AAC1E,MAAI,CAAC,aAAa,mBAAmB,WAAW,KAAK,OAAO,QAAQ;AAC3D,WAAA;AAAA,
|
1
|
+
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":[],"mappings":";;AAgBA,MAAM,mBAA6C,CAAC,aAAa,WAAW;AAC1E,MAAI,CAAC,aAAa,mBAAmB,WAAW,KAAK,OAAO,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAGF,SAAA,MAAM,UAAU,SAAS,MAAM;AACxC;AAKA,MAAM,iBAAkC,CAAC,WAAW;AAElD,MAAI,CAAC,OAAO,UAAU,OAAO,WAAW,aAAa;AAC5C,WAAA,MAAM,UAAU,SAAS,MAAM;AAAA,EAAA;AAGjC,SAAA;AACT;AAMA,MAAM,gBAA0C,CAAC,aAAa,WAAW;AACvE,MAAI,CAAC,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAA;AAAA,EAAA;AAIT,MAAI,CAAC,OAAO,UAAU,OAAO,WAAW,aAAa;AACnD,WAAO,eAAe,MAAM;AAAA,EAAA;AAGvB,SAAA;AACT;AAKA,MAAM,wBAAyC,CAAC,WAAW;AACrD,MAAA,QAAQ,MAAM,aAAa;AAC7B,WAAO,MAAM,CAAC,QAAQ,aAAa,GAAG,MAAM,MAAM;AAAA,EAAA;AAG7C,SAAA;AACT;AAKA,MAAM,iBAA2C,CAAC,aAAa,WAAW;AACxE,MAAI,CAAC,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAA;AAAA,EAAA;AAGH,QAAA,SAAS,OAAO,UAAU,CAAC;AAEjC,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACI,aAAA,MAAM,CAAC,UAAU,aAAa,GAAG,EAAE,UAAU,KAAK,GAAG,MAAM;AAAA,IACpE,KAAK;AACI,aAAA,MAAM,CAAC,UAAU,aAAa,GAAG,EAAE,OAAO,KAAK,GAAG,MAAM;AAAA,EAE/D;AAGG,SAAA,MAAM,UAAU,QAAQ,MAAM;AACvC;AAKA,MAAM,eAAyC,CAAC,aAAa,WAAW;AACtE,MAAI,CAAC,aAAa,mBAAmB,WAAW,GAAG;AAC1C,WAAA,MAAM,CAAC,QAAQ,aAAa,GAAO,oBAAA,QAAQ,MAAM;AAAA,EAAA;AAG1D,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACI,aAAA,MAAM,CAAC,QAAQ,aAAa,GAAO,oBAAA,QAAQ,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,MAAM,CAAC,QAAQ,aAAa,GAAG,MAAM,MAAM;AAAA,EAElD;AAGG,SAAA;AACT;AAEM,MAAA,wBAAwB,MAAM,gBAAgB;AAC9C,MAAA,sBAAsB,MAAM,cAAc;AAC1C,MAAA,qBAAqB,MAAM,aAAa;AACxC,MAAA,6BAA6B,MAAM,qBAAqB;AACxD,MAAA,sBAAsB,MAAM,cAAc;AAC1C,MAAA,oBAAoB,MAAM,YAAY;"}
|