@strapi/core 5.56.0 → 5.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Strapi.d.ts +29 -0
- package/dist/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +10 -3
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +10 -3
- package/dist/Strapi.mjs.map +1 -1
- package/dist/configuration/get-dirs.js +2 -2
- package/dist/configuration/get-dirs.js.map +1 -1
- package/dist/configuration/get-dirs.mjs +2 -2
- package/dist/configuration/get-dirs.mjs.map +1 -1
- package/dist/configuration/index.d.ts +1 -2
- package/dist/configuration/index.d.ts.map +1 -1
- package/dist/configuration/index.js +1 -2
- package/dist/configuration/index.js.map +1 -1
- package/dist/configuration/index.mjs +2 -3
- package/dist/configuration/index.mjs.map +1 -1
- package/dist/core-api/controller/collection-type.js +3 -3
- package/dist/core-api/controller/collection-type.js.map +1 -1
- package/dist/core-api/controller/collection-type.mjs +1 -1
- package/dist/core-api/controller/collection-type.mjs.map +1 -1
- package/dist/core-api/controller/index.js +2 -2
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs +2 -2
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/controller/single-type.js +2 -2
- package/dist/core-api/controller/single-type.js.map +1 -1
- package/dist/core-api/controller/single-type.mjs +1 -1
- package/dist/core-api/controller/single-type.mjs.map +1 -1
- package/dist/core-api/controller/transform.d.ts +1 -4
- package/dist/core-api/controller/transform.d.ts.map +1 -1
- package/dist/core-api/controller/transform.js +8 -8
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/controller/transform.mjs +5 -5
- package/dist/core-api/controller/transform.mjs.map +1 -1
- package/dist/core-api/routes/index.js +1 -1
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +1 -1
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/service/pagination.js +9 -9
- package/dist/core-api/service/pagination.js.map +1 -1
- package/dist/core-api/service/pagination.mjs +7 -7
- package/dist/core-api/service/pagination.mjs.map +1 -1
- package/dist/domain/content-type/index.d.ts.map +1 -1
- package/dist/domain/content-type/index.js +1 -2
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs +1 -2
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/ee/entitlements.d.ts +44 -0
- package/dist/ee/entitlements.d.ts.map +1 -0
- package/dist/ee/entitlements.js +54 -0
- package/dist/ee/entitlements.js.map +1 -0
- package/dist/ee/entitlements.mjs +51 -0
- package/dist/ee/entitlements.mjs.map +1 -0
- package/dist/ee/index.d.ts +33 -0
- package/dist/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +74 -7
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +74 -7
- package/dist/ee/index.mjs.map +1 -1
- package/dist/ee/license.d.ts +10 -0
- package/dist/ee/license.d.ts.map +1 -1
- package/dist/ee/license.js +25 -1
- package/dist/ee/license.js.map +1 -1
- package/dist/ee/license.mjs +25 -2
- package/dist/ee/license.mjs.map +1 -1
- package/dist/factories.d.ts.map +1 -1
- package/dist/factories.js +3 -2
- package/dist/factories.js.map +1 -1
- package/dist/factories.mjs +3 -2
- package/dist/factories.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/loaders/apis.d.ts.map +1 -1
- package/dist/loaders/apis.js +1 -2
- package/dist/loaders/apis.js.map +1 -1
- package/dist/loaders/apis.mjs +1 -2
- package/dist/loaders/apis.mjs.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.d.ts +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.js +6 -5
- package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
- package/dist/loaders/plugins/get-enabled-plugins.mjs +6 -5
- package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.js +2 -2
- package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
- package/dist/loaders/plugins/get-user-plugins-config.mjs +2 -2
- package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
- package/dist/loaders/plugins/index.js +9 -12
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs +9 -12
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/middlewares/body.js +2 -2
- package/dist/middlewares/body.js.map +1 -1
- package/dist/middlewares/body.mjs +2 -2
- package/dist/middlewares/body.mjs.map +1 -1
- package/dist/middlewares/public.js +2 -2
- package/dist/middlewares/public.js.map +1 -1
- package/dist/middlewares/public.mjs +2 -2
- package/dist/middlewares/public.mjs.map +1 -1
- package/dist/middlewares/responses.d.ts.map +1 -1
- package/dist/middlewares/responses.js +1 -3
- package/dist/middlewares/responses.js.map +1 -1
- package/dist/middlewares/responses.mjs +1 -3
- package/dist/middlewares/responses.mjs.map +1 -1
- package/dist/middlewares/security.d.ts.map +1 -1
- package/dist/middlewares/security.js +3 -3
- package/dist/middlewares/security.js.map +1 -1
- package/dist/middlewares/security.mjs +3 -3
- package/dist/middlewares/security.mjs.map +1 -1
- package/dist/middlewares/session.js +2 -2
- package/dist/middlewares/session.js.map +1 -1
- package/dist/middlewares/session.mjs +2 -2
- package/dist/middlewares/session.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +1 -2
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +1 -2
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/migrations/i18n.d.ts.map +1 -1
- package/dist/migrations/i18n.js +6 -4
- package/dist/migrations/i18n.js.map +1 -1
- package/dist/migrations/i18n.mjs +6 -4
- package/dist/migrations/i18n.mjs.map +1 -1
- package/dist/package.json.js +16 -16
- package/dist/package.json.mjs +16 -16
- package/dist/registries/apis.js +2 -2
- package/dist/registries/apis.js.map +1 -1
- package/dist/registries/apis.mjs +2 -2
- package/dist/registries/apis.mjs.map +1 -1
- package/dist/registries/components.js +2 -2
- package/dist/registries/components.js.map +1 -1
- package/dist/registries/components.mjs +2 -2
- package/dist/registries/components.mjs.map +1 -1
- package/dist/registries/content-types.d.ts +1 -1
- package/dist/registries/content-types.js +3 -3
- package/dist/registries/content-types.js.map +1 -1
- package/dist/registries/content-types.mjs +3 -3
- package/dist/registries/content-types.mjs.map +1 -1
- package/dist/registries/controllers.js +3 -3
- package/dist/registries/controllers.js.map +1 -1
- package/dist/registries/controllers.mjs +3 -3
- package/dist/registries/controllers.mjs.map +1 -1
- package/dist/registries/custom-fields.js +4 -4
- package/dist/registries/custom-fields.js.map +1 -1
- package/dist/registries/custom-fields.mjs +4 -4
- package/dist/registries/custom-fields.mjs.map +1 -1
- package/dist/registries/hooks.d.ts +1 -1
- package/dist/registries/hooks.js +2 -2
- package/dist/registries/hooks.js.map +1 -1
- package/dist/registries/hooks.mjs +2 -2
- package/dist/registries/hooks.mjs.map +1 -1
- package/dist/registries/middlewares.d.ts +1 -1
- package/dist/registries/middlewares.js +3 -3
- package/dist/registries/middlewares.js.map +1 -1
- package/dist/registries/middlewares.mjs +3 -3
- package/dist/registries/middlewares.mjs.map +1 -1
- package/dist/registries/modules.d.ts +1 -4
- package/dist/registries/modules.d.ts.map +1 -1
- package/dist/registries/modules.js +3 -3
- package/dist/registries/modules.js.map +1 -1
- package/dist/registries/modules.mjs +3 -3
- package/dist/registries/modules.mjs.map +1 -1
- package/dist/registries/plugins.js +2 -2
- package/dist/registries/plugins.js.map +1 -1
- package/dist/registries/plugins.mjs +2 -2
- package/dist/registries/plugins.mjs.map +1 -1
- package/dist/registries/policies.d.ts +1 -1
- package/dist/registries/policies.js +4 -4
- package/dist/registries/policies.js.map +1 -1
- package/dist/registries/policies.mjs +3 -3
- package/dist/registries/policies.mjs.map +1 -1
- package/dist/registries/services.js +3 -3
- package/dist/registries/services.js.map +1 -1
- package/dist/registries/services.mjs +3 -3
- package/dist/registries/services.mjs.map +1 -1
- package/dist/services/auth/index.js +3 -3
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/auth/index.mjs +3 -3
- package/dist/services/auth/index.mjs.map +1 -1
- package/dist/services/core-store.js +3 -3
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs +1 -1
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/cron.d.ts.map +1 -1
- package/dist/services/cron.js +2 -4
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +2 -4
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/attributes/index.js +2 -2
- package/dist/services/document-service/attributes/index.js.map +1 -1
- package/dist/services/document-service/attributes/index.mjs +1 -1
- package/dist/services/document-service/attributes/index.mjs.map +1 -1
- package/dist/services/document-service/attributes/transforms.js +3 -3
- package/dist/services/document-service/attributes/transforms.js.map +1 -1
- package/dist/services/document-service/attributes/transforms.mjs +2 -2
- package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +13 -14
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs +12 -13
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +65 -38
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +59 -32
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts +2 -2
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +16 -8
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +17 -9
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/first-published-at.js +7 -5
- package/dist/services/document-service/first-published-at.js.map +1 -1
- package/dist/services/document-service/first-published-at.mjs +7 -5
- package/dist/services/document-service/first-published-at.mjs.map +1 -1
- package/dist/services/document-service/internationalization.d.ts.map +1 -1
- package/dist/services/document-service/internationalization.js +37 -28
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs +33 -24
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +1 -0
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/params.js +6 -4
- package/dist/services/document-service/params.js.map +1 -1
- package/dist/services/document-service/params.mjs +6 -5
- package/dist/services/document-service/params.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +84 -61
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +47 -24
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/transform/fields.d.ts.map +1 -1
- package/dist/services/document-service/transform/fields.js +7 -1
- package/dist/services/document-service/transform/fields.js.map +1 -1
- package/dist/services/document-service/transform/fields.mjs +7 -1
- package/dist/services/document-service/transform/fields.mjs.map +1 -1
- package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
- package/dist/services/document-service/transform/id-map.js +2 -1
- package/dist/services/document-service/transform/id-map.js.map +1 -1
- package/dist/services/document-service/transform/id-map.mjs +2 -1
- package/dist/services/document-service/transform/id-map.mjs.map +1 -1
- package/dist/services/document-service/transform/id-transform.js +2 -2
- package/dist/services/document-service/transform/id-transform.js.map +1 -1
- package/dist/services/document-service/transform/id-transform.mjs +1 -1
- package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
- package/dist/services/document-service/transform/populate.d.ts.map +1 -1
- package/dist/services/document-service/transform/populate.js +8 -1
- package/dist/services/document-service/transform/populate.js.map +1 -1
- package/dist/services/document-service/transform/populate.mjs +8 -1
- package/dist/services/document-service/transform/populate.mjs.map +1 -1
- package/dist/services/document-service/transform/query.d.ts +3 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +12 -6
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +11 -5
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.js +2 -2
- package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs +1 -1
- package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.js +2 -2
- package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs +1 -1
- package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.js +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs +1 -1
- package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.js +1 -2
- package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/dp.mjs +1 -2
- package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.d.ts +2 -2
- package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.js +2 -2
- package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/i18n.mjs +2 -2
- package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.js +16 -10
- package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs +13 -7
- package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
- package/dist/services/document-service/transform/relations/utils/xto-one.js +3 -3
- package/dist/services/document-service/transform/relations/utils/xto-one.js.map +1 -1
- package/dist/services/document-service/transform/relations/utils/xto-one.mjs +2 -2
- package/dist/services/document-service/transform/relations/utils/xto-one.mjs.map +1 -1
- package/dist/services/document-service/utils/bidirectional-relations.js +3 -3
- package/dist/services/document-service/utils/bidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/bidirectional-relations.mjs +3 -3
- package/dist/services/document-service/utils/bidirectional-relations.mjs.map +1 -1
- package/dist/services/document-service/utils/clone-relations.js +3 -3
- package/dist/services/document-service/utils/clone-relations.js.map +1 -1
- package/dist/services/document-service/utils/clone-relations.mjs +3 -3
- package/dist/services/document-service/utils/clone-relations.mjs.map +1 -1
- package/dist/services/document-service/utils/self-referential-relations.js +4 -4
- package/dist/services/document-service/utils/self-referential-relations.js.map +1 -1
- package/dist/services/document-service/utils/self-referential-relations.mjs +4 -4
- package/dist/services/document-service/utils/self-referential-relations.mjs.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +3 -3
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.mjs +3 -3
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +9 -10
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs +4 -5
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/localization.d.ts +4 -0
- package/dist/services/localization.d.ts.map +1 -0
- package/dist/services/localization.js +51 -0
- package/dist/services/localization.js.map +1 -0
- package/dist/services/localization.mjs +49 -0
- package/dist/services/localization.mjs.map +1 -0
- package/dist/services/server/compose-endpoint.js +7 -7
- package/dist/services/server/compose-endpoint.js.map +1 -1
- package/dist/services/server/compose-endpoint.mjs +3 -3
- package/dist/services/server/compose-endpoint.mjs.map +1 -1
- package/dist/services/server/koa-methods.js +2 -2
- package/dist/services/server/koa-methods.js.map +1 -1
- package/dist/services/server/koa-methods.mjs +1 -1
- package/dist/services/server/koa-methods.mjs.map +1 -1
- package/dist/services/server/koa.d.ts.map +1 -1
- package/dist/services/server/koa.js +1 -2
- package/dist/services/server/koa.js.map +1 -1
- package/dist/services/server/koa.mjs +1 -2
- package/dist/services/server/koa.mjs.map +1 -1
- package/dist/services/server/middleware.d.ts.map +1 -1
- package/dist/services/server/middleware.js +1 -2
- package/dist/services/server/middleware.js.map +1 -1
- package/dist/services/server/middleware.mjs +1 -2
- package/dist/services/server/middleware.mjs.map +1 -1
- package/dist/services/server/routing.js +2 -2
- package/dist/services/server/routing.js.map +1 -1
- package/dist/services/server/routing.mjs +2 -2
- package/dist/services/server/routing.mjs.map +1 -1
- package/dist/services/utils/conditional-fields.d.ts +1 -1
- package/dist/services/utils/conditional-fields.d.ts.map +1 -1
- package/dist/services/utils/conditional-fields.js +2 -8
- package/dist/services/utils/conditional-fields.js.map +1 -1
- package/dist/services/utils/conditional-fields.mjs +2 -8
- package/dist/services/utils/conditional-fields.mjs.map +1 -1
- package/dist/services/utils/dynamic-zones.d.ts.map +1 -1
- package/dist/services/utils/dynamic-zones.js +2 -8
- package/dist/services/utils/dynamic-zones.js.map +1 -1
- package/dist/services/utils/dynamic-zones.mjs +2 -8
- package/dist/services/utils/dynamic-zones.mjs.map +1 -1
- package/dist/utils/cron.js +2 -2
- package/dist/utils/cron.js.map +1 -1
- package/dist/utils/cron.mjs +1 -1
- package/dist/utils/cron.mjs.map +1 -1
- package/dist/utils/detect-customizations.d.ts +31 -0
- package/dist/utils/detect-customizations.d.ts.map +1 -0
- package/dist/utils/detect-customizations.js +173 -0
- package/dist/utils/detect-customizations.js.map +1 -0
- package/dist/utils/detect-customizations.mjs +165 -0
- package/dist/utils/detect-customizations.mjs.map +1 -0
- package/dist/utils/filepath-to-prop-path.d.ts.map +1 -1
- package/dist/utils/filepath-to-prop-path.js +5 -12
- package/dist/utils/filepath-to-prop-path.js.map +1 -1
- package/dist/utils/filepath-to-prop-path.mjs +5 -11
- package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
- package/dist/utils/is-initialized.js +3 -3
- package/dist/utils/is-initialized.js.map +1 -1
- package/dist/utils/is-initialized.mjs +2 -2
- package/dist/utils/is-initialized.mjs.map +1 -1
- package/dist/utils/startup-logger.d.ts.map +1 -1
- package/dist/utils/startup-logger.js +2 -4
- package/dist/utils/startup-logger.js.map +1 -1
- package/dist/utils/startup-logger.mjs +2 -3
- package/dist/utils/startup-logger.mjs.map +1 -1
- package/dist/utils/transform-content-types-to-models.js +4 -4
- package/dist/utils/transform-content-types-to-models.js.map +1 -1
- package/dist/utils/transform-content-types-to-models.mjs +3 -3
- package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
- package/package.json +16 -16
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 { Core } from '@strapi/types';\nimport { createStrapiFetch } from '../utils/fetch';\nimport {\n readLicense,\n verifyLicense,\n fetchLicense,\n LicenseCheckError,\n LICENSE_REGISTRY_URI,\n} 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; [key: string]: any } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n isTrial: boolean;\n subscriptionId?: string;\n planPriceId?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {\n isTrial: false,\n },\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 and isTrial for potential re-enabling during a later check\n ee.licenseInfo = pick(['licenseKey', 'isTrial'], ee.licenseInfo);\n\n ee.licenseInfo.isTrial = false;\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: Core.Strapi }) => {\n const { get, commit, rollback } = await strapi.db.transaction();\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 {\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: Core.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\n strapi.cron.add({\n onlineUpdate: {\n task: () => onlineUpdate({ strapi }),\n options: shiftCronExpression('0 0 */12 * * *'),\n },\n });\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 getTrialEndDate = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<{ trialEndsAt: string } | null> => {\n const silentFetch = createStrapiFetch(strapi, {\n logs: false,\n });\n\n const res = await silentFetch(\n `${LICENSE_REGISTRY_URI}/api/licenses/${ee.licenseInfo.licenseKey}/trial-countdown`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n ).catch(() => {\n throw new LicenseCheckError(\n 'Could not proceed to retrieve the trial time left for your license.',\n true\n );\n });\n\n const data = (await res.json()) as { trialEndsAt: string } | null;\n\n return data;\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 getTrialEndDate,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n get type() {\n return ee.licenseInfo.type;\n },\n\n get isTrial() {\n return ee.licenseInfo.isTrial;\n },\n\n get planPriceId() {\n return ee.licenseInfo.planPriceId;\n },\n\n get subscriptionId() {\n return ee.licenseInfo.subscriptionId;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["ONE_MINUTE","ee","enabled","licenseInfo","isTrial","disable","message","shouldEmitEvent","logger","warn","pick","strapi","eventHub","emit","enable","initialized","init","licenseDir","process","env","STRAPI_DISABLE_EE","toLowerCase","license","STRAPI_LICENSE","readLicense","verifyLicense","error","Error","onlineUpdate","get","commit","rollback","db","transaction","storedInfo","queryBuilder","where","key","select","first","transacting","forUpdate","execute","then","result","JSON","parse","value","shouldContactRegistry","lastCheckAt","Date","now","fallback","LicenseCheckError","shouldFallback","licenseKey","fetchLicense","config","catch","newLicenseInfo","licenseInfoChanged","isEqual","features","seats","type","wasEnabled","validateInfo","query","insert","stringify","update","expireAt","expirationTime","getTime","checkLicense","shouldStayOffline","STRAPI_DISABLE_LICENSE_PING","cron","add","task","options","shiftCronExpression","getTrialEndDate","silentFetch","createStrapiFetch","logs","res","LICENSE_REGISTRY_URI","method","headers","data","json","list","map","feature","name","featureName","find","Object","freeze","isEE","planPriceId","subscriptionId","isEnabled","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/ee/index.ts"],"sourcesContent":["import { isEqual, pick } from 'lodash';\nimport type { Logger } from '@strapi/logger';\nimport type { Core } from '@strapi/types';\nimport { createStrapiFetch } from '../utils/fetch';\nimport {\n readLicense,\n verifyLicense,\n fetchLicense,\n LicenseCheckError,\n LICENSE_REGISTRY_URI,\n PLAN_FEATURE_CATALOG,\n} from './license';\nimport { createEntitlementsRegistry } from './entitlements';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface LicenseInfoState {\n licenseKey?: string;\n features?: Array<{ name: string; [key: string]: any } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n isTrial: boolean;\n subscriptionId?: string;\n planPriceId?: string;\n /** End of the subscription term, epoch milliseconds. */\n renewalDate?: string | number;\n}\n\ntype LicenseStatus = 'none' | 'active' | 'expired' | 'unknown';\n\ninterface EE {\n enabled: boolean;\n licenseInfo: LicenseInfoState;\n /**\n * Display-only copy of the last known license, retained when a license exists but is\n * not usable (expired / could not be validated) so the admin panel can explain why.\n * NEVER read by enforcement paths (features.list/get/isEnabled, isEE) and never holds\n * the license key.\n */\n retainedLicense: Omit<LicenseInfoState, 'licenseKey'> | null;\n licenseStatus: LicenseStatus;\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {\n isTrial: false,\n },\n retainedLicense: null,\n licenseStatus: 'none',\n};\n\nconst disable = (message: string, status: 'expired' | 'unknown' = 'unknown') => {\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\n // Retain a display-only snapshot (never the key) BEFORE wiping, so the admin panel can\n // still show which license this instance has and why it is unusable. Guarded on `type`\n // so a repeat disable() call cannot overwrite the snapshot with an already-wiped one.\n if (ee.licenseInfo.type) {\n ee.retainedLicense = pick(ee.licenseInfo, [\n 'features',\n 'expireAt',\n 'seats',\n 'type',\n 'isTrial',\n 'subscriptionId',\n 'planPriceId',\n 'renewalDate',\n ]);\n }\n ee.licenseStatus = status;\n\n // Only keep the license key and isTrial for potential re-enabling during a later check\n ee.licenseInfo = pick(ee.licenseInfo, ['licenseKey', 'isTrial']);\n\n ee.licenseInfo.isTrial = false;\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 ee.licenseStatus = 'active';\n ee.retainedLicense = null;\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: Core.Strapi }) => {\n const { get, commit, rollback } = await strapi.db.transaction();\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 errorKind?: 'unreachable' | 'rejected';\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n // Whether the registry was unreachable or actually refused the license is only\n // knowable here, from `shouldFallback`. Record it rather than letting the admin\n // panel infer it from the presence of a cached license: an instance that has never\n // reached the registry has no cache to fall back to, and would otherwise be told\n // its license was refused when the registry was merely unreachable.\n result.errorKind =\n error instanceof LicenseCheckError && error.shouldFallback ? 'unreachable' : 'rejected';\n\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 result.error = error.message; // record why we fell back so usingCachedLicense is derivable\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 {\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.', 'expired');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Core.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\n strapi.cron.add({\n onlineUpdate: {\n task: () => onlineUpdate({ strapi }),\n options: shiftCronExpression('0 0 */12 * * *'),\n },\n });\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 getTrialEndDate = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<{ trialEndsAt: string } | null> => {\n const silentFetch = createStrapiFetch(strapi, {\n logs: false,\n });\n\n const res = await silentFetch(\n `${LICENSE_REGISTRY_URI}/api/licenses/${ee.licenseInfo.licenseKey}/trial-countdown`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n ).catch(() => {\n throw new LicenseCheckError(\n 'Could not proceed to retrieve the trial time left for your license.',\n true\n );\n });\n\n const data = (await res.json()) as { trialEndsAt: string } | null;\n\n return data;\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\nconst entitlements = createEntitlementsRegistry();\n\nexport default Object.freeze({\n init,\n checkLicense,\n getTrialEndDate,\n\n get isEE() {\n return ee.enabled;\n },\n\n get licenseStatus() {\n return ee.licenseStatus;\n },\n\n /** Display-only; see EE.retainedLicense. Never use for feature gating. */\n get retainedLicense() {\n return ee.retainedLicense;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n get type() {\n return ee.licenseInfo.type;\n },\n\n get expireAt() {\n return ee.licenseInfo.expireAt;\n },\n\n /** Null when the registry does not provide it yet; survives expiry via the retained snapshot. */\n get renewalDate() {\n return ee.licenseInfo.renewalDate ?? ee.retainedLicense?.renewalDate ?? null;\n },\n\n /**\n * Every feature the current plan supports, in display order, regardless of whether this\n * license includes it. Falls back to the retained license's type so an expired license\n * still lists rows. See `PLAN_FEATURE_CATALOG` in `./license`.\n */\n get planFeatureCatalog(): string[] {\n const type = ee.licenseInfo.type ?? ee.retainedLicense?.type;\n return type && type in PLAN_FEATURE_CATALOG\n ? PLAN_FEATURE_CATALOG[type as keyof typeof PLAN_FEATURE_CATALOG]\n : [];\n },\n\n get isTrial() {\n return ee.licenseInfo.isTrial;\n },\n\n get planPriceId() {\n return ee.licenseInfo.planPriceId;\n },\n\n get subscriptionId() {\n return ee.licenseInfo.subscriptionId;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n\n entitlements: Object.freeze({\n register: entitlements.register,\n // Resolvers are registered during `register()`, before the license is validated, and each\n // falls back to a built-in default when the feature is absent. Without this gate an\n // instance whose license was disabled would still report generous limits, which reads as\n // \"these are your granted limits\". No license, no entitlements.\n list: () => (ee.enabled ? entitlements.list(get) : []),\n // A lapsed license's limits, from the same resolvers run against its retained feature list,\n // so a lapsed Plan card and the debug dump carry the defaults and clamps the plan enforced\n // instead of raw options. Only features the retained license listed are reported.\n listRetained() {\n const retainedFeatures = (ee.retainedLicense?.features ?? []).map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n );\n const getRetained = (name: string) =>\n retainedFeatures.find((feature) => feature.name === name);\n\n return entitlements\n .list(getRetained)\n .filter((entry) => getRetained(entry.feature) !== undefined);\n },\n }),\n});\n"],"names":["ONE_MINUTE","ee","enabled","licenseInfo","isTrial","retainedLicense","licenseStatus","disable","message","status","shouldEmitEvent","logger","warn","type","pick","strapi","eventHub","emit","enable","initialized","init","licenseDir","process","env","STRAPI_DISABLE_EE","toLowerCase","license","STRAPI_LICENSE","readLicense","verifyLicense","error","Error","onlineUpdate","get","commit","rollback","db","transaction","storedInfo","queryBuilder","where","key","select","first","transacting","forUpdate","execute","then","result","JSON","parse","value","shouldContactRegistry","lastCheckAt","Date","now","fallback","errorKind","LicenseCheckError","shouldFallback","licenseKey","fetchLicense","config","catch","newLicenseInfo","licenseInfoChanged","isEqual","features","seats","wasEnabled","validateInfo","query","insert","stringify","update","expireAt","expirationTime","getTime","checkLicense","shouldStayOffline","STRAPI_DISABLE_LICENSE_PING","cron","add","task","options","shiftCronExpression","getTrialEndDate","silentFetch","createStrapiFetch","logs","res","LICENSE_REGISTRY_URI","method","headers","data","json","list","map","feature","name","featureName","find","entitlements","createEntitlementsRegistry","Object","freeze","isEE","renewalDate","planFeatureCatalog","PLAN_FEATURE_CATALOG","planPriceId","subscriptionId","isEnabled","undefined","register","listRetained","retainedFeatures","getRetained","filter","entry"],"mappings":"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"}
|
package/dist/ee/license.d.ts
CHANGED
|
@@ -10,7 +10,17 @@ interface LicenseInfo {
|
|
|
10
10
|
}>;
|
|
11
11
|
subscriptionId?: string;
|
|
12
12
|
planPriceId?: string;
|
|
13
|
+
/** End of the subscription term, epoch milliseconds. */
|
|
14
|
+
renewalDate?: string | number;
|
|
15
|
+
licenseKey?: string;
|
|
16
|
+
customerId?: string;
|
|
13
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Features that can appear on a plan, in the order the admin panel lists them.
|
|
20
|
+
* Used to render entitlement rows for features a plan supports but this license
|
|
21
|
+
* does not include. `cms-ai` is deliberately absent: AI usage has its own panel.
|
|
22
|
+
*/
|
|
23
|
+
export declare const PLAN_FEATURE_CATALOG: Record<'bronze' | 'silver' | 'gold', string[]>;
|
|
14
24
|
declare const LICENSE_REGISTRY_URI = "https://license.strapi.io";
|
|
15
25
|
declare class LicenseCheckError extends Error {
|
|
16
26
|
shouldFallback: boolean;
|
package/dist/ee/license.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/ee/license.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/ee/license.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IAExD,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,CAW/E,CAAC;AAEF,QAAA,MAAM,oBAAoB,8BAA8B,CAAC;AAkBzD,cAAM,iBAAkB,SAAQ,KAAK;IACnC,cAAc,UAAS;gBAEX,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ;CAKpD;AAED,QAAA,MAAM,WAAW,GAAI,WAAW,MAAM,uBASrC,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,gBA+BrC,CAAC;AAUF,QAAA,MAAM,YAAY,GAChB,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,EACnC,KAAK,MAAM,EACX,WAAW,MAAM,oBA0ClB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC"}
|
package/dist/ee/license.js
CHANGED
|
@@ -62,6 +62,27 @@ const DEFAULT_FEATURES = {
|
|
|
62
62
|
}
|
|
63
63
|
]
|
|
64
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Features that can appear on a plan, in the order the admin panel lists them.
|
|
67
|
+
* Used to render entitlement rows for features a plan supports but this license
|
|
68
|
+
* does not include. `cms-ai` is deliberately absent: AI usage has its own panel.
|
|
69
|
+
*/ const PLAN_FEATURE_CATALOG = {
|
|
70
|
+
bronze: [],
|
|
71
|
+
silver: [
|
|
72
|
+
'sso',
|
|
73
|
+
'cms-advanced-preview',
|
|
74
|
+
'cms-content-releases',
|
|
75
|
+
'cms-content-history'
|
|
76
|
+
],
|
|
77
|
+
gold: [
|
|
78
|
+
'sso',
|
|
79
|
+
'cms-advanced-preview',
|
|
80
|
+
'cms-content-releases',
|
|
81
|
+
'review-workflows',
|
|
82
|
+
'cms-content-history',
|
|
83
|
+
'audit-logs'
|
|
84
|
+
]
|
|
85
|
+
};
|
|
65
86
|
const LICENSE_REGISTRY_URI = 'https://license.strapi.io';
|
|
66
87
|
// Shape of a successful (200) response from the license registry.
|
|
67
88
|
const licenseSuccessSchema = z__namespace.object({
|
|
@@ -136,7 +157,9 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
|
|
|
136
157
|
}).catch(throwShouldFallbackError);
|
|
137
158
|
const contentType = response.headers.get('Content-Type');
|
|
138
159
|
if (contentType?.includes('application/json')) {
|
|
139
|
-
|
|
160
|
+
// A body that does not parse is an outage like any other malformed response, so it keeps
|
|
161
|
+
// the stored license instead of reading as a rejection.
|
|
162
|
+
const body = await response.json().catch(throwShouldFallbackError);
|
|
140
163
|
switch(response.status){
|
|
141
164
|
case 200:
|
|
142
165
|
{
|
|
@@ -162,6 +185,7 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
|
|
|
162
185
|
|
|
163
186
|
exports.LICENSE_REGISTRY_URI = LICENSE_REGISTRY_URI;
|
|
164
187
|
exports.LicenseCheckError = LicenseCheckError;
|
|
188
|
+
exports.PLAN_FEATURE_CATALOG = PLAN_FEATURE_CATALOG;
|
|
165
189
|
exports.fetchLicense = fetchLicense;
|
|
166
190
|
exports.readLicense = readLicense;
|
|
167
191
|
exports.verifyLicense = verifyLicense;
|
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 * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\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 { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\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 if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const body = await response.json();\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
|
|
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 * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n /** End of the subscription term, epoch milliseconds. */\n // The registry sends an ISO date string; kept open to a timestamp\n renewalDate?: string | number;\n // Present on the payload at runtime; declared here so the type reflects reality.\n licenseKey?: string;\n customerId?: string;\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 { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\n/**\n * Features that can appear on a plan, in the order the admin panel lists them.\n * Used to render entitlement rows for features a plan supports but this license\n * does not include. `cms-ai` is deliberately absent: AI usage has its own panel.\n */\nexport const PLAN_FEATURE_CATALOG: Record<'bronze' | 'silver' | 'gold', string[]> = {\n bronze: [],\n silver: ['sso', 'cms-advanced-preview', 'cms-content-releases', 'cms-content-history'],\n gold: [\n 'sso',\n 'cms-advanced-preview',\n 'cms-content-releases',\n 'review-workflows',\n 'cms-content-history',\n 'audit-logs',\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\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 if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n // A body that does not parse is an outage like any other malformed response, so it keeps\n // the stored license instead of reading as a rejection.\n const body = await response.json().catch(throwShouldFallbackError);\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","PLAN_FEATURE_CATALOG","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
|
package/dist/ee/license.mjs
CHANGED
|
@@ -36,6 +36,27 @@ const DEFAULT_FEATURES = {
|
|
|
36
36
|
}
|
|
37
37
|
]
|
|
38
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* Features that can appear on a plan, in the order the admin panel lists them.
|
|
41
|
+
* Used to render entitlement rows for features a plan supports but this license
|
|
42
|
+
* does not include. `cms-ai` is deliberately absent: AI usage has its own panel.
|
|
43
|
+
*/ const PLAN_FEATURE_CATALOG = {
|
|
44
|
+
bronze: [],
|
|
45
|
+
silver: [
|
|
46
|
+
'sso',
|
|
47
|
+
'cms-advanced-preview',
|
|
48
|
+
'cms-content-releases',
|
|
49
|
+
'cms-content-history'
|
|
50
|
+
],
|
|
51
|
+
gold: [
|
|
52
|
+
'sso',
|
|
53
|
+
'cms-advanced-preview',
|
|
54
|
+
'cms-content-releases',
|
|
55
|
+
'review-workflows',
|
|
56
|
+
'cms-content-history',
|
|
57
|
+
'audit-logs'
|
|
58
|
+
]
|
|
59
|
+
};
|
|
39
60
|
const LICENSE_REGISTRY_URI = 'https://license.strapi.io';
|
|
40
61
|
// Shape of a successful (200) response from the license registry.
|
|
41
62
|
const licenseSuccessSchema = z.object({
|
|
@@ -110,7 +131,9 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
|
|
|
110
131
|
}).catch(throwShouldFallbackError);
|
|
111
132
|
const contentType = response.headers.get('Content-Type');
|
|
112
133
|
if (contentType?.includes('application/json')) {
|
|
113
|
-
|
|
134
|
+
// A body that does not parse is an outage like any other malformed response, so it keeps
|
|
135
|
+
// the stored license instead of reading as a rejection.
|
|
136
|
+
const body = await response.json().catch(throwShouldFallbackError);
|
|
114
137
|
switch(response.status){
|
|
115
138
|
case 200:
|
|
116
139
|
{
|
|
@@ -134,5 +157,5 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
|
|
|
134
157
|
}
|
|
135
158
|
};
|
|
136
159
|
|
|
137
|
-
export { LICENSE_REGISTRY_URI, LicenseCheckError, fetchLicense, readLicense, verifyLicense };
|
|
160
|
+
export { LICENSE_REGISTRY_URI, LicenseCheckError, PLAN_FEATURE_CATALOG, fetchLicense, readLicense, verifyLicense };
|
|
138
161
|
//# sourceMappingURL=license.mjs.map
|
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 * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\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 { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\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 if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const body = await response.json();\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
|
|
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 * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n /** End of the subscription term, epoch milliseconds. */\n // The registry sends an ISO date string; kept open to a timestamp\n renewalDate?: string | number;\n // Present on the payload at runtime; declared here so the type reflects reality.\n licenseKey?: string;\n customerId?: string;\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 { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\n/**\n * Features that can appear on a plan, in the order the admin panel lists them.\n * Used to render entitlement rows for features a plan supports but this license\n * does not include. `cms-ai` is deliberately absent: AI usage has its own panel.\n */\nexport const PLAN_FEATURE_CATALOG: Record<'bronze' | 'silver' | 'gold', string[]> = {\n bronze: [],\n silver: ['sso', 'cms-advanced-preview', 'cms-content-releases', 'cms-content-history'],\n gold: [\n 'sso',\n 'cms-advanced-preview',\n 'cms-content-releases',\n 'review-workflows',\n 'cms-content-history',\n 'audit-logs',\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\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 if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n // A body that does not parse is an outage like any other malformed response, so it keeps\n // the stored license instead of reading as a rejection.\n const body = await response.json().catch(throwShouldFallbackError);\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","PLAN_FEATURE_CATALOG","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
|
package/dist/factories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../src/factories.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAQ7E,KAAK,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEvF,QAAA,MAAM,oBAAoB,GACxB,IAAI,SAAS,GAAG,CAAC,WAAW,EAC5B,WAAW,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAE5D,KAAK,IAAI,EACT,MAAM,kBAAkB,CACtB,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAC9E,MAEO,aAEL;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAwB3D,CAAC;AAEF,iBAAS,iBAAiB,CACxB,IAAI,SAAS,GAAG,CAAC,WAAW,EAC5B,QAAQ,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAEtD,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAEzF,aAEL;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CActD;AAED,iBAAS,gBAAgB,CAAC,CAAC,SAAS,GAAG,CAAC,WAAW,EACjD,GAAG,EAAE,CAAC,EACN,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../src/factories.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAQ7E,KAAK,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEvF,QAAA,MAAM,oBAAoB,GACxB,IAAI,SAAS,GAAG,CAAC,WAAW,EAC5B,WAAW,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAE5D,KAAK,IAAI,EACT,MAAM,kBAAkB,CACtB,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAC9E,MAEO,aAEL;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAwB3D,CAAC;AAEF,iBAAS,iBAAiB,CACxB,IAAI,SAAS,GAAG,CAAC,WAAW,EAC5B,QAAQ,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAEtD,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAEzF,aAEL;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CActD;AAED,iBAAS,gBAAgB,CAAC,CAAC,SAAS,GAAG,CAAC,WAAW,EACjD,GAAG,EAAE,CAAC,EACN,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CA6B5B;AAED,QAAA,MAAM,mBAAmB,GAAI,CAAC,SAAS,GAAG,CAAC,WAAW,EACpD,KAAK,CAAC,EACN,QAAQ,IAAI,CAAC,MAAM,KAClB,6BAEF,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,KAAG,OAEtE,CAAC;AAEF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,CAAC"}
|
package/dist/factories.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var index = require('./core-api/controller/index.js');
|
|
5
5
|
require('@strapi/utils');
|
|
6
6
|
require('zod/v4');
|
|
@@ -71,7 +71,8 @@ function createCoreRouter(uid, cfg) {
|
|
|
71
71
|
const defaultRoute = defaultRoutes[routeName];
|
|
72
72
|
defaultRoute.config = config[routeName] ?? {};
|
|
73
73
|
});
|
|
74
|
-
const
|
|
74
|
+
const availableRoutes = except ? _.omit(defaultRoutes, except) : defaultRoutes;
|
|
75
|
+
const selectedRoutes = only ? _.pick(availableRoutes, only) : availableRoutes;
|
|
75
76
|
routes = Object.values(selectedRoutes);
|
|
76
77
|
}
|
|
77
78
|
return routes;
|
package/dist/factories.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"factories.js","sources":["../src/factories.ts"],"sourcesContent":["import { omit, pick } from 'lodash';\nimport type { Core, UID, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { CoreContentTypeRouteValidator } from './core-api/routes/validation';\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: Core.Strapi }>(params: S) => T);\n\nconst createCoreController = <\n TUID extends UID.ContentType,\n TController extends Core.CoreAPI.Controller.Extendable<TUID>,\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<\n Utils.PartialWithThis<Core.CoreAPI.Controller.Extendable<TUID> & TController>\n >\n) => {\n return ({\n strapi,\n }: {\n strapi: Core.Strapi;\n }): TController & Core.CoreAPI.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: strapi.contentType(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 UID.ContentType,\n TService extends Core.CoreAPI.Service.Extendable<TUID>,\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<Core.CoreAPI.Service.Extendable<TUID> & TService>>\n) {\n return ({\n strapi,\n }: {\n strapi: Core.Strapi;\n }): TService & Core.CoreAPI.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: strapi.contentType(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 UID.ContentType>(\n uid: T,\n cfg?: Core.CoreAPI.Router.RouterConfig<T>\n): Core.CoreAPI.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: Core.CoreAPI.Router.Route[];\n\n return {\n type,\n prefix,\n get routes(): Core.CoreAPI.Router.Route[] {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType, strapi });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n defaultRoute.config = (config[routeName] ?? {}) as Core.RouteConfig;\n });\n\n const availableRoutes = except ? omit(defaultRoutes, except) : defaultRoutes;\n const selectedRoutes = only ? pick(availableRoutes, only) : availableRoutes;\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst createCoreValidator = <T extends UID.ContentType>(\n uid: T,\n strapi: Core.Strapi\n): CoreContentTypeRouteValidator => {\n return new CoreContentTypeRouteValidator(strapi, uid);\n};\n\nconst isCustomController = <T extends Core.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport {\n createCoreController,\n createCoreService,\n createCoreRouter,\n createCoreValidator,\n isCustomController,\n};\n"],"names":["symbols","CustomController","Symbol","createCoreController","uid","cfg","strapi","baseController","createController","contentType","userCtrl","methodName","Object","keys","undefined","setPrototypeOf","isCustom","defineProperty","writable","configurable","enumerable","createCoreService","baseService","createService","userService","createCoreRouter","prefix","config","only","except","type","routes","defaultRoutes","createRoutes","forEach","routeName","defaultRoute","availableRoutes","omit","selectedRoutes","pick","values","createCoreValidator","CoreContentTypeRouteValidator","isCustomController","controller"],"mappings":"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"}
|
package/dist/factories.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { omit, pick } from 'lodash';
|
|
2
2
|
import { createController } from './core-api/controller/index.mjs';
|
|
3
3
|
import '@strapi/utils';
|
|
4
4
|
import 'zod/v4';
|
|
@@ -69,7 +69,8 @@ function createCoreRouter(uid, cfg) {
|
|
|
69
69
|
const defaultRoute = defaultRoutes[routeName];
|
|
70
70
|
defaultRoute.config = config[routeName] ?? {};
|
|
71
71
|
});
|
|
72
|
-
const
|
|
72
|
+
const availableRoutes = except ? omit(defaultRoutes, except) : defaultRoutes;
|
|
73
|
+
const selectedRoutes = only ? pick(availableRoutes, only) : availableRoutes;
|
|
73
74
|
routes = Object.values(selectedRoutes);
|
|
74
75
|
}
|
|
75
76
|
return routes;
|
package/dist/factories.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factories.mjs","sources":["../src/factories.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"factories.mjs","sources":["../src/factories.ts"],"sourcesContent":["import { omit, pick } from 'lodash';\nimport type { Core, UID, Utils } from '@strapi/types';\n\nimport { createController } from './core-api/controller';\nimport { CoreContentTypeRouteValidator } from './core-api/routes/validation';\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: Core.Strapi }>(params: S) => T);\n\nconst createCoreController = <\n TUID extends UID.ContentType,\n TController extends Core.CoreAPI.Controller.Extendable<TUID>,\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<\n Utils.PartialWithThis<Core.CoreAPI.Controller.Extendable<TUID> & TController>\n >\n) => {\n return ({\n strapi,\n }: {\n strapi: Core.Strapi;\n }): TController & Core.CoreAPI.Controller.ContentType<TUID> => {\n const baseController = createController({ contentType: strapi.contentType(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 UID.ContentType,\n TService extends Core.CoreAPI.Service.Extendable<TUID>,\n>(\n uid: TUID,\n cfg?: WithStrapiCallback<Utils.PartialWithThis<Core.CoreAPI.Service.Extendable<TUID> & TService>>\n) {\n return ({\n strapi,\n }: {\n strapi: Core.Strapi;\n }): TService & Core.CoreAPI.Service.ContentType<TUID> => {\n const baseService = createService({ contentType: strapi.contentType(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 UID.ContentType>(\n uid: T,\n cfg?: Core.CoreAPI.Router.RouterConfig<T>\n): Core.CoreAPI.Router.Router {\n const { prefix, config = {}, only, except, type = 'content-api' } = cfg ?? {};\n let routes: Core.CoreAPI.Router.Route[];\n\n return {\n type,\n prefix,\n get routes(): Core.CoreAPI.Router.Route[] {\n if (!routes) {\n const contentType = strapi.contentType(uid);\n\n const defaultRoutes = createRoutes({ contentType, strapi });\n const keys = Object.keys(defaultRoutes) as Array<keyof typeof defaultRoutes>;\n\n keys.forEach((routeName) => {\n const defaultRoute = defaultRoutes[routeName];\n\n defaultRoute.config = (config[routeName] ?? {}) as Core.RouteConfig;\n });\n\n const availableRoutes = except ? omit(defaultRoutes, except) : defaultRoutes;\n const selectedRoutes = only ? pick(availableRoutes, only) : availableRoutes;\n\n routes = Object.values(selectedRoutes);\n }\n\n return routes;\n },\n };\n}\n\nconst createCoreValidator = <T extends UID.ContentType>(\n uid: T,\n strapi: Core.Strapi\n): CoreContentTypeRouteValidator => {\n return new CoreContentTypeRouteValidator(strapi, uid);\n};\n\nconst isCustomController = <T extends Core.Controller>(controller: T): boolean => {\n return symbols.CustomController in controller;\n};\n\nexport {\n createCoreController,\n createCoreService,\n createCoreRouter,\n createCoreValidator,\n isCustomController,\n};\n"],"names":["symbols","CustomController","Symbol","createCoreController","uid","cfg","strapi","baseController","createController","contentType","userCtrl","methodName","Object","keys","undefined","setPrototypeOf","isCustom","defineProperty","writable","configurable","enumerable","createCoreService","baseService","createService","userService","createCoreRouter","prefix","config","only","except","type","routes","defaultRoutes","createRoutes","forEach","routeName","defaultRoute","availableRoutes","omit","selectedRoutes","pick","values","createCoreValidator","CoreContentTypeRouteValidator","isCustomController","controller"],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apis.d.ts","sourceRoot":"","sources":["../../src/loaders/apis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apis.d.ts","sourceRoot":"","sources":["../../src/loaders/apis.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,eAAe,CAAC;AAkClD,wBAA8B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,iBAyBzD"}
|
package/dist/loaders/apis.js
CHANGED
|
@@ -4,7 +4,6 @@ var path = require('path');
|
|
|
4
4
|
var fse = require('fs-extra');
|
|
5
5
|
var _ = require('lodash');
|
|
6
6
|
var strapiUtils = require('@strapi/utils');
|
|
7
|
-
var fp = require('lodash/fp');
|
|
8
7
|
var index = require('../domain/content-type/index.js');
|
|
9
8
|
|
|
10
9
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -106,7 +105,7 @@ const loadContentTypes = async (apiName, dir)=>{
|
|
|
106
105
|
}
|
|
107
106
|
const contentTypeName = normalizeName(fd.name);
|
|
108
107
|
const loadedContentType = (await loadDir(path.join(dir, fd.name)))?.result;
|
|
109
|
-
if (
|
|
108
|
+
if (_.isEmpty(loadedContentType) || _.isEmpty(loadedContentType.schema)) {
|
|
110
109
|
throw new Error(`Could not load content type found at ${dir}`);
|
|
111
110
|
}
|
|
112
111
|
const contentType = {
|
package/dist/loaders/apis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apis.js","sources":["../../src/loaders/apis.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse, { existsSync } from 'fs-extra';\nimport _ from 'lodash';\nimport { strings, importDefault } from '@strapi/utils';\nimport { isEmpty } from 'lodash/fp';\nimport type { Core, Struct } from '@strapi/types';\nimport { getGlobalId, type ContentTypeDefinition } from '../domain/content-type';\n\ninterface API {\n bootstrap: () => void | Promise<void>;\n destroy: () => void | Promise<void>;\n register: () => void | Promise<void>;\n config: Record<string, unknown>;\n routes: Record<string, Core.Router>;\n controllers: Record<string, Core.Controller>;\n services: Record<string, Core.Service>;\n policies: Record<string, Core.Policy>;\n middlewares: Record<string, Core.Middleware>;\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>;\n}\n\ninterface APIs {\n [key: string]: API;\n}\n\nconst DEFAULT_CONTENT_TYPE = {\n schema: {},\n actions: {},\n lifecycles: {},\n};\n\n// to handle names with numbers in it we first check if it is already in kebabCase\nconst normalizeName = (name: string) => (strings.isKebabCase(name) ? name : _.kebabCase(name));\n\nconst isDirectory = (fd: fse.Dirent) => fd.isDirectory();\nconst isDotFile = (fd: fse.Dirent) => fd.name.startsWith('.');\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport default async function loadAPIs(strapi: Core.Strapi) {\n if (!existsSync(strapi.dirs.dist.api)) {\n return;\n }\n\n const apisFDs = await (await fse.readdir(strapi.dirs.dist.api, { withFileTypes: true }))\n .filter(isDirectory)\n .filter(_.negate(isDotFile));\n\n const apis: APIs = {};\n\n // only load folders\n for (const apiFD of apisFDs) {\n const apiName = normalizeName(apiFD.name);\n const api = await loadAPI(apiName, join(strapi.dirs.dist.api, apiFD.name));\n\n // @ts-expect-error TODO verify that it's a valid api, not missing bootstrap, register, and destroy\n apis[apiName] = api;\n }\n\n validateContentTypesUnicity(apis);\n\n for (const apiName of Object.keys(apis)) {\n strapi.get('apis').add(apiName, apis[apiName]);\n }\n}\n\nconst validateContentTypesUnicity = (apis: APIs) => {\n const allApisSchemas = Object.values(apis).flatMap((api) => Object.values(api.contentTypes));\n\n const names: string[] = [];\n allApisSchemas.forEach(({ schema }) => {\n if (schema.info.singularName) {\n const singularName = _.kebabCase(schema.info.singularName);\n if (names.includes(singularName)) {\n throw new Error(`The singular name \"${schema.info.singularName}\" should be unique`);\n }\n names.push(singularName);\n }\n\n if (schema.info.pluralName) {\n const pluralName = _.kebabCase(schema.info.pluralName);\n if (names.includes(pluralName)) {\n throw new Error(`The plural name \"${schema.info.pluralName}\" should be unique`);\n }\n names.push(pluralName);\n }\n });\n};\n\nconst loadAPI = async (apiName: string, dir: string) => {\n const [index, config, routes, controllers, services, policies, middlewares, contentTypes] = (\n await Promise.all([\n loadIndex(dir),\n loadDir(join(dir, 'config')),\n loadDir(join(dir, 'routes')),\n loadDir(join(dir, 'controllers')),\n loadDir(join(dir, 'services')),\n loadDir(join(dir, 'policies')),\n loadDir(join(dir, 'middlewares')),\n loadContentTypes(apiName, join(dir, 'content-types')),\n ])\n ).map((result) => result?.result);\n const apiIndex = isRecord(index) ? index : {};\n\n return {\n ...apiIndex,\n config: config || {},\n routes: routes || [],\n controllers: controllers || {},\n services: services || {},\n policies: policies || {},\n middlewares: middlewares || {},\n contentTypes: contentTypes || {},\n };\n};\n\nconst loadIndex = async (dir: string) => {\n if (await fse.pathExists(join(dir, 'index.js'))) {\n return loadFile(join(dir, 'index.js'));\n }\n};\n\n// because this is async and its contents are dynamic, we must return it within an object to avoid a property called `then` being interpreted as a Promise\nconst loadContentTypes = async (apiName: string, dir: string) => {\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const fds = await fse.readdir(dir, { withFileTypes: true });\n const contentTypes: API['contentTypes'] = {};\n\n // only load folders\n for (const fd of fds) {\n if (fd.isFile()) {\n continue;\n }\n\n const contentTypeName = normalizeName(fd.name);\n const loadedContentType = (await loadDir(join(dir, fd.name)))?.result;\n\n if (isEmpty(loadedContentType) || isEmpty(loadedContentType.schema)) {\n throw new Error(`Could not load content type found at ${dir}`);\n }\n\n const contentType = {\n ...DEFAULT_CONTENT_TYPE,\n ...loadedContentType,\n } as ContentTypeDefinition;\n\n Object.assign(contentType.schema, {\n apiName,\n collectionName: contentType.schema.collectionName || contentType.schema.info.singularName,\n globalId: getGlobalId(contentType.schema),\n });\n\n contentTypes[normalizeName(contentTypeName)] = contentType;\n }\n\n return { result: contentTypes };\n};\n\n// because this is async and its contents are dynamic, we must return it within an object to avoid a property called `then` being interpreted as a Promise\nconst loadDir = async (dir: string) => {\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const fds = await fse.readdir(dir, { withFileTypes: true });\n\n const root: Record<string, unknown> = {};\n for (const fd of fds) {\n if (!fd.isFile() || extname(fd.name) === '.map') {\n continue;\n }\n\n const key = basename(fd.name, extname(fd.name));\n\n root[normalizeName(key)] = (await loadFile(join(dir, fd.name))).result;\n }\n\n return { result: root };\n};\n\n// because this is async and its contents are dynamic, we must return it as an array to avoid a property called `then` being interpreted as a Promise\nconst loadFile = async (file: string): Promise<{ result: unknown }> => {\n const ext = extname(file);\n\n switch (ext) {\n case '.js':\n return { result: importDefault(file) };\n case '.json':\n return { result: await fse.readJSON(file) };\n default:\n return { result: {} };\n }\n};\n"],"names":["DEFAULT_CONTENT_TYPE","schema","actions","lifecycles","normalizeName","name","strings","isKebabCase","_","kebabCase","isDirectory","fd","isDotFile","startsWith","isRecord","value","Array","isArray","loadAPIs","strapi","existsSync","dirs","dist","api","apisFDs","fse","readdir","withFileTypes","filter","negate","apis","apiFD","apiName","loadAPI","join","validateContentTypesUnicity","Object","keys","get","add","allApisSchemas","values","flatMap","contentTypes","names","forEach","info","singularName","includes","Error","push","pluralName","dir","index","config","routes","controllers","services","policies","middlewares","Promise","all","loadIndex","loadDir","loadContentTypes","map","result","apiIndex","pathExists","loadFile","fds","isFile","contentTypeName","loadedContentType","isEmpty","contentType","assign","collectionName","globalId","getGlobalId","root","extname","key","basename","file","ext","importDefault","readJSON"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"apis.js","sources":["../../src/loaders/apis.ts"],"sourcesContent":["import { join, extname, basename } from 'path';\nimport fse, { existsSync } from 'fs-extra';\nimport _, { isEmpty } from 'lodash';\nimport { strings, importDefault } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\nimport { getGlobalId, type ContentTypeDefinition } from '../domain/content-type';\n\ninterface API {\n bootstrap: () => void | Promise<void>;\n destroy: () => void | Promise<void>;\n register: () => void | Promise<void>;\n config: Record<string, unknown>;\n routes: Record<string, Core.Router>;\n controllers: Record<string, Core.Controller>;\n services: Record<string, Core.Service>;\n policies: Record<string, Core.Policy>;\n middlewares: Record<string, Core.Middleware>;\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>;\n}\n\ninterface APIs {\n [key: string]: API;\n}\n\nconst DEFAULT_CONTENT_TYPE = {\n schema: {},\n actions: {},\n lifecycles: {},\n};\n\n// to handle names with numbers in it we first check if it is already in kebabCase\nconst normalizeName = (name: string) => (strings.isKebabCase(name) ? name : _.kebabCase(name));\n\nconst isDirectory = (fd: fse.Dirent) => fd.isDirectory();\nconst isDotFile = (fd: fse.Dirent) => fd.name.startsWith('.');\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport default async function loadAPIs(strapi: Core.Strapi) {\n if (!existsSync(strapi.dirs.dist.api)) {\n return;\n }\n\n const apisFDs = await (await fse.readdir(strapi.dirs.dist.api, { withFileTypes: true }))\n .filter(isDirectory)\n .filter(_.negate(isDotFile));\n\n const apis: APIs = {};\n\n // only load folders\n for (const apiFD of apisFDs) {\n const apiName = normalizeName(apiFD.name);\n const api = await loadAPI(apiName, join(strapi.dirs.dist.api, apiFD.name));\n\n // @ts-expect-error TODO verify that it's a valid api, not missing bootstrap, register, and destroy\n apis[apiName] = api;\n }\n\n validateContentTypesUnicity(apis);\n\n for (const apiName of Object.keys(apis)) {\n strapi.get('apis').add(apiName, apis[apiName]);\n }\n}\n\nconst validateContentTypesUnicity = (apis: APIs) => {\n const allApisSchemas = Object.values(apis).flatMap((api) => Object.values(api.contentTypes));\n\n const names: string[] = [];\n allApisSchemas.forEach(({ schema }) => {\n if (schema.info.singularName) {\n const singularName = _.kebabCase(schema.info.singularName);\n if (names.includes(singularName)) {\n throw new Error(`The singular name \"${schema.info.singularName}\" should be unique`);\n }\n names.push(singularName);\n }\n\n if (schema.info.pluralName) {\n const pluralName = _.kebabCase(schema.info.pluralName);\n if (names.includes(pluralName)) {\n throw new Error(`The plural name \"${schema.info.pluralName}\" should be unique`);\n }\n names.push(pluralName);\n }\n });\n};\n\nconst loadAPI = async (apiName: string, dir: string) => {\n const [index, config, routes, controllers, services, policies, middlewares, contentTypes] = (\n await Promise.all([\n loadIndex(dir),\n loadDir(join(dir, 'config')),\n loadDir(join(dir, 'routes')),\n loadDir(join(dir, 'controllers')),\n loadDir(join(dir, 'services')),\n loadDir(join(dir, 'policies')),\n loadDir(join(dir, 'middlewares')),\n loadContentTypes(apiName, join(dir, 'content-types')),\n ])\n ).map((result) => result?.result);\n const apiIndex = isRecord(index) ? index : {};\n\n return {\n ...apiIndex,\n config: config || {},\n routes: routes || [],\n controllers: controllers || {},\n services: services || {},\n policies: policies || {},\n middlewares: middlewares || {},\n contentTypes: contentTypes || {},\n };\n};\n\nconst loadIndex = async (dir: string) => {\n if (await fse.pathExists(join(dir, 'index.js'))) {\n return loadFile(join(dir, 'index.js'));\n }\n};\n\n// because this is async and its contents are dynamic, we must return it within an object to avoid a property called `then` being interpreted as a Promise\nconst loadContentTypes = async (apiName: string, dir: string) => {\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const fds = await fse.readdir(dir, { withFileTypes: true });\n const contentTypes: API['contentTypes'] = {};\n\n // only load folders\n for (const fd of fds) {\n if (fd.isFile()) {\n continue;\n }\n\n const contentTypeName = normalizeName(fd.name);\n const loadedContentType = (await loadDir(join(dir, fd.name)))?.result;\n\n if (isEmpty(loadedContentType) || isEmpty(loadedContentType.schema)) {\n throw new Error(`Could not load content type found at ${dir}`);\n }\n\n const contentType = {\n ...DEFAULT_CONTENT_TYPE,\n ...loadedContentType,\n } as ContentTypeDefinition;\n\n Object.assign(contentType.schema, {\n apiName,\n collectionName: contentType.schema.collectionName || contentType.schema.info.singularName,\n globalId: getGlobalId(contentType.schema),\n });\n\n contentTypes[normalizeName(contentTypeName)] = contentType;\n }\n\n return { result: contentTypes };\n};\n\n// because this is async and its contents are dynamic, we must return it within an object to avoid a property called `then` being interpreted as a Promise\nconst loadDir = async (dir: string) => {\n if (!(await fse.pathExists(dir))) {\n return;\n }\n\n const fds = await fse.readdir(dir, { withFileTypes: true });\n\n const root: Record<string, unknown> = {};\n for (const fd of fds) {\n if (!fd.isFile() || extname(fd.name) === '.map') {\n continue;\n }\n\n const key = basename(fd.name, extname(fd.name));\n\n root[normalizeName(key)] = (await loadFile(join(dir, fd.name))).result;\n }\n\n return { result: root };\n};\n\n// because this is async and its contents are dynamic, we must return it as an array to avoid a property called `then` being interpreted as a Promise\nconst loadFile = async (file: string): Promise<{ result: unknown }> => {\n const ext = extname(file);\n\n switch (ext) {\n case '.js':\n return { result: importDefault(file) };\n case '.json':\n return { result: await fse.readJSON(file) };\n default:\n return { result: {} };\n }\n};\n"],"names":["DEFAULT_CONTENT_TYPE","schema","actions","lifecycles","normalizeName","name","strings","isKebabCase","_","kebabCase","isDirectory","fd","isDotFile","startsWith","isRecord","value","Array","isArray","loadAPIs","strapi","existsSync","dirs","dist","api","apisFDs","fse","readdir","withFileTypes","filter","negate","apis","apiFD","apiName","loadAPI","join","validateContentTypesUnicity","Object","keys","get","add","allApisSchemas","values","flatMap","contentTypes","names","forEach","info","singularName","includes","Error","push","pluralName","dir","index","config","routes","controllers","services","policies","middlewares","Promise","all","loadIndex","loadDir","loadContentTypes","map","result","apiIndex","pathExists","loadFile","fds","isFile","contentTypeName","loadedContentType","isEmpty","contentType","assign","collectionName","globalId","getGlobalId","root","extname","key","basename","file","ext","importDefault","readJSON"],"mappings":"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"}
|
package/dist/loaders/apis.mjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { join, extname, basename } from 'path';
|
|
2
2
|
import fse, { existsSync } from 'fs-extra';
|
|
3
|
-
import _ from 'lodash';
|
|
3
|
+
import _, { isEmpty } from 'lodash';
|
|
4
4
|
import { strings, importDefault } from '@strapi/utils';
|
|
5
|
-
import { isEmpty } from 'lodash/fp';
|
|
6
5
|
import { getGlobalId } from '../domain/content-type/index.mjs';
|
|
7
6
|
|
|
8
7
|
const DEFAULT_CONTENT_TYPE = {
|