@strapi/core 5.46.0 → 5.47.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/core-api/routes/index.js +2 -0
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +2 -0
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +13 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +15 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +15 -2
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -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 +64 -30
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +64 -30
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +14 -12
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +14 -12
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +3 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/mcp.d.ts +3 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +39 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/mcp.mjs +37 -0
- package/dist/providers/mcp.mjs.map +1 -0
- package/dist/providers/session-manager.d.ts.map +1 -1
- package/dist/providers/session-manager.js +1 -2
- package/dist/providers/session-manager.js.map +1 -1
- package/dist/providers/session-manager.mjs +1 -2
- package/dist/providers/session-manager.mjs.map +1 -1
- package/dist/services/ai.d.ts.map +1 -1
- package/dist/services/ai.js +3 -0
- package/dist/services/ai.js.map +1 -1
- package/dist/services/ai.mjs +3 -0
- package/dist/services/ai.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +2 -16
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +0 -53
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +2 -53
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +2 -2
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/publication-filter.d.ts +6 -0
- package/dist/services/document-service/publication-filter.d.ts.map +1 -0
- package/dist/services/document-service/publication-filter.js +20 -0
- package/dist/services/document-service/publication-filter.js.map +1 -0
- package/dist/services/document-service/publication-filter.mjs +15 -0
- package/dist/services/document-service/publication-filter.mjs.map +1 -0
- package/dist/services/document-service/transform/query.d.ts +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +32 -19
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +33 -20
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/authentication.d.ts +23 -0
- package/dist/services/mcp/authentication.d.ts.map +1 -0
- package/dist/services/mcp/authentication.js +45 -0
- package/dist/services/mcp/authentication.js.map +1 -0
- package/dist/services/mcp/authentication.mjs +43 -0
- package/dist/services/mcp/authentication.mjs.map +1 -0
- package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
- package/dist/services/mcp/handlers/handlePost.js +59 -0
- package/dist/services/mcp/handlers/handlePost.js.map +1 -0
- package/dist/services/mcp/handlers/handlePost.mjs +57 -0
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
- package/dist/services/mcp/handlers/types.d.ts +12 -0
- package/dist/services/mcp/handlers/types.d.ts.map +1 -0
- package/dist/services/mcp/index.d.ts +6 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +101 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/index.mjs +99 -0
- package/dist/services/mcp/index.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.js +34 -0
- package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.js +71 -0
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
- package/dist/services/mcp/metrics/metrics.d.ts +29 -0
- package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/metrics.js +97 -0
- package/dist/services/mcp/metrics/metrics.js.map +1 -0
- package/dist/services/mcp/metrics/metrics.mjs +88 -0
- package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
- package/dist/services/mcp/prompt-registry.d.ts +16 -0
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
- package/dist/services/mcp/prompt-registry.js +77 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -0
- package/dist/services/mcp/prompt-registry.mjs +75 -0
- package/dist/services/mcp/prompt-registry.mjs.map +1 -0
- package/dist/services/mcp/resource-registry.d.ts +14 -0
- package/dist/services/mcp/resource-registry.d.ts.map +1 -0
- package/dist/services/mcp/resource-registry.js +67 -0
- package/dist/services/mcp/resource-registry.js.map +1 -0
- package/dist/services/mcp/resource-registry.mjs +65 -0
- package/dist/services/mcp/resource-registry.mjs.map +1 -0
- package/dist/services/mcp/routes.d.ts +11 -0
- package/dist/services/mcp/routes.d.ts.map +1 -0
- package/dist/services/mcp/routes.js +58 -0
- package/dist/services/mcp/routes.js.map +1 -0
- package/dist/services/mcp/routes.mjs +56 -0
- package/dist/services/mcp/routes.mjs.map +1 -0
- package/dist/services/mcp/tool-registry.d.ts +25 -0
- package/dist/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/services/mcp/tool-registry.js +102 -0
- package/dist/services/mcp/tool-registry.js.map +1 -0
- package/dist/services/mcp/tool-registry.mjs +99 -0
- package/dist/services/mcp/tool-registry.mjs.map +1 -0
- package/dist/services/mcp/tools/log.d.ts +87 -0
- package/dist/services/mcp/tools/log.d.ts.map +1 -0
- package/dist/services/mcp/tools/log.js +88 -0
- package/dist/services/mcp/tools/log.js.map +1 -0
- package/dist/services/mcp/tools/log.mjs +86 -0
- package/dist/services/mcp/tools/log.mjs.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
- package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
- package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
- package/dist/services/mcp/utils/withTimeout.js +23 -0
- package/dist/services/mcp/utils/withTimeout.js.map +1 -0
- package/dist/services/mcp/utils/withTimeout.mjs +21 -0
- package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +3 -1
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +3 -1
- package/dist/services/metrics/index.mjs.map +1 -1
- package/package.json +14 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct, UID } from '@strapi/types';\nimport { contentTypes, errors } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\n/**\n * Parses and sanitizes the hasPublishedVersion parameter.\n * Returns normalized boolean value or undefined if not provided.\n * Throws ValidationError for invalid input (400 response).\n */\nconst parseHasPublishedVersion = (value: unknown): boolean | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n throw new errors.ValidationError(\n \"Invalid value for 'hasPublishedVersion'. Expected boolean or 'true'/'false' string.\"\n );\n};\n\n/**\n * Synchronous helper that returns the \"has published version\" condition for a given model.\n * Returns the documentId subquery condition, or null if the model doesn't use draft & publish.\n *\n * This is used by the filters function in transform/query.ts so that the condition\n * is applied to both root and nested (populate) queries.\n */\nconst getHasPublishedVersionCondition = (\n uid: UID.Schema,\n hasPublishedVersion: boolean\n): Record<string, any> | null => {\n const model = strapi.getModel(uid);\n\n // Ignore if target model has disabled DP or doesn't exist (e.g., components)\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n // Get table and column names from metadata\n const meta = strapi.db.metadata.get(uid);\n const tableName = meta.tableName;\n const documentIdAttr = meta.attributes.documentId;\n const publishedAtAttr = meta.attributes.publishedAt;\n const documentIdColumn =\n ('columnName' in documentIdAttr && documentIdAttr.columnName) || 'document_id';\n const publishedAtColumn =\n ('columnName' in publishedAtAttr && publishedAtAttr.columnName) || 'published_at';\n\n // Create a Knex subquery that selects document IDs with published entries\n const knex = strapi.db.connection;\n const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);\n\n if (hasPublishedVersion) {\n return { documentId: { $in: subquery } };\n }\n\n return { documentId: { $notIn: subquery } };\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n parseHasPublishedVersion,\n getHasPublishedVersionCondition,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","parseHasPublishedVersion","value","undefined","errors","ValidationError","getHasPublishedVersionCondition","uid","hasPublishedVersion","model","strapi","getModel","meta","db","metadata","get","tableName","documentIdAttr","attributes","documentId","publishedAtAttr","documentIdColumn","columnName","publishedAtColumn","knex","connection","subquery","distinct","whereNotNull","$in","$notIn","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"draft-and-publish.mjs","sources":["../../../src/services/document-service/draft-and-publish.ts"],"sourcesContent":["import { assoc, curry } from 'lodash/fp';\n\nimport type { Modules, Struct } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\ntype ParamsTransform = (params: Modules.Documents.Params.All) => Modules.Documents.Params.All;\n\ntype TransformWithContentType = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\n/**\n * DP enabled -> set status to draft\n * DP disabled -> Used mostly for parsing relations, so there is not a need for a default.\n */\nconst setStatusToDraft: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType) && params.status) {\n return params;\n }\n\n return assoc('status', 'draft', params);\n};\n\n/**\n * Adds a default status of `draft` to the params\n */\nconst defaultToDraft: ParamsTransform = (params) => {\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return assoc('status', 'draft', params);\n }\n\n return params;\n};\n\n/**\n * DP disabled -> ignore status\n * DP enabled -> set status to draft if no status is provided or it's invalid\n */\nconst defaultStatus: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n // Default to draft if no status is provided or it's invalid\n if (!params.status || params.status !== 'published') {\n return defaultToDraft(params);\n }\n\n return params;\n};\n\n/**\n * In mutating actions we don't want user to set the publishedAt attribute.\n */\nconst filterDataPublishedAt: ParamsTransform = (params) => {\n if (params?.data?.publishedAt) {\n return assoc(['data', 'publishedAt'], null, params);\n }\n\n return params;\n};\n\n/**\n * Add status lookup query to the params\n */\nconst statusToLookup: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return params;\n }\n\n const lookup = params.lookup || {};\n\n switch (params?.status) {\n case 'published':\n return assoc(['lookup', 'publishedAt'], { $notNull: true }, params);\n case 'draft':\n return assoc(['lookup', 'publishedAt'], { $null: true }, params);\n default:\n break;\n }\n\n return assoc('lookup', lookup, params);\n};\n\n/**\n * Translate publication status parameter into the data that will be saved\n */\nconst statusToData: TransformWithContentType = (contentType, params) => {\n if (!contentTypes.hasDraftAndPublish(contentType)) {\n return assoc(['data', 'publishedAt'], new Date(), params);\n }\n\n switch (params?.status) {\n case 'published':\n return assoc(['data', 'publishedAt'], new Date(), params);\n case 'draft':\n return assoc(['data', 'publishedAt'], null, params);\n default:\n break;\n }\n\n return params;\n};\n\nconst setStatusToDraftCurry = curry(setStatusToDraft);\nconst defaultToDraftCurry = curry(defaultToDraft);\nconst defaultStatusCurry = curry(defaultStatus);\nconst filterDataPublishedAtCurry = curry(filterDataPublishedAt);\nconst statusToLookupCurry = curry(statusToLookup);\nconst statusToDataCurry = curry(statusToData);\n\nexport {\n setStatusToDraftCurry as setStatusToDraft,\n defaultToDraftCurry as defaultToDraft,\n defaultStatusCurry as defaultStatus,\n filterDataPublishedAtCurry as filterDataPublishedAt,\n statusToLookupCurry as statusToLookup,\n statusToDataCurry as statusToData,\n};\n"],"names":["setStatusToDraft","contentType","params","contentTypes","hasDraftAndPublish","status","assoc","defaultToDraft","defaultStatus","filterDataPublishedAt","data","publishedAt","statusToLookup","lookup","$notNull","$null","statusToData","Date","setStatusToDraftCurry","curry","defaultToDraftCurry","defaultStatusCurry","filterDataPublishedAtCurry","statusToLookupCurry","statusToDataCurry"],"mappings":"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"}
|
|
@@ -14,13 +14,13 @@ import type { UID, Modules } from '@strapi/types';
|
|
|
14
14
|
/**
|
|
15
15
|
* Keys passed to the query-params transformer. = SHARED_QUERY_PARAM_KEYS + withCount.
|
|
16
16
|
*/
|
|
17
|
-
export declare const ALLOWED_DOCUMENT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "hasPublishedVersion", "withCount"];
|
|
17
|
+
export declare const ALLOWED_DOCUMENT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "publicationFilter", "hasPublishedVersion", "withCount"];
|
|
18
18
|
/**
|
|
19
19
|
* Keys allowed at root when strictParams is true. = ALLOWED_DOCUMENT_PARAM_KEYS plus:
|
|
20
20
|
* - data: create/update payload (never part of query params)
|
|
21
21
|
* - pagination, count, ordering: REST-style keys core-api may pass; accepted then stripped (query builder uses flat page/pageSize/start/limit and does not use count/ordering at root)
|
|
22
22
|
*/
|
|
23
|
-
export declare const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "hasPublishedVersion", "withCount", "data", "pagination", "count", "ordering"];
|
|
23
|
+
export declare const ALLOWED_DOCUMENT_ROOT_PARAM_KEYS: readonly ["filters", "sort", "fields", "populate", "status", "locale", "page", "pageSize", "start", "limit", "_q", "publicationFilter", "hasPublishedVersion", "withCount", "data", "pagination", "count", "ordering"];
|
|
24
24
|
/** Restrict to allowed query keys so only these reach the query-params transformer (security). */
|
|
25
25
|
export declare const pickAllowedQueryParams: (params: Record<string, unknown>) => Record<(typeof ALLOWED_DOCUMENT_PARAM_KEYS)[number], unknown>;
|
|
26
26
|
declare const pickSelectionParams: <TUID extends UID.ContentType>(data: unknown) => Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,6KAAqD,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,wNAMnC,CAAC;AAEX,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,WACzB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAI5D,CAAC;AAEJ,QAAA,MAAM,mBAAmB,uCACjB,OAAO,KACZ,QAAQ,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAEtE,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UID } from '@strapi/types';
|
|
2
|
+
import { parsePublicationFilter, type PublicationFilterMode } from '@strapi/utils';
|
|
3
|
+
export { parsePublicationFilter };
|
|
4
|
+
export type { PublicationFilterMode };
|
|
5
|
+
export declare const getPublicationFilterCondition: (uid: UID.Schema, mode: PublicationFilterMode, status: 'draft' | 'published') => Record<string, unknown> | null;
|
|
6
|
+
//# sourceMappingURL=publication-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/publication-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAGL,sBAAsB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,6BAA6B,QACnC,IAAI,MAAM,QACT,qBAAqB,UACnB,OAAO,GAAG,WAAW,KAC5B,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAW5B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var strapiUtils = require('@strapi/utils');
|
|
4
|
+
|
|
5
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
6
|
+
const model = strapi.getModel(uid);
|
|
7
|
+
if (!model || !strapiUtils.contentTypes.hasDraftAndPublish(model)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const knex = strapi.db.connection;
|
|
11
|
+
const meta = strapi.db.metadata.get(uid);
|
|
12
|
+
return strapiUtils.buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Object.defineProperty(exports, "parsePublicationFilter", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return strapiUtils.parsePublicationFilter; }
|
|
18
|
+
});
|
|
19
|
+
exports.getPublicationFilterCondition = getPublicationFilterCondition;
|
|
20
|
+
//# sourceMappingURL=publication-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.js","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,wBAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,uCAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { contentTypes, buildPublicationFilterWhere } from '@strapi/utils';
|
|
2
|
+
export { parsePublicationFilter } from '@strapi/utils';
|
|
3
|
+
|
|
4
|
+
const getPublicationFilterCondition = (uid, mode, status)=>{
|
|
5
|
+
const model = strapi.getModel(uid);
|
|
6
|
+
if (!model || !contentTypes.hasDraftAndPublish(model)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const knex = strapi.db.connection;
|
|
10
|
+
const meta = strapi.db.metadata.get(uid);
|
|
11
|
+
return buildPublicationFilterWhere(knex, meta, model, mode, status);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { getPublicationFilterCondition };
|
|
15
|
+
//# sourceMappingURL=publication-filter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-filter.mjs","sources":["../../../src/services/document-service/publication-filter.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\nimport {\n contentTypes,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nexport { parsePublicationFilter };\nexport type { PublicationFilterMode };\n\nexport const getPublicationFilterCondition = (\n uid: UID.Schema,\n mode: PublicationFilterMode,\n status: 'draft' | 'published'\n): Record<string, unknown> | null => {\n const model = strapi.getModel(uid);\n\n if (!model || !contentTypes.hasDraftAndPublish(model)) {\n return null;\n }\n\n const knex = strapi.db.connection;\n const meta = strapi.db.metadata.get(uid);\n\n return buildPublicationFilterWhere(knex, meta, model, mode, status);\n};\n"],"names":["getPublicationFilterCondition","uid","mode","status","model","strapi","getModel","contentTypes","hasDraftAndPublish","knex","db","connection","meta","metadata","get","buildPublicationFilterWhere"],"mappings":";;;AAWO,MAAMA,6BAAAA,GAAgC,CAC3CC,GAAAA,EACAC,IAAAA,EACAC,MAAAA,GAAAA;IAEA,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACL,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACG,KAAAA,IAAS,CAACG,YAAAA,CAAaC,kBAAkB,CAACJ,KAAAA,CAAAA,EAAQ;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAOJ,MAAAA,CAAOK,EAAE,CAACC,UAAU;AACjC,IAAA,MAAMC,OAAOP,MAAAA,CAAOK,EAAE,CAACG,QAAQ,CAACC,GAAG,CAACb,GAAAA,CAAAA;AAEpC,IAAA,OAAOc,2BAAAA,CAA4BN,IAAAA,EAAMG,IAAAA,EAAMR,KAAAA,EAAOF,IAAAA,EAAMC,MAAAA,CAAAA;AAC9D;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
2
|
import type { UID } from '@strapi/types';
|
|
3
|
-
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, any
|
|
3
|
+
declare const transformParamsToQuery: import("lodash").CurriedFunction2<UID.Schema, any, Partial<any>>;
|
|
4
4
|
export { transformParamsToQuery };
|
|
5
5
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/query.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAazC,QAAA,MAAM,sBAAsB,kEAmE1B,CAAC;AAEH,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -1,21 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
|
-
var
|
|
4
|
+
var strapiUtils = require('@strapi/utils');
|
|
5
|
+
var publicationFilter = require('../publication-filter.js');
|
|
5
6
|
var params = require('../params.js');
|
|
6
7
|
|
|
7
8
|
const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
8
|
-
const
|
|
9
|
+
const rawParams = params$1 ?? {};
|
|
10
|
+
const allowlisted = params.pickAllowedQueryParams(rawParams);
|
|
9
11
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const explicitPublicationFilter = strapiUtils.parsePublicationFilter(allowlisted.publicationFilter);
|
|
13
|
+
const legacyHasPublishedVersion = strapiUtils.parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
14
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
15
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
16
|
+
effectivePublicationFilter = strapiUtils.hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
17
|
+
}
|
|
18
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
19
|
+
const baseWhere = {
|
|
20
|
+
...params$1?.lookup,
|
|
21
|
+
...query.where
|
|
22
|
+
};
|
|
23
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
24
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
25
|
+
const stripPublicationParamsFromQuery = fp.omit([
|
|
26
|
+
'publicationFilter',
|
|
27
|
+
'hasPublishedVersion'
|
|
28
|
+
]);
|
|
29
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
30
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
31
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
32
|
+
if (effectivePublicationFilter !== undefined) {
|
|
16
33
|
const existingFilters = query.filters;
|
|
17
|
-
|
|
18
|
-
// Get the existing filters result (from status param)
|
|
34
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
19
35
|
let existingResult = {};
|
|
20
36
|
if (typeof existingFilters === 'function') {
|
|
21
37
|
existingResult = existingFilters({
|
|
@@ -25,13 +41,11 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
25
41
|
} else if (existingFilters) {
|
|
26
42
|
existingResult = existingFilters;
|
|
27
43
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// Merge both conditions
|
|
31
|
-
if (hasPublishedCondition) {
|
|
44
|
+
const publicationCondition = publicationFilter.getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
45
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
32
46
|
const conditions = [
|
|
33
47
|
existingResult,
|
|
34
|
-
|
|
48
|
+
publicationCondition
|
|
35
49
|
].filter((c)=>Object.keys(c).length);
|
|
36
50
|
return {
|
|
37
51
|
$and: conditions
|
|
@@ -39,11 +53,10 @@ const transformParamsToQuery = fp.curry((uid, params$1)=>{
|
|
|
39
53
|
}
|
|
40
54
|
return existingResult;
|
|
41
55
|
};
|
|
56
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
57
|
+
return fp.assoc('where', baseWhere, fp.assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
42
58
|
}
|
|
43
|
-
return fp.assoc('where',
|
|
44
|
-
...params$1?.lookup,
|
|
45
|
-
...query.where
|
|
46
|
-
}, query);
|
|
59
|
+
return fp.assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
47
60
|
});
|
|
48
61
|
|
|
49
62
|
exports.transformParamsToQuery = transformParamsToQuery;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.js","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;;;AAaA,MAAMA,sBAAAA,GAAyBC,QAAAA,CAAM,CAACC,GAAAA,EAAiBC,QAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,YAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,6BAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,kCAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,8CAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,6DAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,UAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,OAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,+CAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,QAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,QAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,QAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -1,19 +1,35 @@
|
|
|
1
|
-
import { curry, assoc } from 'lodash/fp';
|
|
2
|
-
import {
|
|
1
|
+
import { curry, omit, assoc } from 'lodash/fp';
|
|
2
|
+
import { parsePublicationFilter, parseHasPublishedVersionQueryParam, hasPublishedVersionBooleanToPublicationFilterMode } from '@strapi/utils';
|
|
3
|
+
import { getPublicationFilterCondition } from '../publication-filter.mjs';
|
|
3
4
|
import { pickAllowedQueryParams } from '../params.mjs';
|
|
4
5
|
|
|
5
6
|
const transformParamsToQuery = curry((uid, params)=>{
|
|
6
|
-
const
|
|
7
|
+
const rawParams = params ?? {};
|
|
8
|
+
const allowlisted = pickAllowedQueryParams(rawParams);
|
|
7
9
|
const query = strapi.get('query-params').transform(uid, allowlisted);
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);
|
|
11
|
+
const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(rawParams.hasPublishedVersion);
|
|
12
|
+
let effectivePublicationFilter = explicitPublicationFilter;
|
|
13
|
+
if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {
|
|
14
|
+
effectivePublicationFilter = hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);
|
|
15
|
+
}
|
|
16
|
+
const status = allowlisted.status === 'published' ? 'published' : 'draft';
|
|
17
|
+
const baseWhere = {
|
|
18
|
+
...params?.lookup,
|
|
19
|
+
...query.where
|
|
20
|
+
};
|
|
21
|
+
// `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object
|
|
22
|
+
// via `...rest`; the DB layer must not receive them as extra top-level keys.
|
|
23
|
+
const stripPublicationParamsFromQuery = omit([
|
|
24
|
+
'publicationFilter',
|
|
25
|
+
'hasPublishedVersion'
|
|
26
|
+
]);
|
|
27
|
+
// Publication filtering must go through `query.filters`, not only `where`, so the same
|
|
28
|
+
// cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).
|
|
29
|
+
// Merging into `where` alone breaks populate cascade — see has-published-version API tests.
|
|
30
|
+
if (effectivePublicationFilter !== undefined) {
|
|
14
31
|
const existingFilters = query.filters;
|
|
15
|
-
|
|
16
|
-
// Get the existing filters result (from status param)
|
|
32
|
+
const wrappedFilters = ({ meta, ...rest })=>{
|
|
17
33
|
let existingResult = {};
|
|
18
34
|
if (typeof existingFilters === 'function') {
|
|
19
35
|
existingResult = existingFilters({
|
|
@@ -23,13 +39,11 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
23
39
|
} else if (existingFilters) {
|
|
24
40
|
existingResult = existingFilters;
|
|
25
41
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Merge both conditions
|
|
29
|
-
if (hasPublishedCondition) {
|
|
42
|
+
const publicationCondition = getPublicationFilterCondition(meta.uid, effectivePublicationFilter, status);
|
|
43
|
+
if (publicationCondition && Object.keys(publicationCondition).length > 0) {
|
|
30
44
|
const conditions = [
|
|
31
45
|
existingResult,
|
|
32
|
-
|
|
46
|
+
publicationCondition
|
|
33
47
|
].filter((c)=>Object.keys(c).length);
|
|
34
48
|
return {
|
|
35
49
|
$and: conditions
|
|
@@ -37,11 +51,10 @@ const transformParamsToQuery = curry((uid, params)=>{
|
|
|
37
51
|
}
|
|
38
52
|
return existingResult;
|
|
39
53
|
};
|
|
54
|
+
const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);
|
|
55
|
+
return assoc('where', baseWhere, assoc('filters', wrappedFilters, queryWithoutPublicationParams));
|
|
40
56
|
}
|
|
41
|
-
return assoc('where',
|
|
42
|
-
...params?.lookup,
|
|
43
|
-
...query.where
|
|
44
|
-
}, query);
|
|
57
|
+
return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));
|
|
45
58
|
});
|
|
46
59
|
|
|
47
60
|
export { transformParamsToQuery };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc } from 'lodash/fp';\nimport {
|
|
1
|
+
{"version":3,"file":"query.mjs","sources":["../../../../src/services/document-service/transform/query.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\nimport { curry, assoc, omit } from 'lodash/fp';\nimport {\n parseHasPublishedVersionQueryParam,\n hasPublishedVersionBooleanToPublicationFilterMode,\n type PublicationFilterMode,\n} from '@strapi/utils';\n\nimport { parsePublicationFilter, getPublicationFilterCondition } from '../publication-filter';\n\nimport { pickAllowedQueryParams } from '../params';\n\nconst transformParamsToQuery = curry((uid: UID.Schema, params: any) => {\n const rawParams = (params ?? {}) as Record<string, unknown>;\n const allowlisted = pickAllowedQueryParams(rawParams);\n const query = strapi.get('query-params').transform(uid, allowlisted);\n\n const explicitPublicationFilter = parsePublicationFilter(allowlisted.publicationFilter);\n const legacyHasPublishedVersion = parseHasPublishedVersionQueryParam(\n rawParams.hasPublishedVersion\n );\n\n let effectivePublicationFilter: PublicationFilterMode | undefined = explicitPublicationFilter;\n if (effectivePublicationFilter === undefined && legacyHasPublishedVersion !== undefined) {\n effectivePublicationFilter =\n hasPublishedVersionBooleanToPublicationFilterMode(legacyHasPublishedVersion);\n }\n\n const status: 'draft' | 'published' = allowlisted.status === 'published' ? 'published' : 'draft';\n\n const baseWhere = { ...params?.lookup, ...query.where };\n\n // `transformQueryParams` leaves `publicationFilter` / `hasPublishedVersion` on the query object\n // via `...rest`; the DB layer must not receive them as extra top-level keys.\n const stripPublicationParamsFromQuery = omit([\n 'publicationFilter',\n 'hasPublishedVersion',\n ] as const);\n\n // Publication filtering must go through `query.filters`, not only `where`, so the same\n // cohort logic applies to nested populate queries (each sub-query uses `meta.uid`).\n // Merging into `where` alone breaks populate cascade — see has-published-version API tests.\n if (effectivePublicationFilter !== undefined) {\n const existingFilters = query.filters;\n\n const wrappedFilters = ({ meta, ...rest }: { meta: { uid: UID.Schema } }) => {\n let existingResult = {};\n if (typeof existingFilters === 'function') {\n existingResult = existingFilters({ meta, ...rest }) || {};\n } else if (existingFilters) {\n existingResult = existingFilters;\n }\n\n const publicationCondition = getPublicationFilterCondition(\n meta.uid,\n effectivePublicationFilter,\n status\n );\n\n if (publicationCondition && Object.keys(publicationCondition).length > 0) {\n const conditions = [existingResult, publicationCondition].filter(\n (c) => Object.keys(c).length\n );\n return { $and: conditions };\n }\n\n return existingResult;\n };\n\n const queryWithoutPublicationParams = stripPublicationParamsFromQuery(query);\n\n return assoc(\n 'where',\n baseWhere,\n assoc('filters', wrappedFilters, queryWithoutPublicationParams)\n );\n }\n\n return assoc('where', baseWhere, stripPublicationParamsFromQuery(query));\n});\n\nexport { transformParamsToQuery };\n"],"names":["transformParamsToQuery","curry","uid","params","rawParams","allowlisted","pickAllowedQueryParams","query","strapi","get","transform","explicitPublicationFilter","parsePublicationFilter","publicationFilter","legacyHasPublishedVersion","parseHasPublishedVersionQueryParam","hasPublishedVersion","effectivePublicationFilter","undefined","hasPublishedVersionBooleanToPublicationFilterMode","status","baseWhere","lookup","where","stripPublicationParamsFromQuery","omit","existingFilters","filters","wrappedFilters","meta","rest","existingResult","publicationCondition","getPublicationFilterCondition","Object","keys","length","conditions","filter","c","$and","queryWithoutPublicationParams","assoc"],"mappings":";;;;;AAaA,MAAMA,sBAAAA,GAAyBC,KAAAA,CAAM,CAACC,GAAAA,EAAiBC,MAAAA,GAAAA;IACrD,MAAMC,SAAAA,GAAaD,UAAU,EAAC;AAC9B,IAAA,MAAME,cAAcC,sBAAAA,CAAuBF,SAAAA,CAAAA;AAC3C,IAAA,MAAMG,QAAQC,MAAAA,CAAOC,GAAG,CAAC,cAAA,CAAA,CAAgBC,SAAS,CAACR,GAAAA,EAAKG,WAAAA,CAAAA;IAExD,MAAMM,yBAAAA,GAA4BC,sBAAAA,CAAuBP,WAAAA,CAAYQ,iBAAiB,CAAA;IACtF,MAAMC,yBAAAA,GAA4BC,kCAAAA,CAChCX,SAAAA,CAAUY,mBAAmB,CAAA;AAG/B,IAAA,IAAIC,0BAAAA,GAAgEN,yBAAAA;IACpE,IAAIM,0BAAAA,KAA+BC,SAAAA,IAAaJ,yBAAAA,KAA8BI,SAAAA,EAAW;AACvFD,QAAAA,0BAAAA,GACEE,iDAAAA,CAAkDL,yBAAAA,CAAAA;AACtD,IAAA;AAEA,IAAA,MAAMM,MAAAA,GAAgCf,WAAAA,CAAYe,MAAM,KAAK,cAAc,WAAA,GAAc,OAAA;AAEzF,IAAA,MAAMC,SAAAA,GAAY;AAAE,QAAA,GAAGlB,QAAQmB,MAAM;AAAE,QAAA,GAAGf,MAAMgB;AAAM,KAAA;;;AAItD,IAAA,MAAMC,kCAAkCC,IAAAA,CAAK;AAC3C,QAAA,mBAAA;AACA,QAAA;AACD,KAAA,CAAA;;;;AAKD,IAAA,IAAIR,+BAA+BC,SAAAA,EAAW;QAC5C,MAAMQ,eAAAA,GAAkBnB,MAAMoB,OAAO;AAErC,QAAA,MAAMC,iBAAiB,CAAC,EAAEC,IAAI,EAAE,GAAGC,IAAAA,EAAqC,GAAA;AACtE,YAAA,IAAIC,iBAAiB,EAAC;YACtB,IAAI,OAAOL,oBAAoB,UAAA,EAAY;AACzCK,gBAAAA,cAAAA,GAAiBL,eAAAA,CAAgB;AAAEG,oBAAAA,IAAAA;AAAM,oBAAA,GAAGC;AAAK,iBAAA,CAAA,IAAM,EAAC;AAC1D,YAAA,CAAA,MAAO,IAAIJ,eAAAA,EAAiB;gBAC1BK,cAAAA,GAAiBL,eAAAA;AACnB,YAAA;AAEA,YAAA,MAAMM,oBAAAA,GAAuBC,6BAAAA,CAC3BJ,IAAAA,CAAK3B,GAAG,EACRe,0BAAAA,EACAG,MAAAA,CAAAA;AAGF,YAAA,IAAIY,wBAAwBE,MAAAA,CAAOC,IAAI,CAACH,oBAAAA,CAAAA,CAAsBI,MAAM,GAAG,CAAA,EAAG;AACxE,gBAAA,MAAMC,UAAAA,GAAa;AAACN,oBAAAA,cAAAA;AAAgBC,oBAAAA;iBAAqB,CAACM,MAAM,CAC9D,CAACC,CAAAA,GAAML,OAAOC,IAAI,CAACI,GAAGH,MAAM,CAAA;gBAE9B,OAAO;oBAAEI,IAAAA,EAAMH;AAAW,iBAAA;AAC5B,YAAA;YAEA,OAAON,cAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMU,gCAAgCjB,+BAAAA,CAAgCjB,KAAAA,CAAAA;AAEtE,QAAA,OAAOmC,KAAAA,CACL,OAAA,EACArB,SAAAA,EACAqB,KAAAA,CAAM,WAAWd,cAAAA,EAAgBa,6BAAAA,CAAAA,CAAAA;AAErC,IAAA;IAEA,OAAOC,KAAAA,CAAM,OAAA,EAASrB,SAAAA,EAAWG,+BAAAA,CAAgCjB,KAAAA,CAAAA,CAAAA;AACnE,CAAA;;;;"}
|
|
@@ -74,7 +74,7 @@ const codeBlockValidator = strapiUtils.yup.object().shape({
|
|
|
74
74
|
type: strapiUtils.yup.string().equals([
|
|
75
75
|
'code'
|
|
76
76
|
]).required(),
|
|
77
|
-
|
|
77
|
+
language: strapiUtils.yup.string().nullable(),
|
|
78
78
|
children: strapiUtils.yup.array().of(textNodeValidator).min(1, 'Quote node children must have at least one Text or Link node').required()
|
|
79
79
|
});
|
|
80
80
|
const listItemNode = strapiUtils.yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ const codeBlockValidator = yup.object().shape({
|
|
|
72
72
|
type: yup.string().equals([
|
|
73
73
|
'code'
|
|
74
74
|
]).required(),
|
|
75
|
-
|
|
75
|
+
language: yup.string().nullable(),
|
|
76
76
|
children: yup.array().of(textNodeValidator).min(1, 'Quote node children must have at least one Text or Link node').required()
|
|
77
77
|
});
|
|
78
78
|
const listItemNode = yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","syntax","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","error","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Core, Data } from '@strapi/types';
|
|
2
|
+
import type { Ability } from '@casl/ability';
|
|
3
|
+
import type { Context } from 'koa';
|
|
4
|
+
export type McpAdminTokenAbility = Ability;
|
|
5
|
+
export type McpAuthFailureReason = 'missing_token' | 'invalid_token';
|
|
6
|
+
export type McpAdminTokenAuthResult = {
|
|
7
|
+
authenticated: false;
|
|
8
|
+
reason: McpAuthFailureReason;
|
|
9
|
+
error?: Error;
|
|
10
|
+
} | {
|
|
11
|
+
authenticated: true;
|
|
12
|
+
credentials: {
|
|
13
|
+
id: Data.ID;
|
|
14
|
+
};
|
|
15
|
+
user: {
|
|
16
|
+
id: Data.ID;
|
|
17
|
+
};
|
|
18
|
+
ability: McpAdminTokenAbility;
|
|
19
|
+
};
|
|
20
|
+
export declare const createMcpAdminTokenAuthenticator: (strapi: Core.Strapi) => {
|
|
21
|
+
authenticate(ctx: Context): Promise<McpAdminTokenAuthResult>;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=authentication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,eAAe,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,aAAa,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACrE;IACE,aAAa,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAA;KAAE,CAAC;IAC7B,IAAI,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAA;KAAE,CAAC;IACtB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAkBN,eAAO,MAAM,gCAAgC,WAAY,KAAK,MAAM;sBAC1C,OAAO,GAAG,QAAQ,uBAAuB,CAAC;CA0BlE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const extractBearerToken = (ctx)=>{
|
|
4
|
+
const authorization = ctx.request.header.authorization;
|
|
5
|
+
if (authorization === undefined) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const parts = authorization.split(/\s+/);
|
|
9
|
+
if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return parts[1];
|
|
13
|
+
};
|
|
14
|
+
const createMcpAdminTokenAuthenticator = (strapi)=>({
|
|
15
|
+
async authenticate (ctx) {
|
|
16
|
+
const token = extractBearerToken(ctx);
|
|
17
|
+
if (token === null) {
|
|
18
|
+
return {
|
|
19
|
+
authenticated: false,
|
|
20
|
+
reason: 'missing_token'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const authResult = await strapi.admin.services['api-token-admin'].authenticateAdminToken(token);
|
|
24
|
+
if (authResult.authenticated === false) {
|
|
25
|
+
return {
|
|
26
|
+
authenticated: false,
|
|
27
|
+
reason: 'invalid_token',
|
|
28
|
+
error: authResult.error
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
authenticated: true,
|
|
33
|
+
credentials: {
|
|
34
|
+
id: authResult.credentials.id
|
|
35
|
+
},
|
|
36
|
+
user: {
|
|
37
|
+
id: authResult.user.id
|
|
38
|
+
},
|
|
39
|
+
ability: authResult.ability
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
exports.createMcpAdminTokenAuthenticator = createMcpAdminTokenAuthenticator;
|
|
45
|
+
//# sourceMappingURL=authentication.js.map
|