@strapi/strapi 4.26.1 → 4.26.2
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.map +1 -1
- package/dist/Strapi.mjs.map +1 -1
- package/dist/admin.js.map +1 -1
- package/dist/admin.mjs.map +1 -1
- package/dist/commands/actions/admin/create-user/action.js.map +1 -1
- package/dist/commands/actions/admin/reset-user-password/action.js.map +1 -1
- package/dist/commands/actions/admin/reset-user-password/command.js.map +1 -1
- package/dist/commands/actions/components/list/action.js.map +1 -1
- package/dist/commands/actions/components/list/command.js.map +1 -1
- package/dist/commands/actions/configuration/dump/action.js.map +1 -1
- package/dist/commands/actions/configuration/dump/command.js.map +1 -1
- package/dist/commands/actions/configuration/restore/action.js +1 -2
- package/dist/commands/actions/configuration/restore/action.js.map +1 -1
- package/dist/commands/actions/configuration/restore/command.js.map +1 -1
- package/dist/commands/actions/console/action.js.map +1 -1
- package/dist/commands/actions/console/command.js.map +1 -1
- package/dist/commands/actions/content-types/list/action.js.map +1 -1
- package/dist/commands/actions/content-types/list/command.js.map +1 -1
- package/dist/commands/actions/controllers/list/action.js.map +1 -1
- package/dist/commands/actions/controllers/list/command.js.map +1 -1
- package/dist/commands/actions/generate/command.js.map +1 -1
- package/dist/commands/actions/hooks/list/action.js.map +1 -1
- package/dist/commands/actions/hooks/list/command.js.map +1 -1
- package/dist/commands/actions/install/action.js.map +1 -1
- package/dist/commands/actions/install/command.js.map +1 -1
- package/dist/commands/actions/middlewares/list/action.js.map +1 -1
- package/dist/commands/actions/middlewares/list/command.js.map +1 -1
- package/dist/commands/actions/new/action.js.map +1 -1
- package/dist/commands/actions/new/command.js.map +1 -1
- package/dist/commands/actions/plugin/build-command/action.js.map +1 -1
- package/dist/commands/actions/plugin/build-command/command.js.map +1 -1
- package/dist/commands/actions/plugin/init/action.js.map +1 -1
- package/dist/commands/actions/plugin/init/command.js.map +1 -1
- package/dist/commands/actions/plugin/init/files/admin.js.map +1 -1
- package/dist/commands/actions/plugin/init/files/server.js.map +1 -1
- package/dist/commands/actions/plugin/init/files/typescript.js.map +1 -1
- package/dist/commands/actions/plugin/link-watch/action.js.map +1 -1
- package/dist/commands/actions/plugin/verify/action.js.map +1 -1
- package/dist/commands/actions/plugin/watch/action.js.map +1 -1
- package/dist/commands/actions/policies/list/action.js.map +1 -1
- package/dist/commands/actions/policies/list/command.js.map +1 -1
- package/dist/commands/actions/report/action.js.map +1 -1
- package/dist/commands/actions/report/command.js.map +1 -1
- package/dist/commands/actions/routes/list/action.js.map +1 -1
- package/dist/commands/actions/routes/list/command.js.map +1 -1
- package/dist/commands/actions/services/list/action.js.map +1 -1
- package/dist/commands/actions/services/list/command.js.map +1 -1
- package/dist/commands/actions/start/action.js.map +1 -1
- package/dist/commands/actions/start/command.js.map +1 -1
- package/dist/commands/actions/telemetry/disable/action.js.map +1 -1
- package/dist/commands/actions/telemetry/disable/command.js.map +1 -1
- package/dist/commands/actions/telemetry/enable/action.js.map +1 -1
- package/dist/commands/actions/telemetry/enable/command.js.map +1 -1
- package/dist/commands/actions/templates/generate/action.js.map +1 -1
- package/dist/commands/actions/templates/generate/command.js.map +1 -1
- package/dist/commands/actions/ts/generate-types/action.js.map +1 -1
- package/dist/commands/actions/ts/generate-types/command.js.map +1 -1
- package/dist/commands/actions/uninstall/action.js.map +1 -1
- package/dist/commands/actions/uninstall/command.js.map +1 -1
- package/dist/commands/actions/version/command.js.map +1 -1
- package/dist/commands/actions/watch-admin/action.js.map +1 -1
- package/dist/commands/actions/watch-admin/command.js.map +1 -1
- package/dist/commands/index.js +60 -60
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/utils/commander.js.map +1 -1
- package/dist/commands/utils/helpers.js.map +1 -1
- package/dist/commands/utils/logger.js +1 -2
- package/dist/commands/utils/logger.js.map +1 -1
- package/dist/commands/utils/pkg.js +1 -2
- package/dist/commands/utils/pkg.js.map +1 -1
- package/dist/commands/utils/tsconfig.js.map +1 -1
- package/dist/compile.js.map +1 -1
- package/dist/compile.mjs.map +1 -1
- package/dist/container.js.map +1 -1
- package/dist/container.mjs.map +1 -1
- package/dist/core/app-configuration/config-loader.js +1 -2
- package/dist/core/app-configuration/config-loader.js.map +1 -1
- package/dist/core/app-configuration/config-loader.mjs +1 -2
- package/dist/core/app-configuration/config-loader.mjs.map +1 -1
- package/dist/core/app-configuration/index.js.map +1 -1
- package/dist/core/app-configuration/index.mjs.map +1 -1
- package/dist/core/app-configuration/load-config-file.js.map +1 -1
- package/dist/core/app-configuration/load-config-file.mjs +1 -1
- package/dist/core/app-configuration/load-config-file.mjs.map +1 -1
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/bootstrap.mjs.map +1 -1
- package/dist/core/domain/content-type/index.js.map +1 -1
- package/dist/core/domain/content-type/index.mjs.map +1 -1
- package/dist/core/domain/content-type/validator.js.map +1 -1
- package/dist/core/domain/content-type/validator.mjs.map +1 -1
- package/dist/core/domain/module/index.js.map +1 -1
- package/dist/core/domain/module/index.mjs.map +1 -1
- package/dist/core/domain/module/validation.js.map +1 -1
- package/dist/core/domain/module/validation.mjs.map +1 -1
- package/dist/core/loaders/admin.js.map +1 -1
- package/dist/core/loaders/admin.mjs.map +1 -1
- package/dist/core/loaders/apis.js.map +1 -1
- package/dist/core/loaders/apis.mjs.map +1 -1
- package/dist/core/loaders/components.js.map +1 -1
- package/dist/core/loaders/components.mjs.map +1 -1
- package/dist/core/loaders/index.js.map +1 -1
- package/dist/core/loaders/index.mjs.map +1 -1
- package/dist/core/loaders/middlewares.js.map +1 -1
- package/dist/core/loaders/middlewares.mjs.map +1 -1
- package/dist/core/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/core/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/core/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/core/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
- package/dist/core/loaders/plugins/index.js.map +1 -1
- package/dist/core/loaders/plugins/index.mjs +1 -1
- package/dist/core/loaders/plugins/index.mjs.map +1 -1
- package/dist/core/loaders/policies.js.map +1 -1
- package/dist/core/loaders/policies.mjs.map +1 -1
- package/dist/core/loaders/sanitizers.js.map +1 -1
- package/dist/core/loaders/sanitizers.mjs.map +1 -1
- package/dist/core/loaders/src-index.js.map +1 -1
- package/dist/core/loaders/src-index.mjs.map +1 -1
- package/dist/core/loaders/validators.js.map +1 -1
- package/dist/core/loaders/validators.mjs.map +1 -1
- package/dist/core/registries/apis.js.map +1 -1
- package/dist/core/registries/apis.mjs.map +1 -1
- package/dist/core/registries/config.js.map +1 -1
- package/dist/core/registries/config.mjs.map +1 -1
- package/dist/core/registries/content-types.js.map +1 -1
- package/dist/core/registries/content-types.mjs +2 -2
- package/dist/core/registries/content-types.mjs.map +1 -1
- package/dist/core/registries/controllers.js.map +1 -1
- package/dist/core/registries/controllers.mjs +2 -2
- package/dist/core/registries/controllers.mjs.map +1 -1
- package/dist/core/registries/custom-fields.js.map +1 -1
- package/dist/core/registries/custom-fields.mjs.map +1 -1
- package/dist/core/registries/hooks.js.map +1 -1
- package/dist/core/registries/hooks.mjs +1 -1
- package/dist/core/registries/hooks.mjs.map +1 -1
- package/dist/core/registries/middlewares.js.map +1 -1
- package/dist/core/registries/middlewares.mjs +2 -2
- package/dist/core/registries/middlewares.mjs.map +1 -1
- package/dist/core/registries/modules.js.map +1 -1
- package/dist/core/registries/modules.mjs +1 -1
- package/dist/core/registries/modules.mjs.map +1 -1
- package/dist/core/registries/plugins.js.map +1 -1
- package/dist/core/registries/plugins.mjs.map +1 -1
- package/dist/core/registries/policies.js.map +1 -1
- package/dist/core/registries/policies.mjs +2 -2
- package/dist/core/registries/policies.mjs.map +1 -1
- package/dist/core/registries/sanitizers.js.map +1 -1
- package/dist/core/registries/sanitizers.mjs.map +1 -1
- package/dist/core/registries/services.js.map +1 -1
- package/dist/core/registries/services.mjs +2 -2
- package/dist/core/registries/services.mjs.map +1 -1
- package/dist/core/registries/validators.js.map +1 -1
- package/dist/core/registries/validators.mjs.map +1 -1
- package/dist/core/utils.js.map +1 -1
- package/dist/core/utils.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 +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/get-fetch-params.js.map +1 -1
- package/dist/core-api/service/get-fetch-params.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 +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 +2 -3
- package/dist/core-api/service/single-type.mjs.map +1 -1
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +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 +4 -4
- package/dist/factories.js.map +1 -1
- package/dist/factories.mjs.map +1 -1
- package/dist/load/filepath-to-prop-path.js.map +1 -1
- package/dist/load/load-files.js +1 -2
- package/dist/load/load-files.js.map +1 -1
- package/dist/load/load-files.mjs +1 -2
- package/dist/load/load-files.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/index.js +1 -2
- package/dist/middlewares/public/index.js.map +1 -1
- package/dist/middlewares/public/index.mjs +1 -2
- package/dist/middlewares/public/index.mjs.map +1 -1
- package/dist/middlewares/public/serve-static.js.map +1 -1
- package/dist/middlewares/public/serve-static.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/draft-publish.js.map +1 -1
- package/dist/migrations/draft-publish.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/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/content-api/permissions/engine.js.map +1 -1
- package/dist/services/content-api/permissions/engine.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/entity-service/attributes/index.js.map +1 -1
- package/dist/services/entity-service/attributes/index.mjs.map +1 -1
- package/dist/services/entity-service/attributes/transforms.js.map +1 -1
- package/dist/services/entity-service/attributes/transforms.mjs.map +1 -1
- package/dist/services/entity-service/components.js.map +1 -1
- package/dist/services/entity-service/components.mjs +1 -1
- package/dist/services/entity-service/components.mjs.map +1 -1
- package/dist/services/entity-service/index.js.map +1 -1
- package/dist/services/entity-service/index.mjs +2 -2
- package/dist/services/entity-service/index.mjs.map +1 -1
- package/dist/services/entity-service/params.js.map +1 -1
- package/dist/services/entity-service/params.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 +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/is-truthy.mjs.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/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 +1 -1
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/compose-endpoint.mjs +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/utils/upload-files.js +2 -4
- package/dist/services/utils/upload-files.js.map +1 -1
- package/dist/services/utils/upload-files.mjs +2 -4
- package/dist/services/utils/upload-files.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/get-dirs.js.map +1 -1
- package/dist/utils/get-dirs.mjs +1 -1
- package/dist/utils/get-dirs.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/machine-id.js.map +1 -1
- package/dist/utils/machine-id.mjs.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/open-browser.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.js.map +1 -1
- package/dist/utils/startup-logger.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 +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-type.js","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":["contentTypes","propOr","getFetchParams","getPaginationInfo","convertPagedToStartLimit","shouldCount","transformPaginationResponse"],"mappings":";;;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"collection-type.js","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":["contentTypes","propOr","getFetchParams","getPaginationInfo","convertPagedToStartLimit","shouldCount","transformPaginationResponse"],"mappings":";;;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAA;AACf,IAAIA,YAAAA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,GAAAA,2BAAW,KAAA,GAAQ,wBAAwB,IAAI;AAChF;AAMA,MAAM,8BAA8B,CAAC;AAAA,EACnC;AACF,MAEsC;AACpC,QAAM,EAAE,QAAQ;AAEhB,SAAY;AAAA,IAAA,gBACVC,eAAAA;AAAAA,IAEA,MAAM,KAAK,SAAS,IAAI;AACtB,YAAM,cAAc,KAAK,eAAe,MAAM;AAE9C,YAAM,iBAAiBC,WAAAA,kBAAkB,WAAW;AAEpD,YAAM,UAAU,MAAM,OAAO,eAAe,SAAS,KAAK;AAAA,QACxD,GAAG;AAAA,QACH,GAAGC,WAAAA,yBAAyB,cAAc;AAAA,MAAA,CAC3C;AAED,UAAIC,WAAAA,YAAY,WAAW,GAAG;AAC5B,cAAM,QAAQ,MAAM,OAAO,eAAe,MAAM,KAAK,EAAE,GAAG,aAAa,GAAG,gBAAgB;AAE1F,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,IAAI,MAAM,0BAA0B;AAAA,QAC5C;AAEA,eAAO;AAAA,UACL;AAAA,UACA,YAAYC,WAAAA,4BAA4B,gBAAgB,KAAK;AAAA,QAAA;AAAA,MAEjE;AAEA,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,IAEhB;AAAA,IAEA,QAAQ,UAAqB,SAAS,IAAI;AACxC,aAAO,OAAO,eAAe,QAAQ,KAAK,UAAU,KAAK,eAAe,MAAM,CAAC;AAAA,IACjF;AAAA,IAEA,OAAO,SAAS,EAAE,MAAM,CAAA,KAAM;AAC5B,YAAM,EAAE,SAAS;AAEjB,UAAI,mBAAmB,WAAW,GAAG;AACnC,uBAAe,IAAI;AAAA,MACrB;AAEA,aAAO,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,IAC9D;AAAA,IAEA,OAAO,UAAqB,SAAS,EAAE,MAAM,CAAA,KAAM;AACjD,YAAM,EAAE,SAAS;AAEjB,aAAO,OAAO,eAAe,OAAO,KAAK,UAAU,EAAE,GAAG,QAAQ,MAAM;AAAA,IACxE;AAAA,IAEA,OAAO,UAAqB,SAAS,IAAI;AACvC,aAAO,OAAO,eAAe,OAAO,KAAK,UAAU,MAAM;AAAA,IAC3D;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-type.mjs","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":[],"mappings":";;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"collection-type.mjs","sources":["../../../src/core-api/service/collection-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { CoreApi, Schema, Entity } from '@strapi/types';\n\nimport {\n getPaginationInfo,\n convertPagedToStartLimit,\n shouldCount,\n transformPaginationResponse,\n} from './pagination';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypes;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n *\n * Returns a collection type service to handle default core-api actions\n */\nconst createCollectionTypeService = ({\n contentType,\n}: {\n contentType: Schema.CollectionType;\n}): CoreApi.Service.CollectionType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n\n async find(params = {}) {\n const fetchParams = this.getFetchParams(params);\n\n const paginationInfo = getPaginationInfo(fetchParams);\n\n const results = await strapi.entityService?.findMany(uid, {\n ...fetchParams,\n ...convertPagedToStartLimit(paginationInfo),\n });\n\n if (shouldCount(fetchParams)) {\n const count = await strapi.entityService?.count(uid, { ...fetchParams, ...paginationInfo });\n\n if (typeof count !== 'number') {\n throw new Error('Count should be a number');\n }\n\n return {\n results,\n pagination: transformPaginationResponse(paginationInfo, count),\n };\n }\n\n return {\n results,\n pagination: paginationInfo,\n };\n },\n\n findOne(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.findOne(uid, entityId, this.getFetchParams(params));\n },\n\n create(params = { data: {} }) {\n const { data } = params;\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n\n return strapi.entityService?.create(uid, { ...params, data });\n },\n\n update(entityId: Entity.ID, params = { data: {} }) {\n const { data } = params;\n\n return strapi.entityService?.update(uid, entityId, { ...params, data });\n },\n\n delete(entityId: Entity.ID, params = {}) {\n return strapi.entityService?.delete(uid, entityId, params);\n },\n };\n};\n\nexport default createCollectionTypeService;\n"],"names":[],"mappings":";;;;AAYA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAA;AACf,IAAI;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAI,2BAAW,KAAA,GAAQ,wBAAwB,IAAI;AAChF;AAMA,MAAM,8BAA8B,CAAC;AAAA,EACnC;AACF,MAEsC;AACpC,QAAM,EAAE,QAAQ;AAEhB,SAAY;AAAA,IACV;AAAA,IAEA,MAAM,KAAK,SAAS,IAAI;AACtB,YAAM,cAAc,KAAK,eAAe,MAAM;AAE9C,YAAM,iBAAiB,kBAAkB,WAAW;AAEpD,YAAM,UAAU,MAAM,OAAO,eAAe,SAAS,KAAK;AAAA,QACxD,GAAG;AAAA,QACH,GAAG,yBAAyB,cAAc;AAAA,MAAA,CAC3C;AAED,UAAI,YAAY,WAAW,GAAG;AAC5B,cAAM,QAAQ,MAAM,OAAO,eAAe,MAAM,KAAK,EAAE,GAAG,aAAa,GAAG,gBAAgB;AAE1F,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,IAAI,MAAM,0BAA0B;AAAA,QAC5C;AAEA,eAAO;AAAA,UACL;AAAA,UACA,YAAY,4BAA4B,gBAAgB,KAAK;AAAA,QAAA;AAAA,MAEjE;AAEA,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,IAEhB;AAAA,IAEA,QAAQ,UAAqB,SAAS,IAAI;AACxC,aAAO,OAAO,eAAe,QAAQ,KAAK,UAAU,KAAK,eAAe,MAAM,CAAC;AAAA,IACjF;AAAA,IAEA,OAAO,SAAS,EAAE,MAAM,CAAA,KAAM;AAC5B,YAAM,EAAE,SAAS;AAEjB,UAAI,mBAAmB,WAAW,GAAG;AACnC,uBAAe,IAAI;AAAA,MACrB;AAEA,aAAO,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,IAC9D;AAAA,IAEA,OAAO,UAAqB,SAAS,EAAE,MAAM,CAAA,KAAM;AACjD,YAAM,EAAE,SAAS;AAEjB,aAAO,OAAO,eAAe,OAAO,KAAK,UAAU,EAAE,GAAG,QAAQ,MAAM;AAAA,IACxE;AAAA,IAEA,OAAO,UAAqB,SAAS,IAAI;AACvC,aAAO,OAAO,eAAe,OAAO,KAAK,UAAU,MAAM;AAAA,IAC3D;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-fetch-params.js","sources":["../../../src/core-api/service/get-fetch-params.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\n\nconst {\n constants: { DP_PUB_STATE_LIVE },\n} = contentTypeUtils;\n\n/**\n * Create default fetch params\n */\nexport const getFetchParams = (params = {}) => {\n return {\n publicationState: DP_PUB_STATE_LIVE,\n ...params,\n };\n};\n"],"names":["contentTypeUtils"],"mappings":";;;AAEA,MAAM;AAAA,EACJ,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get-fetch-params.js","sources":["../../../src/core-api/service/get-fetch-params.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\n\nconst {\n constants: { DP_PUB_STATE_LIVE },\n} = contentTypeUtils;\n\n/**\n * Create default fetch params\n */\nexport const getFetchParams = (params = {}) => {\n return {\n publicationState: DP_PUB_STATE_LIVE,\n ...params,\n };\n};\n"],"names":["contentTypeUtils"],"mappings":";;;AAEA,MAAM;AAAA,EACJ,WAAW,EAAE,kBAAA;AACf,IAAIA,YAAAA;AAKG,MAAM,iBAAiB,CAAC,SAAS,OAAO;AAC7C,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,GAAG;AAAA,EAAA;AAEP;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-fetch-params.mjs","sources":["../../../src/core-api/service/get-fetch-params.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\n\nconst {\n constants: { DP_PUB_STATE_LIVE },\n} = contentTypeUtils;\n\n/**\n * Create default fetch params\n */\nexport const getFetchParams = (params = {}) => {\n return {\n publicationState: DP_PUB_STATE_LIVE,\n ...params,\n };\n};\n"],"names":["contentTypeUtils"],"mappings":";AAEA,MAAM;AAAA,EACJ,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get-fetch-params.mjs","sources":["../../../src/core-api/service/get-fetch-params.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\n\nconst {\n constants: { DP_PUB_STATE_LIVE },\n} = contentTypeUtils;\n\n/**\n * Create default fetch params\n */\nexport const getFetchParams = (params = {}) => {\n return {\n publicationState: DP_PUB_STATE_LIVE,\n ...params,\n };\n};\n"],"names":["contentTypeUtils"],"mappings":";AAEA,MAAM;AAAA,EACJ,WAAW,EAAE,kBAAA;AACf,IAAIA;AAKG,MAAM,iBAAiB,CAAC,SAAS,OAAO;AAC7C,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,GAAG;AAAA,EAAA;AAEP;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/core-api/service/index.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { CoreApi, Schema } from '@strapi/types';\n\nimport createSingleTypeService from './single-type';\nimport createCollectionTypeService from './collection-type';\n\nconst isSingleType = (contentType: Schema.ContentType): contentType is Schema.SingleType =>\n contentTypeUtils.isSingleType(contentType);\n\n/**\n * Returns a core api for the provided model\n */\nfunction createService<T extends Schema.SingleType | Schema.CollectionType>(opts: {\n contentType: T;\n}): T extends Schema.SingleType ? CoreApi.Service.SingleType : CoreApi.Service.CollectionType;\nfunction createService({\n contentType,\n}: {\n contentType: Schema.CollectionType | Schema.SingleType;\n}): CoreApi.Service.SingleType | CoreApi.Service.CollectionType {\n if (isSingleType(contentType)) {\n return createSingleTypeService({ contentType });\n }\n\n return createCollectionTypeService({ contentType });\n}\n\nexport { createService };\n"],"names":["contentTypeUtils","createSingleTypeService","createCollectionTypeService"],"mappings":";;;;;AAMA,MAAM,eAAe,CAAC,gBACpBA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/core-api/service/index.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { CoreApi, Schema } from '@strapi/types';\n\nimport createSingleTypeService from './single-type';\nimport createCollectionTypeService from './collection-type';\n\nconst isSingleType = (contentType: Schema.ContentType): contentType is Schema.SingleType =>\n contentTypeUtils.isSingleType(contentType);\n\n/**\n * Returns a core api for the provided model\n */\nfunction createService<T extends Schema.SingleType | Schema.CollectionType>(opts: {\n contentType: T;\n}): T extends Schema.SingleType ? CoreApi.Service.SingleType : CoreApi.Service.CollectionType;\nfunction createService({\n contentType,\n}: {\n contentType: Schema.CollectionType | Schema.SingleType;\n}): CoreApi.Service.SingleType | CoreApi.Service.CollectionType {\n if (isSingleType(contentType)) {\n return createSingleTypeService({ contentType });\n }\n\n return createCollectionTypeService({ contentType });\n}\n\nexport { createService };\n"],"names":["contentTypeUtils","createSingleTypeService","createCollectionTypeService"],"mappings":";;;;;AAMA,MAAM,eAAe,CAAC,gBACpBA,yBAAiB,aAAa,WAAW;AAQ3C,SAAS,cAAc;AAAA,EACrB;AACF,GAEgE;AAC9D,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAOC,WAAwB,EAAE,aAAa;AAAA,EAChD;AAEA,SAAOC,eAA4B,EAAE,aAAa;AACpD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/core-api/service/index.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { CoreApi, Schema } from '@strapi/types';\n\nimport createSingleTypeService from './single-type';\nimport createCollectionTypeService from './collection-type';\n\nconst isSingleType = (contentType: Schema.ContentType): contentType is Schema.SingleType =>\n contentTypeUtils.isSingleType(contentType);\n\n/**\n * Returns a core api for the provided model\n */\nfunction createService<T extends Schema.SingleType | Schema.CollectionType>(opts: {\n contentType: T;\n}): T extends Schema.SingleType ? CoreApi.Service.SingleType : CoreApi.Service.CollectionType;\nfunction createService({\n contentType,\n}: {\n contentType: Schema.CollectionType | Schema.SingleType;\n}): CoreApi.Service.SingleType | CoreApi.Service.CollectionType {\n if (isSingleType(contentType)) {\n return createSingleTypeService({ contentType });\n }\n\n return createCollectionTypeService({ contentType });\n}\n\nexport { createService };\n"],"names":["contentTypeUtils"],"mappings":";;;AAMA,MAAM,eAAe,CAAC,gBACpBA,aAAiB,aAAa,WAAW;AAQ3C,SAAS,cAAc;AAAA,EACrB;AACF,GAEgE;
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/core-api/service/index.ts"],"sourcesContent":["import { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { CoreApi, Schema } from '@strapi/types';\n\nimport createSingleTypeService from './single-type';\nimport createCollectionTypeService from './collection-type';\n\nconst isSingleType = (contentType: Schema.ContentType): contentType is Schema.SingleType =>\n contentTypeUtils.isSingleType(contentType);\n\n/**\n * Returns a core api for the provided model\n */\nfunction createService<T extends Schema.SingleType | Schema.CollectionType>(opts: {\n contentType: T;\n}): T extends Schema.SingleType ? CoreApi.Service.SingleType : CoreApi.Service.CollectionType;\nfunction createService({\n contentType,\n}: {\n contentType: Schema.CollectionType | Schema.SingleType;\n}): CoreApi.Service.SingleType | CoreApi.Service.CollectionType {\n if (isSingleType(contentType)) {\n return createSingleTypeService({ contentType });\n }\n\n return createCollectionTypeService({ contentType });\n}\n\nexport { createService };\n"],"names":["contentTypeUtils"],"mappings":";;;AAMA,MAAM,eAAe,CAAC,gBACpBA,aAAiB,aAAa,WAAW;AAQ3C,SAAS,cAAc;AAAA,EACrB;AACF,GAEgE;AAC9D,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,wBAAwB,EAAE,aAAa;AAAA,EAChD;AAEA,SAAO,4BAA4B,EAAE,aAAa;AACpD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["toNumber","isPagedPagination","has","errors","isUndefined"],"mappings":";;;;AAgCA,MAAM,yBAAyB,OAAO;AAAA,EACpC,cAAcA,
|
|
1
|
+
{"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["toNumber","isPagedPagination","has","errors","isUndefined"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.mjs","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["isPagedPagination"],"mappings":";;AAgCA,MAAM,yBAAyB,OAAO;AAAA,EACpC,cAAc,SAAS,OAAO,OAAO,IAAI,yBAAyB,EAAE,CAAC;AAAA,EACrE,UAAU,SAAS,OAAO,OAAO,IAAI,mBAAmB,CAAC,KAAK;AAChE;AAKA,MAAM,sBAAsB,CAC1B,OACA,UACA,EAAE,mBAAAA,qBAAoB,
|
|
1
|
+
{"version":3,"file":"pagination.mjs","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, toNumber, isUndefined } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\n/**\n * Should maxLimit be used as the limit or not\n */\nconst shouldApplyMaxLimit = (\n limit: number,\n maxLimit: number | null,\n { isPagedPagination = false } = {}\n) => (!isPagedPagination && limit === -1) || (maxLimit !== null && limit > maxLimit);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination);\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { pagination } = params;\n\n const isPaged = isPagedPagination(pagination);\n const isOffset = isOffsetPagination(pagination);\n\n if (isOffset && isPaged) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Expected either start/limit or page/pageSize'\n );\n }\n\n if (!isOffset && !isPaged) {\n return {\n page: 1,\n pageSize: defaultLimit,\n };\n }\n\n if (isPagedPagination(pagination)) {\n const pageSize = isUndefined(pagination.pageSize)\n ? defaultLimit\n : Math.max(1, toNumber(pagination.pageSize));\n\n return {\n page: Math.max(1, toNumber(pagination.page || 1)),\n pageSize:\n typeof maxLimit === 'number' &&\n shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })\n ? maxLimit\n : Math.max(1, pageSize),\n };\n }\n\n const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);\n\n return {\n start: Math.max(0, toNumber(pagination.start || 0)),\n limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),\n };\n};\n\nconst convertPagedToStartLimit = (paginationInfo: PaginationInfo) => {\n if ('page' in paginationInfo) {\n const { page, pageSize } = paginationInfo;\n return {\n start: (page - 1) * pageSize,\n limit: pageSize,\n };\n }\n\n return paginationInfo;\n};\n\nconst transformPaginationResponse = (paginationInfo: PaginationInfo, count: number) => {\n if ('page' in paginationInfo) {\n return {\n ...paginationInfo,\n pageCount: Math.ceil(count / paginationInfo.pageSize),\n total: count,\n };\n }\n\n return {\n ...paginationInfo,\n total: count,\n };\n};\n\nexport { getPaginationInfo, convertPagedToStartLimit, transformPaginationResponse, shouldCount };\n"],"names":["isPagedPagination"],"mappings":";;AAgCA,MAAM,yBAAyB,OAAO;AAAA,EACpC,cAAc,SAAS,OAAO,OAAO,IAAI,yBAAyB,EAAE,CAAC;AAAA,EACrE,UAAU,SAAS,OAAO,OAAO,IAAI,mBAAmB,CAAC,KAAK;AAChE;AAKA,MAAM,sBAAsB,CAC1B,OACA,UACA,EAAE,mBAAAA,qBAAoB,MAAA,IAAU,CAAA,MAC5B,CAACA,sBAAqB,UAAU,MAAQ,aAAa,QAAQ,QAAQ;AAE3E,MAAM,cAAc,CAAC,WAA8C;AACjE,MAAI,IAAI,wBAAwB,MAAM,GAAG;AACvC,UAAM,YAAY,OAAO,YAAY;AAErC,QAAI,OAAO,cAAc,WAAW;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,cAAc,aAAa;AACpC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,SAAS,SAAS,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,SAAS,SAAS,GAAG;AAC9C,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,OAAO;AAAA,MACf;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO,QAAQ,OAAO,OAAO,IAAI,sBAAsB,IAAI,CAAC;AAC9D;AAEA,MAAM,qBAAqB,CAAC,eAC1B,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU;AACrD,MAAM,oBAAoB,CAAC,eACzB,IAAI,QAAQ,UAAU,KAAK,IAAI,YAAY,UAAU;AAEvD,MAAM,oBAAoB,CAAC,WAA8D;AACvF,QAAM,EAAE,cAAc,SAAA,IAAa,uBAAA;AAEnC,QAAM,EAAE,eAAe;AAEvB,QAAM,UAAU,kBAAkB,UAAU;AAC5C,QAAM,WAAW,mBAAmB,UAAU;AAE9C,MAAI,YAAY,SAAS;AACvB,UAAM,IAAI,OAAO;AAAA,MACf;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAI,CAAC,YAAY,CAAC,SAAS;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EAEd;AAEA,MAAI,kBAAkB,UAAU,GAAG;AACjC,UAAM,WAAW,YAAY,WAAW,QAAQ,IAC5C,eACA,KAAK,IAAI,GAAG,SAAS,WAAW,QAAQ,CAAC;AAE7C,WAAO;AAAA,MACL,MAAM,KAAK,IAAI,GAAG,SAAS,WAAW,QAAQ,CAAC,CAAC;AAAA,MAChD,UACE,OAAO,aAAa,YACpB,oBAAoB,UAAU,UAAU,EAAE,mBAAmB,KAAA,CAAM,IAC/D,WACA,KAAK,IAAI,GAAG,QAAQ;AAAA,IAAA;AAAA,EAE9B;AAEA,QAAM,QAAQ,YAAY,WAAW,KAAK,IAAI,eAAe,SAAS,WAAW,KAAK;AAEtF,SAAO;AAAA,IACL,OAAO,KAAK,IAAI,GAAG,SAAS,WAAW,SAAS,CAAC,CAAC;AAAA,IAClD,OAAO,oBAAoB,OAAO,QAAQ,IAAI,YAAY,KAAK,KAAK,IAAI,GAAG,KAAK;AAAA,EAAA;AAEpF;AAEA,MAAM,2BAA2B,CAAC,mBAAmC;AACnE,MAAI,UAAU,gBAAgB;AAC5B,UAAM,EAAE,MAAM,SAAA,IAAa;AAC3B,WAAO;AAAA,MACL,QAAQ,OAAO,KAAK;AAAA,MACpB,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,SAAO;AACT;AAEA,MAAM,8BAA8B,CAAC,gBAAgC,UAAkB;AACrF,MAAI,UAAU,gBAAgB;AAC5B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAW,KAAK,KAAK,QAAQ,eAAe,QAAQ;AAAA,MACpD,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,EAAA;AAEX;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils","propOr","getFetchParams","errors"],"mappings":";;;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"single-type.js","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils","propOr","getFetchParams","errors"],"mappings":";;;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAA;AACf,IAAIA,YAAAA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAIC,GAAAA,2BAAW,KAAA,GAAQ,wBAAwB,IAAI;AAChF;AAKA,MAAM,0BAA0B,CAAC;AAAA,EAC/B;AACF,MAEkC;AAChC,QAAM,EAAE,QAAQ;AAEhB,SAAY;AAAA,IAAA,gBACVC,eAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAIA,KAAK,SAAS,IAAI;AAChB,aACE,OAAO,eAAe,SAAS,KAA8B,KAAK,eAAe,MAAM,CAAC,KACxF;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,eAAe,EAAE,MAAM,GAAG,OAAA,IAAW,EAAE,MAAM,CAAA,KAAM;AACvD,YAAM,SAAS,MAAM,KAAK,KAAK,EAAE,GAAG,QAAQ,kBAAkB,WAAW;AAEzE,UAAI,CAAC,QAAQ;AACX,cAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE,MAAA;AACtC,YAAI,SAAS,GAAG;AACd,gBAAM,IAAIC,YAAAA,OAAO,gBAAgB,0BAA0B;AAAA,QAC7D;AAEA,YAAI,mBAAmB,WAAW,GAAG;AACnC,yBAAe,IAAI;AAAA,QACrB;AACA,eAAO,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,MAC9D;AAEA,aAAO,OAAO,eAAe,OAAO,KAAK,OAAO,IAAI,EAAE,GAAG,QAAQ,MAAM;AAAA,IACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,OAAO,SAAS,IAAI;AACxB,YAAM,SAAS,MAAM,KAAK,KAAK,MAAM;AAErC,UAAI,CAAC,OAAQ;AAEb,aAAO,OAAO,eAAe,OAAO,KAAK,OAAO,EAAE;AAAA,IACpD;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { propOr } from "lodash/fp";
|
|
2
|
-
import {
|
|
2
|
+
import { contentTypes, errors } from "@strapi/utils";
|
|
3
3
|
import { getFetchParams } from "./get-fetch-params.mjs";
|
|
4
4
|
const {
|
|
5
5
|
hasDraftAndPublish,
|
|
@@ -46,8 +46,7 @@ const createSingleTypeService = ({
|
|
|
46
46
|
*/
|
|
47
47
|
async delete(params = {}) {
|
|
48
48
|
const entity = await this.find(params);
|
|
49
|
-
if (!entity)
|
|
50
|
-
return;
|
|
49
|
+
if (!entity) return;
|
|
51
50
|
return strapi.entityService?.delete(uid, entity.id);
|
|
52
51
|
}
|
|
53
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-type.mjs","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils"],"mappings":";;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"single-type.mjs","sources":["../../../src/core-api/service/single-type.ts"],"sourcesContent":["import { propOr } from 'lodash/fp';\nimport type { CoreApi, Schema, Common } from '@strapi/types';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getFetchParams } from './get-fetch-params';\n\nconst {\n hasDraftAndPublish,\n constants: { PUBLISHED_AT_ATTRIBUTE },\n} = contentTypeUtils;\n\nconst setPublishedAt = (data: Record<string, unknown>) => {\n data[PUBLISHED_AT_ATTRIBUTE] = propOr(new Date(), PUBLISHED_AT_ATTRIBUTE, data);\n};\n\n/**\n * Returns a single type service to handle default core-api actions\n */\nconst createSingleTypeService = ({\n contentType,\n}: {\n contentType: Schema.SingleType;\n}): CoreApi.Service.SingleType => {\n const { uid } = contentType;\n\n return <any>{\n getFetchParams,\n /**\n * Returns singleType content\n */\n find(params = {}) {\n return (\n strapi.entityService?.findMany(uid as Common.UID.SingleType, this.getFetchParams(params)) ??\n null\n );\n },\n\n /**\n * Creates or updates a singleType content\n *\n * @return {Promise}\n */\n async createOrUpdate({ data, ...params } = { data: {} }) {\n const entity = await this.find({ ...params, publicationState: 'preview' });\n\n if (!entity) {\n const count = await strapi.query(uid).count();\n if (count >= 1) {\n throw new errors.ValidationError('singleType.alreadyExists');\n }\n\n if (hasDraftAndPublish(contentType)) {\n setPublishedAt(data);\n }\n return strapi.entityService?.create(uid, { ...params, data });\n }\n\n return strapi.entityService?.update(uid, entity.id, { ...params, data });\n },\n\n /**\n * Deletes the singleType content\n *\n * @return {Promise}\n */\n async delete(params = {}) {\n const entity = await this.find(params);\n\n if (!entity) return;\n\n return strapi.entityService?.delete(uid, entity.id);\n },\n };\n};\n\nexport default createSingleTypeService;\n"],"names":["contentTypeUtils"],"mappings":";;;AAKA,MAAM;AAAA,EACJ;AAAA,EACA,WAAW,EAAE,uBAAA;AACf,IAAIA;AAEJ,MAAM,iBAAiB,CAAC,SAAkC;AACxD,OAAK,sBAAsB,IAAI,2BAAW,KAAA,GAAQ,wBAAwB,IAAI;AAChF;AAKA,MAAM,0BAA0B,CAAC;AAAA,EAC/B;AACF,MAEkC;AAChC,QAAM,EAAE,QAAQ;AAEhB,SAAY;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAIA,KAAK,SAAS,IAAI;AAChB,aACE,OAAO,eAAe,SAAS,KAA8B,KAAK,eAAe,MAAM,CAAC,KACxF;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,eAAe,EAAE,MAAM,GAAG,OAAA,IAAW,EAAE,MAAM,CAAA,KAAM;AACvD,YAAM,SAAS,MAAM,KAAK,KAAK,EAAE,GAAG,QAAQ,kBAAkB,WAAW;AAEzE,UAAI,CAAC,QAAQ;AACX,cAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE,MAAA;AACtC,YAAI,SAAS,GAAG;AACd,gBAAM,IAAI,OAAO,gBAAgB,0BAA0B;AAAA,QAC7D;AAEA,YAAI,mBAAmB,WAAW,GAAG;AACnC,yBAAe,IAAI;AAAA,QACrB;AACA,eAAO,OAAO,eAAe,OAAO,KAAK,EAAE,GAAG,QAAQ,MAAM;AAAA,MAC9D;AAEA,aAAO,OAAO,eAAe,OAAO,KAAK,OAAO,IAAI,EAAE,GAAG,QAAQ,MAAM;AAAA,IACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,OAAO,SAAS,IAAI;AACxB,YAAM,SAAS,MAAM,KAAK,KAAK,MAAM;AAErC,UAAI,CAAC,OAAQ;AAEb,aAAO,OAAO,eAAe,OAAO,KAAK,OAAO,EAAE;AAAA,IACpD;AAAA,EAAA;AAEJ;"}
|
package/dist/ee/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["pick","license","readLicense","verifyLicense","strapi","get","result","LicenseCheckError","fetchLicense","isEqual","shiftCronExpression"],"mappings":";;;;AAOA,MAAM,aAAa,MAAO;AAc1B,MAAM,KAAS;AAAA,EACb,SAAS;AAAA,EACT,aAAa,CAAC;AAChB;AAEA,MAAM,UAAU,CAAC,YAAoB;AAE7B,QAAA,kBAAkB,GAAG,YAAY;AAEvC,KAAG,QAAQ,KAAK,GAAG,OAAO,mBAAmB;AAE7C,KAAG,cAAcA,GAAA,KAAK,cAAc,GAAG,WAAW;AAElD,KAAG,UAAU;AAEb,MAAI,iBAAiB;AAEZ,WAAA,SAAS,KAAK,YAAY;AAAA,EACnC;AACF;AAEA,MAAM,SAAS,MAAM;AAEb,QAAA,kBAAkB,GAAG,YAAY;AAEvC,KAAG,UAAU;AAEb,MAAI,iBAAiB;AAEZ,WAAA,SAAS,KAAK,WAAW;AAAA,EAClC;AACF;AAEA,IAAI,cAAc;AAKlB,MAAM,OAAO,CAAC,YAAoB,WAAoB;AACpD,MAAI,aAAa;AACf;AAAA,EACF;AAEc,gBAAA;AACd,KAAG,SAAS;AAEZ,MAAI,QAAQ,IAAI,mBAAmB,YAAA,MAAkB,QAAQ;AAC3D;AAAA,EACF;AAEI,MAAA;AACF,UAAMC,YAAU,QAAQ,IAAI,kBAAkBC,QAAAA,YAAY,UAAU;AAEpE,QAAID,WAAS;AACR,SAAA,cAAcE,sBAAcF,SAAO;AAC/B;IACT;AAAA,WACO,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAM,OAAO;AAAA,IAAA,OAChB;AACL,cAAQ,kBAAkB;AAAA,IAC5B;AAAA,EACF;AACF;AAOA,MAAM,eAAe,OAAO,EAAE,QAAAG,cAAiC;AACvD,QAAA,EAAE,KAAAC,MAAK,QAAQ,SAAc,IAAA,MAAMD,QAAO,IAAI;AACpD,QAAM,cAAcC;AAEhB,MAAA;AACF,UAAM,aAAa,MAAMD,QAAO,IAC5B,aAAa,oBAAoB,EAClC,MAAM,EAAE,KAAK,iBAAkB,CAAA,EAC/B,OAAO,OAAO,EACd,MAAA,EACA,YAAY,WAAW,EACvB,UAAU,EACV,QACA,EAAA,KAAK,CAACE,YAAiBA,UAAS,KAAK,MAAMA,QAAO,KAAK,IAAIA,OAAO;AAErE,UAAM,yBAAyB,YAAY,eAAe,KAAK,KAAK,IAAQ,IAAA;AAC5E,UAAM,SAIF,EAAE,aAAa,KAAK,IAAM,EAAA;AAExB,UAAA,WAAW,CAAC,UAAiB;AACjC,UAAI,iBAAiBC,QAAAA,qBAAqB,MAAM,kBAAkB,YAAY,SAAS;AACrF,WAAG,QAAQ;AAAA,UACT,GAAG,MAAM,OAAO;AAAA,QAAA;AAElB,eAAO,WAAW;AAAA,MACpB;AAEA,aAAO,QAAQ,MAAM;AACrB,cAAQ,MAAM,OAAO;AAAA,IAAA;AAGnB,QAAA,CAAC,IAAI,aAAa,YAAY;AAC1B,YAAA,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,UAAMN,YAAU,wBACZ,MAAMO,QAAa,aAAA,EAAE,QAAAJ,WAAU,GAAG,YAAY,YAAYA,QAAO,OAAO,IAAI,MAAM,CAAC,EAAE;AAAA,MACnF;AAAA,IAAA,IAEF,WAAW;AAEf,QAAIH,WAAS;AACP,UAAA;AAEI,cAAA,iBAAiBE,sBAAcF,SAAO;AAC5C,cAAM,qBACJ,CAACQ,GAAAA,QAAQ,eAAe,UAAU,GAAG,YAAY,QAAQ,KACzD,eAAe,UAAU,GAAG,YAAY,SACxC,eAAe,SAAS,GAAG,YAAY;AAGzC,WAAG,cAAc;AACjB,cAAM,aAAa,GAAG;AACT;AAGb,YAAI,sBAAsB,YAAY;AACpCL,kBAAO,SAAS,KAAK,WAAW;AAAA,QAClC;AAAA,eACO,OAAO;AACd,YAAI,iBAAiB,OAAO;AAC1B,kBAAQ,MAAM,OAAO;AAAA,QAAA,OAChB;AACL,kBAAQ,kBAAkB;AAAA,QAC5B;AAAA,MACF;AAAA,IAAA,WACS,CAAC,uBAAuB;AACjC,cAAQ,WAAW,KAAK;AAAA,IAC1B;AAEA,QAAI,uBAAuB;AACzB,aAAO,UAAUH,aAAW;AAC5B,YAAM,QAAQG,QAAO,GAAI,aAAa,oBAAoB,EAAE,YAAY,WAAW;AAEnF,UAAI,CAAC,YAAY;AACT,cAAA,OAAO,EAAE,KAAK,kBAAkB,OAAO,KAAK,UAAU,MAAM,EAAA,CAAG;AAAA,MAAA,OAChE;AACL,cAAM,OAAO,EAAE,OAAO,KAAK,UAAU,MAAM,EAAG,CAAA,EAAE,MAAM,EAAE,KAAK,iBAAkB,CAAA;AAAA,MACjF;AAEA,YAAM,MAAM;IACd;AAEA,UAAM,OAAO;AAAA,WACN,OAAO;AAEd,UAAM,SAAS;AAAA,EACjB;AACF;AAEA,MAAM,eAAe,MAAM;AACzB,MAAI,OAAO,GAAG,YAAY,aAAa,aAAa;AAC5C,UAAA,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,iBAAiB,IAAI,KAAK,GAAG,YAAY,QAAQ,EAAE;AAEzD,MAAI,kBAAiB,oBAAI,KAAK,GAAE,WAAW;AACzC,WAAO,QAAQ,kBAAkB;AAAA,EACnC;AAEO;AACT;AAEA,MAAM,eAAe,OAAO,EAAE,QAAAA,cAAiC;AACvD,QAAA,oBACJ,GAAG,YAAY,SAAS;AAAA,EAExB,QAAQ,IAAI,6BAA6B,YAAA,MAAkB;AAE7D,MAAI,CAAC,mBAAmB;AACtB,UAAM,aAAa,EAAE,QAAAA,QAAQ,CAAA;AAC7BA,YAAO,KAAK,IAAI,EAAE,CAACM,yBAAoB,gBAAgB,CAAC,GAAG,aAAA,CAAc;AAAA,EAAA,OACpE;AACD,QAAA,CAAC,GAAG,YAAY,UAAU;AAC5B,aAAO,QAAQ,6CAA6C;AAAA,IAC9D;AAEa;EACf;AACF;AAEA,MAAM,OAAO,MAAM;AAEf,SAAA,GAAG,YAAY,UAAU;AAAA,IAAI,CAAC,YAC5B,OAAO,YAAY,WAAW,UAAU,EAAE,MAAM,QAAQ;AAAA,OACrD;AAET;AAEA,MAAM,MAAM,CAAC,gBAAwB,OAAO,KAAK,CAAC,YAAY,QAAQ,SAAS,WAAW;AAE1F,MAAe,KAAA,OAAO,OAAO;AAAA,EAC3B;AAAA,EACA;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,GAAG;AAAA,EACZ;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,GAAG,YAAY;AAAA,EACxB;AAAA,EAEA,UAAU,OAAO,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA,WAAW,CAAC,gBAAwB,IAAI,WAAW,MAAM;AAAA,EAAA,CAC1D;AACH,CAAC;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["pick","license","readLicense","verifyLicense","strapi","get","result","LicenseCheckError","fetchLicense","isEqual","shiftCronExpression"],"mappings":"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"}
|
package/dist/ee/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isEqual, pick } from "lodash/fp";
|
|
2
2
|
import { readLicense, verifyLicense, LicenseCheckError, fetchLicense } from "./license.mjs";
|
|
3
3
|
import { shiftCronExpression } from "../utils/cron.mjs";
|
|
4
4
|
const ONE_MINUTE = 1e3 * 60;
|
package/dist/ee/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["strapi","get","result"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Strapi } from '@strapi/types';\n\nimport { readLicense, verifyLicense, fetchLicense, LicenseCheckError } from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {},\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key for potential re-enabling during a later check\n ee.licenseInfo = pick('licenseKey', ee.licenseInfo);\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Strapi }) => {\n const { get, commit, rollback } = (await strapi.db?.transaction()) as any;\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db!.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch (error) {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n strapi.cron.add({ [shiftCronExpression('0 0 */12 * * *')]: onlineUpdate });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["strapi","get","result"],"mappings":";;;AAOA,MAAM,aAAa,MAAO;AAc1B,MAAM,KAAS;AAAA,EACb,SAAS;AAAA,EACT,aAAa,CAAA;AACf;AAEA,MAAM,UAAU,CAAC,YAAoB;AAEnC,QAAM,kBAAkB,GAAG,YAAY;AAEvC,KAAG,QAAQ,KAAK,GAAG,OAAO,mBAAmB;AAE7C,KAAG,cAAc,KAAK,cAAc,GAAG,WAAW;AAElD,KAAG,UAAU;AAEb,MAAI,iBAAiB;AAEnB,WAAO,SAAS,KAAK,YAAY;AAAA,EACnC;AACF;AAEA,MAAM,SAAS,MAAM;AAEnB,QAAM,kBAAkB,GAAG,YAAY;AAEvC,KAAG,UAAU;AAEb,MAAI,iBAAiB;AAEnB,WAAO,SAAS,KAAK,WAAW;AAAA,EAClC;AACF;AAEA,IAAI,cAAc;AAKlB,MAAM,OAAO,CAAC,YAAoB,WAAoB;AACpD,MAAI,aAAa;AACf;AAAA,EACF;AAEA,gBAAc;AACd,KAAG,SAAS;AAEZ,MAAI,QAAQ,IAAI,mBAAmB,YAAA,MAAkB,QAAQ;AAC3D;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,QAAQ,IAAI,kBAAkB,YAAY,UAAU;AAEpE,QAAI,SAAS;AACX,SAAG,cAAc,cAAc,OAAO;AACtC,aAAA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAM,OAAO;AAAA,IACvB,OAAO;AACL,cAAQ,kBAAkB;AAAA,IAC5B;AAAA,EACF;AACF;AAOA,MAAM,eAAe,OAAO,EAAE,QAAAA,cAAiC;AAC7D,QAAM,EAAE,KAAAC,MAAK,QAAQ,aAAc,MAAMD,QAAO,IAAI,YAAA;AACpD,QAAM,cAAcC,KAAAA;AAEpB,MAAI;AACF,UAAM,aAAa,MAAMD,QAAO,IAC5B,aAAa,oBAAoB,EAClC,MAAM,EAAE,KAAK,iBAAA,CAAkB,EAC/B,OAAO,OAAO,EACd,MAAA,EACA,YAAY,WAAW,EACvB,UAAA,EACA,UACA,KAAK,CAACE,YAAiBA,UAAS,KAAK,MAAMA,QAAO,KAAK,IAAIA,OAAO;AAErE,UAAM,yBAAyB,YAAY,eAAe,KAAK,KAAK,QAAQ;AAC5E,UAAM,SAIF,EAAE,aAAa,KAAK,MAAI;AAE5B,UAAM,WAAW,CAAC,UAAiB;AACjC,UAAI,iBAAiB,qBAAqB,MAAM,kBAAkB,YAAY,SAAS;AACrF,WAAG,QAAQ;AAAA,UACT,GAAG,MAAM,OAAO;AAAA,QAAA;AAElB,eAAO,WAAW;AAAA,MACpB;AAEA,aAAO,QAAQ,MAAM;AACrB,cAAQ,MAAM,OAAO;AAAA,IACvB;AAEA,QAAI,CAAC,IAAI,aAAa,YAAY;AAChC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,UAAM,UAAU,wBACZ,MAAM,aAAa,EAAE,QAAAF,WAAU,GAAG,YAAY,YAAYA,QAAO,OAAO,IAAI,MAAM,CAAC,EAAE;AAAA,MACnF;AAAA,IAAA,IAEF,WAAW;AAEf,QAAI,SAAS;AACX,UAAI;AAEF,cAAM,iBAAiB,cAAc,OAAO;AAC5C,cAAM,qBACJ,CAAC,QAAQ,eAAe,UAAU,GAAG,YAAY,QAAQ,KACzD,eAAe,UAAU,GAAG,YAAY,SACxC,eAAe,SAAS,GAAG,YAAY;AAGzC,WAAG,cAAc;AACjB,cAAM,aAAa,GAAG;AACtB,qBAAA;AAGA,YAAI,sBAAsB,YAAY;AACpCA,kBAAO,SAAS,KAAK,WAAW;AAAA,QAClC;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,OAAO;AAC1B,kBAAQ,MAAM,OAAO;AAAA,QACvB,OAAO;AACL,kBAAQ,kBAAkB;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,WAAW,CAAC,uBAAuB;AACjC,cAAQ,WAAW,KAAK;AAAA,IAC1B;AAEA,QAAI,uBAAuB;AACzB,aAAO,UAAU,WAAW;AAC5B,YAAM,QAAQA,QAAO,GAAI,aAAa,oBAAoB,EAAE,YAAY,WAAW;AAEnF,UAAI,CAAC,YAAY;AACf,cAAM,OAAO,EAAE,KAAK,kBAAkB,OAAO,KAAK,UAAU,MAAM,GAAG;AAAA,MACvE,OAAO;AACL,cAAM,OAAO,EAAE,OAAO,KAAK,UAAU,MAAM,EAAA,CAAG,EAAE,MAAM,EAAE,KAAK,kBAAkB;AAAA,MACjF;AAEA,YAAM,MAAM,QAAA;AAAA,IACd;AAEA,UAAM,OAAA;AAAA,EACR,SAAS,OAAO;AAEd,UAAM,SAAA;AAAA,EACR;AACF;AAEA,MAAM,eAAe,MAAM;AACzB,MAAI,OAAO,GAAG,YAAY,aAAa,aAAa;AAClD,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,iBAAiB,IAAI,KAAK,GAAG,YAAY,QAAQ,EAAE,QAAA;AAEzD,MAAI,kBAAiB,oBAAI,KAAA,GAAO,WAAW;AACzC,WAAO,QAAQ,kBAAkB;AAAA,EACnC;AAEA,SAAA;AACF;AAEA,MAAM,eAAe,OAAO,EAAE,QAAAA,cAAiC;AAC7D,QAAM,oBACJ,GAAG,YAAY,SAAS;AAAA,EAExB,QAAQ,IAAI,6BAA6B,YAAA,MAAkB;AAE7D,MAAI,CAAC,mBAAmB;AACtB,UAAM,aAAa,EAAE,QAAAA,SAAQ;AAC7BA,YAAO,KAAK,IAAI,EAAE,CAAC,oBAAoB,gBAAgB,CAAC,GAAG,cAAc;AAAA,EAC3E,OAAO;AACL,QAAI,CAAC,GAAG,YAAY,UAAU;AAC5B,aAAO,QAAQ,6CAA6C;AAAA,IAC9D;AAEA,iBAAA;AAAA,EACF;AACF;AAEA,MAAM,OAAO,MAAM;AACjB,SACE,GAAG,YAAY,UAAU;AAAA,IAAI,CAAC,YAC5B,OAAO,YAAY,WAAW,UAAU,EAAE,MAAM,QAAA;AAAA,EAAQ,KACrD,CAAA;AAET;AAEA,MAAM,MAAM,CAAC,gBAAwB,OAAO,KAAK,CAAC,YAAY,QAAQ,SAAS,WAAW;AAE1F,MAAA,KAAe,OAAO,OAAO;AAAA,EAC3B;AAAA,EACA;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,GAAG;AAAA,EACZ;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,GAAG,YAAY;AAAA,EACxB;AAAA,EAEA,UAAU,OAAO,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA,WAAW,CAAC,gBAAwB,IAAI,WAAW,MAAM;AAAA,EAAA,CAC1D;AACH,CAAC;"}
|
package/dist/ee/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Strapi } from '@strapi/types';\n\nimport machineId from '../utils/machine-id';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n ],\n};\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async ({ strapi }: { strapi: Strapi }, key: string, projectId: string) => {\n const response = await strapi\n .fetch(`https://license.strapi.io/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ key, projectId, deviceId: machineId() }),\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError };\n"],"names":["fs","resolve","path","join","crypto"],"mappings":";;;;;;;;;AAcA,MAAM,mBAAmB;AAAA,EACvB,QAAQ,
|
|
1
|
+
{"version":3,"file":"license.js","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Strapi } from '@strapi/types';\n\nimport machineId from '../utils/machine-id';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n ],\n};\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async ({ strapi }: { strapi: Strapi }, key: string, projectId: string) => {\n const response = await strapi\n .fetch(`https://license.strapi.io/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ key, projectId, deviceId: machineId() }),\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError };\n"],"names":["fs","resolve","path","join","crypto"],"mappings":";;;;;;;;;AAcA,MAAM,mBAAmB;AAAA,EACvB,QAAQ,CAAA;AAAA,EACR,QAAQ,CAAA;AAAA,EACR,MAAM;AAAA,IACJ,EAAE,MAAM,MAAA;AAAA;AAAA;AAAA,IAGR,EAAE,MAAM,cAAc,SAAS,EAAE,eAAe,OAAK;AAAA,IACrD,EAAE,MAAM,mBAAA;AAAA,IACR,EAAE,MAAM,uBAAA;AAAA,EAAuB;AAEnC;AAEA,MAAM,YAAYA,YAAAA,QAAG,aAAaC,KAAAA,QAAQ,WAAW,yBAAyB,CAAC;AAE/E,MAAM,0BAA0B,MAAM;AAAA,EACpC,iBAAiB;AAAA,EAEjB,YAAY,SAAiB,iBAAiB,OAAO;AACnD,UAAM,OAAO;AAEb,SAAK,iBAAiB;AAAA,EACxB;AACF;AAEA,MAAM,cAAc,CAAC,cAAsB;AACzC,MAAI;AACF,UAAMC,SAAOC,KAAAA,KAAK,WAAW,aAAa;AAC1C,WAAOH,oBAAG,aAAaE,MAAI,EAAE,SAAA;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS,UAAU;AAC7F,YAAM,MAAM,gEAAgE;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,MAAM,gBAAgB,CAAC,YAAoB;AACzC,QAAM,CAAC,WAAW,aAAa,IAAI,OAAO,KAAK,SAAS,QAAQ,EAAE,WAAW,MAAM,IAAI;AAEvF,MAAI,CAAC,aAAa,CAAC,eAAe;AAChC,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,qBAAqB,OAAO,KAAK,eAAe,QAAQ,EAAE,SAAA;AAEhE,QAAM,SAASE,gBAAAA,QAAO,aAAa,YAAY;AAC/C,SAAO,OAAO,kBAAkB;AAChC,SAAO,IAAA;AAEP,QAAM,WAAW,OAAO,OAAO,WAAW,WAAW,QAAQ;AAE7D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,cAA2B,KAAK,MAAM,kBAAkB;AAE9D,MAAI,CAAC,YAAY,UAAU;AACzB,gBAAY,WAAW,iBAAiB,YAAY,IAAI;AAAA,EAC1D;AAEA,SAAO,OAAO,YAAY,QAAQ;AAClC,SAAO;AACT;AAEA,MAAM,aAAa,MAAM;AACvB,QAAM,IAAI,kBAAkB,+DAA+D,IAAI;AACjG;AAEA,MAAM,eAAe,OAAO,EAAE,UAA8B,KAAa,cAAsB;AAC7F,QAAM,WAAW,MAAM,OACpB,MAAM,mDAAmD;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,EAAE,KAAK,WAAW,UAAU,YAAU,CAAG;AAAA,EAAA,CAC/D,EACA,MAAM,UAAU;AAEnB,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAEvD,MAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,UAAM,EAAE,MAAM,MAAA,IAAU,MAAM,SAAS,KAAA;AAEvC,YAAQ,SAAS,QAAA;AAAA,MACf,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,cAAM,IAAI,kBAAkB,MAAM,OAAO;AAAA,MAC3C,KAAK;AACH,cAAM,IAAI,kBAAkB,mCAAmC;AAAA,MACjE;AACE,mBAAA;AAAA,IAAW;AAAA,EAEjB,OAAO;AACL,eAAA;AAAA,EACF;AACF;;;;;"}
|
package/dist/ee/license.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.mjs","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Strapi } from '@strapi/types';\n\nimport machineId from '../utils/machine-id';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n ],\n};\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async ({ strapi }: { strapi: Strapi }, key: string, projectId: string) => {\n const response = await strapi\n .fetch(`https://license.strapi.io/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ key, projectId, deviceId: machineId() }),\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError };\n"],"names":[],"mappings":";;;;AAcA,MAAM,mBAAmB;AAAA,EACvB,QAAQ,
|
|
1
|
+
{"version":3,"file":"license.mjs","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Strapi } from '@strapi/types';\n\nimport machineId from '../utils/machine-id';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n ],\n};\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async ({ strapi }: { strapi: Strapi }, key: string, projectId: string) => {\n const response = await strapi\n .fetch(`https://license.strapi.io/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ key, projectId, deviceId: machineId() }),\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError };\n"],"names":[],"mappings":";;;;AAcA,MAAM,mBAAmB;AAAA,EACvB,QAAQ,CAAA;AAAA,EACR,QAAQ,CAAA;AAAA,EACR,MAAM;AAAA,IACJ,EAAE,MAAM,MAAA;AAAA;AAAA;AAAA,IAGR,EAAE,MAAM,cAAc,SAAS,EAAE,eAAe,OAAK;AAAA,IACrD,EAAE,MAAM,mBAAA;AAAA,IACR,EAAE,MAAM,uBAAA;AAAA,EAAuB;AAEnC;AAEA,MAAM,YAAY,GAAG,aAAa,QAAQ,WAAW,yBAAyB,CAAC;AAE/E,MAAM,0BAA0B,MAAM;AAAA,EACpC,iBAAiB;AAAA,EAEjB,YAAY,SAAiB,iBAAiB,OAAO;AACnD,UAAM,OAAO;AAEb,SAAK,iBAAiB;AAAA,EACxB;AACF;AAEA,MAAM,cAAc,CAAC,cAAsB;AACzC,MAAI;AACF,UAAM,OAAO,KAAK,WAAW,aAAa;AAC1C,WAAO,GAAG,aAAa,IAAI,EAAE,SAAA;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS,UAAU;AAC7F,YAAM,MAAM,gEAAgE;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,MAAM,gBAAgB,CAAC,YAAoB;AACzC,QAAM,CAAC,WAAW,aAAa,IAAI,OAAO,KAAK,SAAS,QAAQ,EAAE,WAAW,MAAM,IAAI;AAEvF,MAAI,CAAC,aAAa,CAAC,eAAe;AAChC,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,qBAAqB,OAAO,KAAK,eAAe,QAAQ,EAAE,SAAA;AAEhE,QAAM,SAAS,OAAO,aAAa,YAAY;AAC/C,SAAO,OAAO,kBAAkB;AAChC,SAAO,IAAA;AAEP,QAAM,WAAW,OAAO,OAAO,WAAW,WAAW,QAAQ;AAE7D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,cAA2B,KAAK,MAAM,kBAAkB;AAE9D,MAAI,CAAC,YAAY,UAAU;AACzB,gBAAY,WAAW,iBAAiB,YAAY,IAAI;AAAA,EAC1D;AAEA,SAAO,OAAO,YAAY,QAAQ;AAClC,SAAO;AACT;AAEA,MAAM,aAAa,MAAM;AACvB,QAAM,IAAI,kBAAkB,+DAA+D,IAAI;AACjG;AAEA,MAAM,eAAe,OAAO,EAAE,UAA8B,KAAa,cAAsB;AAC7F,QAAM,WAAW,MAAM,OACpB,MAAM,mDAAmD;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,EAAE,KAAK,WAAW,UAAU,YAAU,CAAG;AAAA,EAAA,CAC/D,EACA,MAAM,UAAU;AAEnB,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAEvD,MAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,UAAM,EAAE,MAAM,MAAA,IAAU,MAAM,SAAS,KAAA;AAEvC,YAAQ,SAAS,QAAA;AAAA,MACf,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,cAAM,IAAI,kBAAkB,MAAM,OAAO;AAAA,MAC3C,KAAK;AACH,cAAM,IAAI,kBAAkB,mCAAmC;AAAA,MACjE;AACE,mBAAA;AAAA,IAAW;AAAA,EAEjB,OAAO;AACL,eAAA;AAAA,EACF;AACF;"}
|
package/dist/factories.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const fp = require("lodash/fp");
|
|
4
4
|
const index = require("./core-api/controller/index.js");
|
|
5
|
-
const index$
|
|
6
|
-
const index$
|
|
5
|
+
const index$2 = require("./core-api/service/index.js");
|
|
6
|
+
const index$1 = require("./core-api/routes/index.js");
|
|
7
7
|
const symbols = {
|
|
8
8
|
CustomController: Symbol("StrapiCustomCoreController")
|
|
9
9
|
};
|
|
@@ -40,7 +40,7 @@ const createCoreController = (uid, cfg) => {
|
|
|
40
40
|
};
|
|
41
41
|
function createCoreService(uid, cfg) {
|
|
42
42
|
return ({ strapi: strapi2 }) => {
|
|
43
|
-
const baseService = index$
|
|
43
|
+
const baseService = index$2.createService({ contentType: getContentTypeProxy(strapi2, uid) });
|
|
44
44
|
const userService = typeof cfg === "function" ? cfg({ strapi: strapi2 }) : cfg ?? {};
|
|
45
45
|
for (const methodName of Object.keys(baseService)) {
|
|
46
46
|
if (userService[methodName] === void 0) {
|
|
@@ -60,7 +60,7 @@ function createCoreRouter(uid, cfg) {
|
|
|
60
60
|
get routes() {
|
|
61
61
|
if (!routes) {
|
|
62
62
|
const contentType = strapi.contentType(uid);
|
|
63
|
-
const defaultRoutes = index$
|
|
63
|
+
const defaultRoutes = index$1.createRoutes({ contentType });
|
|
64
64
|
const keys = Object.keys(defaultRoutes);
|
|
65
65
|
keys.forEach((routeName) => {
|
|
66
66
|
const defaultRoute = defaultRoutes[routeName];
|
package/dist/factories.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","createController","createService","createRoutes","pipe","routes","omit","pick"],"mappings":";;;;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;
|
|
1
|
+
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","createController","createService","createRoutes","pipe","routes","omit","pick"],"mappings":";;;;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;AAChB,YAAM,cAAcA,QAAO,YAAY,GAAG;AAC1C,UAAI,QAAQ,aAAa;AACvB,eAAO,YAAY,IAAgC;AAAA,MACrD;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEA,MAAM,uBAAuB,CAI3B,KACA,QACG;AACH,SAAO,CAAC,EAAE,QAAAA,cAAqF;AAC7F,UAAM,iBAAiBC,MAAAA,iBAAiB,EAAE,aAAa,oBAAoBD,SAAQ,GAAG,GAAG;AAEzF,UAAM,WAAW,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAAA,CAAQ,IAAI,OAAQ,CAAA;AAEvE,eAAW,cAAc,OAAO,KAAK,cAAc,GAAyC;AAC1F,UAAI,SAAS,UAAU,MAAM,QAAW;AACtC,iBAAS,UAAU,IAAI,eAAe,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,WAAO,eAAe,UAAU,cAAc;AAE9C,UAAM,WAAW,OAAO,QAAQ;AAChC,QAAI,UAAU;AACZ,aAAO,eAAe,UAAU,QAAQ,kBAAkB;AAAA,QACxD,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAIP,KACA,KACA;AACA,SAAO,CAAC,EAAE,QAAAA,cAA+E;AACvF,UAAM,cAAcE,QAAAA,cAAc,EAAE,aAAa,oBAAoBF,SAAQ,GAAG,GAAG;AAEnF,UAAM,cAAc,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAAA,CAAQ,IAAI,OAAQ,CAAA;AAE1E,eAAW,cAAc,OAAO,KAAK,WAAW,GAAsC;AACpF,UAAI,YAAY,UAAU,MAAM,QAAW;AACzC,oBAAY,UAAU,IAAI,YAAY,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,WAAO,eAAe,aAAa,WAAW;AAC9C,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBACP,KACA,KACuB;AACvB,QAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,QAAQ,OAAO,kBAAkB,OAAO,CAAA;AAC3E,MAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,SAAS;AACX,UAAI,CAAC,QAAQ;AACX,cAAM,cAAc,OAAO,YAAY,GAAG;AAE1C,cAAM,gBAAgBG,QAAAA,aAAa,EAAE,aAAa;AAClD,cAAM,OAAO,OAAO,KAAK,aAAa;AAEtC,aAAK,QAAQ,CAAC,cAAc;AAC1B,gBAAM,eAAe,cAAc,SAAS;AAE5C,iBAAO,OAAO,aAAa,QAAQ,OAAO,SAAS,KAAK,EAAE;AAAA,QAC5D,CAAC;AAED,cAAM,iBAAiBC,GAAAA;AAAAA,UACrB,CAACC,YAAY,SAASC,GAAAA,KAAK,QAAQD,OAAM,IAAIA;AAAAA,UAC7C,CAACA,YAAY,OAAOE,GAAAA,KAAK,MAAMF,OAAM,IAAIA;AAAAA,QAAA,EACzC,aAAa;AAEf,iBAAS,OAAO,OAAO,cAAc;AAAA,MACvC;AAEA,aAAO;AAAA,IACT;AAAA,EAAA;AAEJ;AAEA,MAAM,qBAAqB,CAA8B,eAA2B;AAClF,SAAO,QAAQ,oBAAoB;AACrC;;;;;"}
|
package/dist/factories.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.mjs","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","routes"],"mappings":";;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;
|
|
1
|
+
{"version":3,"file":"factories.mjs","sources":["../src/factories.ts"],"sourcesContent":["import { pipe, omit, pick } from 'lodash/fp';\nimport type { Strapi, Common, CoreApi, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { createService } from './core-api/service';\nimport { createRoutes } from './core-api/routes';\n\nconst symbols = {\n CustomController: Symbol('StrapiCustomCoreController'),\n} as const;\n\ntype WithStrapiCallback<T> = T | (<S extends { strapi: Strapi }>(params: S) => T);\n\n// Content type is proxied to allow for dynamic content type updates\nconst getContentTypeProxy = (strapi: Strapi, uid: Common.UID.ContentType) => {\n return new Proxy(strapi.contentType(uid), {\n get(target, prop) {\n const contentType = strapi.contentType(uid);\n if (prop in contentType) {\n return contentType[prop as keyof typeof contentType];\n }\n },\n });\n};\n\nconst createCoreController = <\n TUID extends Common.UID.ContentType,\n TController extends CoreApi.Controller.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Controller.Extendable<TUID> & TController>>\n) => {\n return ({ strapi }: { strapi: Strapi }): TController & CoreApi.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseController) as Array<keyof typeof baseController>) {\n if (userCtrl[methodName] === undefined) {\n userCtrl[methodName] = baseController[methodName];\n }\n }\n\n Object.setPrototypeOf(userCtrl, baseController);\n\n const isCustom = typeof cfg !== 'undefined';\n if (isCustom) {\n Object.defineProperty(userCtrl, symbols.CustomController, {\n writable: false,\n configurable: false,\n enumerable: false,\n });\n }\n\n return userCtrl;\n };\n};\n\nfunction createCoreService<\n TUID extends Common.UID.ContentType,\n TService extends CoreApi.Service.Extendable<TUID>\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<CoreApi.Service.Extendable<TUID> & TService>>\n) {\n return ({ strapi }: { strapi: Strapi }): TService & CoreApi.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: getContentTypeProxy(strapi, uid) });\n\n const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg ?? ({} as any);\n\n for (const methodName of Object.keys(baseService) as Array<keyof typeof baseService>) {\n if (userService[methodName] === undefined) {\n userService[methodName] = baseService[methodName];\n }\n }\n\n Object.setPrototypeOf(userService, baseService);\n return userService;\n };\n}\n\nfunction createCoreRouter<T extends Common.UID.ContentType>(\n uid: T,\n cfg?: CoreApi.Router.RouterConfig<T>\n): CoreApi.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: CoreApi.Router.Route[];\n\n return {\n type,\n prefix,\n get routes() {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n Object.assign(defaultRoute.config, config[routeName] || {});\n });\n\n const selectedRoutes = pipe(\n (routes) => (except ? omit(except, routes) : routes),\n (routes) => (only ? pick(only, routes) : routes)\n )(defaultRoutes);\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst isCustomController = <T extends Common.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport { createCoreController, createCoreService, createCoreRouter, isCustomController };\n"],"names":["strapi","routes"],"mappings":";;;;AAOA,MAAM,UAAU;AAAA,EACd,kBAAkB,OAAO,4BAA4B;AACvD;AAKA,MAAM,sBAAsB,CAACA,SAAgB,QAAgC;AAC3E,SAAO,IAAI,MAAMA,QAAO,YAAY,GAAG,GAAG;AAAA,IACxC,IAAI,QAAQ,MAAM;AAChB,YAAM,cAAcA,QAAO,YAAY,GAAG;AAC1C,UAAI,QAAQ,aAAa;AACvB,eAAO,YAAY,IAAgC;AAAA,MACrD;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEA,MAAM,uBAAuB,CAI3B,KACA,QACG;AACH,SAAO,CAAC,EAAE,QAAAA,cAAqF;AAC7F,UAAM,iBAAiB,iBAAiB,EAAE,aAAa,oBAAoBA,SAAQ,GAAG,GAAG;AAEzF,UAAM,WAAW,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAAA,CAAQ,IAAI,OAAQ,CAAA;AAEvE,eAAW,cAAc,OAAO,KAAK,cAAc,GAAyC;AAC1F,UAAI,SAAS,UAAU,MAAM,QAAW;AACtC,iBAAS,UAAU,IAAI,eAAe,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,WAAO,eAAe,UAAU,cAAc;AAE9C,UAAM,WAAW,OAAO,QAAQ;AAChC,QAAI,UAAU;AACZ,aAAO,eAAe,UAAU,QAAQ,kBAAkB;AAAA,QACxD,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAIP,KACA,KACA;AACA,SAAO,CAAC,EAAE,QAAAA,cAA+E;AACvF,UAAM,cAAc,cAAc,EAAE,aAAa,oBAAoBA,SAAQ,GAAG,GAAG;AAEnF,UAAM,cAAc,OAAO,QAAQ,aAAa,IAAI,EAAE,QAAAA,QAAAA,CAAQ,IAAI,OAAQ,CAAA;AAE1E,eAAW,cAAc,OAAO,KAAK,WAAW,GAAsC;AACpF,UAAI,YAAY,UAAU,MAAM,QAAW;AACzC,oBAAY,UAAU,IAAI,YAAY,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,WAAO,eAAe,aAAa,WAAW;AAC9C,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBACP,KACA,KACuB;AACvB,QAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,QAAQ,OAAO,kBAAkB,OAAO,CAAA;AAC3E,MAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,SAAS;AACX,UAAI,CAAC,QAAQ;AACX,cAAM,cAAc,OAAO,YAAY,GAAG;AAE1C,cAAM,gBAAgB,aAAa,EAAE,aAAa;AAClD,cAAM,OAAO,OAAO,KAAK,aAAa;AAEtC,aAAK,QAAQ,CAAC,cAAc;AAC1B,gBAAM,eAAe,cAAc,SAAS;AAE5C,iBAAO,OAAO,aAAa,QAAQ,OAAO,SAAS,KAAK,EAAE;AAAA,QAC5D,CAAC;AAED,cAAM,iBAAiB;AAAA,UACrB,CAACC,YAAY,SAAS,KAAK,QAAQA,OAAM,IAAIA;AAAAA,UAC7C,CAACA,YAAY,OAAO,KAAK,MAAMA,OAAM,IAAIA;AAAAA,QAAA,EACzC,aAAa;AAEf,iBAAS,OAAO,OAAO,cAAc;AAAA,MACvC;AAEA,aAAO;AAAA,IACT;AAAA,EAAA;AAEJ;AAEA,MAAM,qBAAqB,CAA8B,eAA2B;AAClF,SAAO,QAAQ,oBAAoB;AACrC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport default (entryPath: string, useFileNameAsKey: boolean = true): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":["fp","path"],"mappings":";;;;;;AAMA,MAAA,iBAAe,CAAC,WAAmB,mBAA4B,SAAmB;AAChF,QAAM,YAAYA,YAAAA,QAAG;AAAA;AAAA,IAEnB;AAAA;AAAA,IAEAA,oBAAG,QAAQ,6BAA6B,EAAE;AAAA;AAAA;AAAA,IAG1CA,YAAAA,QAAG;AAAA;AAAA,IAEHA,
|
|
1
|
+
{"version":3,"file":"filepath-to-prop-path.js","sources":["../../src/load/filepath-to-prop-path.ts"],"sourcesContent":["import path from 'node:path';\nimport fp from 'lodash/fp';\n\n/**\n * Returns a path (as an array) from a file path\n */\nexport default (entryPath: string, useFileNameAsKey: boolean = true): string[] => {\n const transform = fp.pipe(\n // Remove the relative path prefixes: './' for posix (and some win32) and \".\\\" for win32\n removeRelativePrefix,\n // Remove the path metadata and extensions\n fp.replace(/(\\.settings|\\.json|\\.js)/g, ''),\n // Transform to lowercase\n // Note: We're using fp.toLower instead of fp.lowercase as the latest removes special characters such as \"/\"\n fp.toLower,\n // Split the cleaned path by matching every possible separator (either \"/\" or \"\\\" depending on the OS)\n fp.split(new RegExp(`[\\\\${path.win32.sep}|${path.posix.sep}]`, 'g')),\n // Make sure to remove leading '.' from the different path parts\n fp.map(fp.trimCharsStart('.')),\n // join + split in case some '.' characters are still present in different parts of the path\n fp.join('.'),\n fp.split('.'),\n // Remove the last portion of the path array if the file name shouldn't be used as a key\n useFileNameAsKey ? fp.identity : fp.slice(0, -1)\n );\n\n return transform(entryPath) as string[];\n};\n\nconst removeRelativePrefix = (filePath: string) => {\n return filePath.startsWith(`.${path.win32.sep}`) || filePath.startsWith(`.${path.posix.sep}`)\n ? filePath.slice(2)\n : filePath;\n};\n"],"names":["fp","path"],"mappings":";;;;;;AAMA,MAAA,iBAAe,CAAC,WAAmB,mBAA4B,SAAmB;AAChF,QAAM,YAAYA,YAAAA,QAAG;AAAA;AAAA,IAEnB;AAAA;AAAA,IAEAA,oBAAG,QAAQ,6BAA6B,EAAE;AAAA;AAAA;AAAA,IAG1CA,YAAAA,QAAG;AAAA;AAAA,IAEHA,YAAAA,QAAG,MAAM,IAAI,OAAO,MAAMC,cAAAA,QAAK,MAAM,GAAG,IAAIA,cAAAA,QAAK,MAAM,GAAG,KAAK,GAAG,CAAC;AAAA;AAAA,IAEnED,YAAAA,QAAG,IAAIA,YAAAA,QAAG,eAAe,GAAG,CAAC;AAAA;AAAA,IAE7BA,YAAAA,QAAG,KAAK,GAAG;AAAA,IACXA,YAAAA,QAAG,MAAM,GAAG;AAAA;AAAA,IAEZ,mBAAmBA,YAAAA,QAAG,WAAWA,YAAAA,QAAG,MAAM,GAAG,EAAE;AAAA,EAAA;AAGjD,SAAO,UAAU,SAAS;AAC5B;AAEA,MAAM,uBAAuB,CAAC,aAAqB;AACjD,SAAO,SAAS,WAAW,IAAIC,cAAAA,QAAK,MAAM,GAAG,EAAE,KAAK,SAAS,WAAW,IAAIA,cAAAA,QAAK,MAAM,GAAG,EAAE,IACxF,SAAS,MAAM,CAAC,IAChB;AACN;;"}
|
package/dist/load/load-files.js
CHANGED
|
@@ -28,8 +28,7 @@ async function loadFiles(dir, pattern, { requireFn = strapiUtils.importDefault,
|
|
|
28
28
|
value: path__default.default.basename(file)
|
|
29
29
|
});
|
|
30
30
|
const propPath = filepathToPropPath(file, shouldUseFileNameAsKey(file));
|
|
31
|
-
if (propPath.length === 0)
|
|
32
|
-
___default.default.merge(root, mod);
|
|
31
|
+
if (propPath.length === 0) ___default.default.merge(root, mod);
|
|
33
32
|
___default.default.merge(root, ___default.default.setWith({}, propPath, mod, Object));
|
|
34
33
|
}
|
|
35
34
|
return root;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-files.js","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport filePathToPath from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport default async function loadFiles<T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n}\n"],"names":["importDefault","_","glob","path","fse","filePathToPath"],"mappings":";;;;;;;;;;;AAYA,eAA8B,UAC5B,KACA,SAEA,EAAE,YAAYA,YAAAA,eAAe,yBAAyB,CAACC,OAAW,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"load-files.js","sources":["../../src/load/load-files.ts"],"sourcesContent":["import path from 'path';\nimport _ from 'lodash';\nimport fse from 'fs-extra';\n\nimport { importDefault } from '@strapi/utils';\nimport { glob } from 'glob';\nimport filePathToPath from './filepath-to-prop-path';\n\n/**\n * Returns an Object build from a list of files matching a glob pattern in a directory\n * It builds a tree structure resembling the folder structure in dir\n */\nexport default async function loadFiles<T extends object>(\n dir: string,\n pattern: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n { requireFn = importDefault, shouldUseFileNameAsKey = (_: any) => true, globArgs = {} } = {}\n): Promise<T> {\n const root = {};\n const files = await glob(pattern, { cwd: dir, ...globArgs });\n\n for (const file of files) {\n const absolutePath = path.resolve(dir, file);\n\n // load module\n delete require.cache[absolutePath];\n let mod;\n\n if (path.extname(absolutePath) === '.json') {\n mod = await fse.readJson(absolutePath);\n } else {\n mod = requireFn(absolutePath);\n }\n\n Object.defineProperty(mod, '__filename__', {\n enumerable: true,\n configurable: false,\n writable: false,\n value: path.basename(file),\n });\n\n const propPath = filePathToPath(file, shouldUseFileNameAsKey(file));\n\n if (propPath.length === 0) _.merge(root, mod);\n _.merge(root, _.setWith({}, propPath, mod, Object));\n }\n\n return root as T;\n}\n"],"names":["importDefault","_","glob","path","fse","filePathToPath"],"mappings":";;;;;;;;;;;AAYA,eAA8B,UAC5B,KACA,SAEA,EAAE,YAAYA,YAAAA,eAAe,yBAAyB,CAACC,OAAW,MAAM,WAAW,CAAA,EAAC,IAAM,CAAA,GAC9E;AACZ,QAAM,OAAO,CAAA;AACb,QAAM,QAAQ,MAAMC,KAAAA,KAAK,SAAS,EAAE,KAAK,KAAK,GAAG,UAAU;AAE3D,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAeC,cAAAA,QAAK,QAAQ,KAAK,IAAI;AAG3C,WAAO,QAAQ,MAAM,YAAY;AACjC,QAAI;AAEJ,QAAIA,sBAAK,QAAQ,YAAY,MAAM,SAAS;AAC1C,YAAM,MAAMC,aAAAA,QAAI,SAAS,YAAY;AAAA,IACvC,OAAO;AACL,YAAM,UAAU,YAAY;AAAA,IAC9B;AAEA,WAAO,eAAe,KAAK,gBAAgB;AAAA,MACzC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAOD,cAAAA,QAAK,SAAS,IAAI;AAAA,IAAA,CAC1B;AAED,UAAM,WAAWE,mBAAe,MAAM,uBAAuB,IAAI,CAAC;AAElE,QAAI,SAAS,WAAW,EAAGJ,YAAAA,QAAE,MAAM,MAAM,GAAG;AAC5CA,uBAAE,MAAM,MAAMA,mBAAE,QAAQ,CAAA,GAAI,UAAU,KAAK,MAAM,CAAC;AAAA,EACpD;AAEA,SAAO;AACT;;"}
|
package/dist/load/load-files.mjs
CHANGED
|
@@ -23,8 +23,7 @@ async function loadFiles(dir, pattern, { requireFn = importDefault, shouldUseFil
|
|
|
23
23
|
value: path.basename(file)
|
|
24
24
|
});
|
|
25
25
|
const propPath = filePathToPath(file, shouldUseFileNameAsKey(file));
|
|
26
|
-
if (propPath.length === 0)
|
|
27
|
-
_.merge(root, mod);
|
|
26
|
+
if (propPath.length === 0) _.merge(root, mod);
|
|
28
27
|
_.merge(root, _.setWith({}, propPath, mod, Object));
|
|
29
28
|
}
|
|
30
29
|
return root;
|