@strapi/content-manager 5.61.1 → 5.62.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/admin/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape-relations.mjs","sources":["../../../../server/src/mcp/sanitizers/shape-relations.ts"],"sourcesContent":["import { traverseEntity } from '@strapi/utils';\nimport type { UID } from '@strapi/types';\n\n// Relations whose cardinality is \"many\" — maps to Array output.\n// Includes non-owning variants and morph-many.\nconst MANY_RELATION_TYPES = new Set([\n 'oneToMany',\n 'manyToMany',\n 'manyWay',\n 'morphToMany',\n 'morphMany',\n]);\n\n/**\n * Canonical \"is this relation a list\" predicate for the MCP output boundary.\n * Both the runtime shaping (reduceToIdentity) and the registered output schemas\n * (output-schemas.ts) MUST use this single definition — the MCP SDK validates\n * structuredContent against the schema, so any divergence fails the tool call.\n * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which\n * ignores `manyWay` and the morph variants.\n */\nexport const isManyRelationForMcp = (attribute: { relation?: string }): boolean =>\n MANY_RELATION_TYPES.has(attribute.relation ?? '');\n\ntype RelationIdentity = {\n documentId: string;\n locale?: string;\n __type?: string;\n status?: string;\n};\n\n/**\n * Extracts identity fields from a single relation entry.\n * Returns undefined when the entry has no documentId (e.g. a bare {count} object).\n */\nconst pickIdentity = (entry: unknown): RelationIdentity | undefined => {\n if (entry === null || typeof entry !== 'object') {\n return undefined;\n }\n\n const obj = entry as Record<string, unknown>;\n\n if (typeof obj.documentId !== 'string') {\n return undefined;\n }\n\n const identity: RelationIdentity = { documentId: obj.documentId };\n\n if (typeof obj.locale === 'string') {\n identity.locale = obj.locale;\n }\n\n if (typeof obj.__type === 'string') {\n identity.__type = obj.__type;\n }\n\n // Preserve the computed publish status on `localizations` entries — it is\n // calculated by formatDocumentWithMetadata BEFORE shaping (calculate, then strip).\n // Non-localization relation entries never carry a string `status`, so this is a no-op for them.\n if (typeof obj.status === 'string') {\n identity.status = obj.status;\n }\n\n return identity;\n};\n\n/**\n * Reduces a populated relation value to identity-only shape.\n *\n * to-one → { documentId, locale?, __type? } | null\n * to-many → Array<{ documentId, locale?, __type? }> ([] when empty)\n */\nconst reduceToIdentity = (\n attribute: { relation?: string },\n value: unknown\n): RelationIdentity | RelationIdentity[] | null => {\n const isMany = isManyRelationForMcp(attribute);\n\n if (isMany) {\n if (Array.isArray(value)) {\n return value.map(pickIdentity).filter((v): v is RelationIdentity => v !== undefined);\n }\n // defensive: { count: N } or null/undefined → empty array\n return [];\n }\n\n // to-one\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n // should not happen, but guard: treat first element\n return pickIdentity(value[0]) ?? null;\n }\n\n return pickIdentity(value) ?? null;\n};\n\n/**\n * Post-sanitize shaping visitor.\n * Reduces every relation attribute to identity-only (documentId + locale? + __type?).\n * Skips admin::user relations — those are out of scope and preserved as-is.\n */\nconst shapeRelationToIdentity: Parameters<typeof traverseEntity>[0] = (\n { key, value, attribute },\n { set }\n) => {\n if (attribute?.type !== 'relation') {\n return;\n }\n\n const target = (attribute as { target?: string }).target;\n\n // Out of scope — admin user records are preserved untouched (tracked separately).\n if (target === 'admin::user') {\n return;\n }\n\n
|
|
1
|
+
{"version":3,"file":"shape-relations.mjs","sources":["../../../../server/src/mcp/sanitizers/shape-relations.ts"],"sourcesContent":["import { traverseEntity } from '@strapi/utils';\nimport type { UID } from '@strapi/types';\n\n// Relations whose cardinality is \"many\" — maps to Array output.\n// Includes non-owning variants and morph-many.\nconst MANY_RELATION_TYPES = new Set([\n 'oneToMany',\n 'manyToMany',\n 'manyWay',\n 'morphToMany',\n 'morphMany',\n]);\n\n/**\n * Canonical \"is this relation a list\" predicate for the MCP output boundary.\n * Both the runtime shaping (reduceToIdentity) and the registered output schemas\n * (output-schemas.ts) MUST use this single definition — the MCP SDK validates\n * structuredContent against the schema, so any divergence fails the tool call.\n * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which\n * ignores `manyWay` and the morph variants.\n */\nexport const isManyRelationForMcp = (attribute: { relation?: string }): boolean =>\n MANY_RELATION_TYPES.has(attribute.relation ?? '');\n\ntype RelationIdentity = {\n documentId: string;\n locale?: string;\n __type?: string;\n status?: string;\n};\n\n/**\n * Extracts identity fields from a single relation entry.\n * Returns undefined when the entry has no documentId (e.g. a bare {count} object).\n */\nconst pickIdentity = (entry: unknown): RelationIdentity | undefined => {\n if (entry === null || typeof entry !== 'object') {\n return undefined;\n }\n\n const obj = entry as Record<string, unknown>;\n\n if (typeof obj.documentId !== 'string') {\n return undefined;\n }\n\n const identity: RelationIdentity = { documentId: obj.documentId };\n\n if (typeof obj.locale === 'string') {\n identity.locale = obj.locale;\n }\n\n if (typeof obj.__type === 'string') {\n identity.__type = obj.__type;\n }\n\n // Preserve the computed publish status on `localizations` entries — it is\n // calculated by formatDocumentWithMetadata BEFORE shaping (calculate, then strip).\n // Non-localization relation entries never carry a string `status`, so this is a no-op for them.\n if (typeof obj.status === 'string') {\n identity.status = obj.status;\n }\n\n return identity;\n};\n\n/**\n * Reduces a populated relation value to identity-only shape.\n *\n * to-one → { documentId, locale?, __type? } | null\n * to-many → Array<{ documentId, locale?, __type? }> ([] when empty)\n */\nconst reduceToIdentity = (\n attribute: { relation?: string },\n value: unknown\n): RelationIdentity | RelationIdentity[] | null => {\n const isMany = isManyRelationForMcp(attribute);\n\n if (isMany) {\n if (Array.isArray(value)) {\n return value.map(pickIdentity).filter((v): v is RelationIdentity => v !== undefined);\n }\n // defensive: { count: N } or null/undefined → empty array\n return [];\n }\n\n // to-one\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n // should not happen, but guard: treat first element\n return pickIdentity(value[0]) ?? null;\n }\n\n return pickIdentity(value) ?? null;\n};\n\n/**\n * Post-sanitize shaping visitor.\n * Reduces every relation attribute to identity-only (documentId + locale? + __type?).\n * Skips admin::user relations — those are out of scope and preserved as-is.\n */\nconst shapeRelationToIdentity: Parameters<typeof traverseEntity>[0] = (\n { key, value, attribute },\n { set }\n) => {\n if (attribute?.type !== 'relation') {\n return;\n }\n\n const target = (attribute as { target?: string }).target;\n\n // Out of scope — admin user records are preserved untouched (tracked separately).\n if (target === 'admin::user') {\n return;\n }\n\n set(key, reduceToIdentity(attribute as { relation?: string }, value));\n};\n\n/**\n * Applies identity shaping to all relation fields in a document, including\n * nested fields inside components, dynamic zones, and `localizations`.\n *\n * This covers leak family #1 (relation targets) and #2 (localizations full draft rows)\n * with the same single mechanism.\n */\nexport const shapeRelationsForMcp = async (\n uid: UID.Schema,\n data: Record<string, unknown>\n): Promise<Record<string, unknown>> => {\n return traverseEntity(\n shapeRelationToIdentity,\n {\n schema: strapi.getModel(uid),\n getModel: strapi.getModel.bind(strapi),\n },\n data\n );\n};\n\n// Export for unit-testing without a full strapi instance\nexport { reduceToIdentity, MANY_RELATION_TYPES };\n"],"names":["MANY_RELATION_TYPES","Set","isManyRelationForMcp","attribute","has","relation","pickIdentity","entry","undefined","obj","documentId","identity","locale","__type","status","reduceToIdentity","value","isMany","Array","isArray","map","filter","v","shapeRelationToIdentity","key","set","type","target","shapeRelationsForMcp","uid","data","traverseEntity","schema","strapi","getModel","bind"],"mappings":"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"}
|
|
@@ -44,7 +44,8 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
|
|
|
44
44
|
data: buildOutputDataSchema(attributes, readFields).nullable(),
|
|
45
45
|
meta: strapiUtils.z.object({
|
|
46
46
|
availableLocales: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional(),
|
|
47
|
-
availableStatus: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional()
|
|
47
|
+
availableStatus: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional(),
|
|
48
|
+
defaultLocale: strapiUtils.z.string().nullable().optional()
|
|
48
49
|
}).optional()
|
|
49
50
|
}).loose();
|
|
50
51
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":";;;;;AAKA,MAAMA,gBAAAA,GAAmBC,aAAAA,CAAEC,MAAM,CAAC;AAChCC,IAAAA,UAAAA,EAAYF,cAAEG,MAAM,EAAA;IACpBC,MAAAA,EAAQJ,aAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ,EAAA;IAC3BC,MAAAA,EAAQN,aAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ,EAAA;;IAE3BE,MAAAA,EAAQP,aAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMG,oBAAAA,GAAuB,CAACC,GAAAA,EAAaC,UAAAA,GAAAA;IACzC,MAAMC,SAAAA,GAAYD,UAAU,CAACD,GAAAA,CAAI;IAEjC,IAAIE,SAAAA,EAAWC,SAAS,UAAA,EAAY;QAClC,OAAOZ,aAAAA,CAAEa,OAAO,EAAA,CAAGR,QAAQ,EAAA;AAC7B,IAAA;;AAGA,IAAA,IAAI,SAACM,CAAkCG,MAAM,KAAK,aAAA,EAAe;QAC/D,OAAOd,aAAAA,CAAEa,OAAO,EAAA,CAAGR,QAAQ,EAAA;AAC7B,IAAA;;;AAIA,IAAA,IAAIU,oCAAqBJ,SAAAA,CAAAA,EAAqC;AAC5D,QAAA,OAAOX,aAAAA,CAAEgB,KAAK,CAACjB,gBAAAA,CAAAA,CAAkBM,QAAQ,EAAA;AAC3C,IAAA;IAEA,OAAON,gBAAAA,CAAiBkB,QAAQ,EAAA,CAAGZ,QAAQ,EAAA;AAC7C,CAAA;AAEA,MAAMa,qBAAAA,GAAwB,CAC5BR,UAAAA,EACAS,eAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,IAAI,CAACZ,UAAAA,CAAAA,CAAYa,MAAM,CACjD,CAACd,GAAAA,GAAQU,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,CAAgBK,GAAG,CAACf,GAAAA,CAAAA,CAAAA;IAG3D,IAAIW,YAAAA,CAAaK,MAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAOzB,cAAE0B,MAAM,CAAC1B,cAAEG,MAAM,EAAA,EAAIH,cAAEa,OAAO,EAAA,CAAA;AACvC,IAAA;IAEA,MAAMc,KAAAA,GAAQN,OAAOO,WAAW,CAC9BR,aAAaS,GAAG,CAAC,CAACpB,GAAAA,GAAQ;AAACA,YAAAA,GAAAA;AAAKD,YAAAA,oBAAAA,CAAqBC,GAAAA,EAAKC,UAAAA;AAAY,SAAA,CAAA,CAAA;AAGxE,IAAA,OAAOV,aAAAA,CAAEC,MAAM,CAAC0B,KAAAA,CAAAA,CAAOG,KAAK,EAAA;AAC9B,CAAA;AAEA;;;UAIaC,yBAAAA,GAA4B,CACvCrB,YACAsB,UAAAA,GAEAhC,aAAAA,CACGC,MAAM,CAAC;QACNgC,IAAAA,EAAMf,qBAAAA,CAAsBR,UAAAA,EAAYsB,UAAAA,CAAAA,CAAYf,QAAQ,EAAA;QAC5DiB,IAAAA,EAAMlC,aAAAA,CACHC,MAAM,CAAC;AACNkC,YAAAA,gBAAAA,EAAkBnC,aAAAA,CAAEgB,KAAK,CAAChB,aAAAA,CAAE0B,MAAM,CAAC1B,aAAAA,CAAEG,MAAM,EAAA,EAAIH,aAAAA,CAAEa,OAAO,EAAA,CAAA,CAAA,CAAKR,QAAQ,EAAA;AACrE+B,YAAAA,eAAAA,EAAiBpC,aAAAA,CAAEgB,KAAK,CAAChB,aAAAA,CAAE0B,MAAM,CAAC1B,aAAAA,CAAEG,MAAM,EAAA,EAAIH,aAAAA,CAAEa,OAAO,EAAA,CAAA,CAAA,CAAKR,QAAQ;
|
|
1
|
+
{"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n defaultLocale: z.string().nullable().optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","defaultLocale","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
|
|
@@ -42,7 +42,8 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
|
|
|
42
42
|
data: buildOutputDataSchema(attributes, readFields).nullable(),
|
|
43
43
|
meta: z.object({
|
|
44
44
|
availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
45
|
-
availableStatus: z.array(z.record(z.string(), z.unknown())).optional()
|
|
45
|
+
availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
46
|
+
defaultLocale: z.string().nullable().optional()
|
|
46
47
|
}).optional()
|
|
47
48
|
}).loose();
|
|
48
49
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":";;;AAKA,MAAMA,gBAAAA,GAAmBC,CAAAA,CAAEC,MAAM,CAAC;AAChCC,IAAAA,UAAAA,EAAYF,EAAEG,MAAM,EAAA;IACpBC,MAAAA,EAAQJ,CAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ,EAAA;IAC3BC,MAAAA,EAAQN,CAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ,EAAA;;IAE3BE,MAAAA,EAAQP,CAAAA,CAAEG,MAAM,EAAA,CAAGE,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMG,oBAAAA,GAAuB,CAACC,GAAAA,EAAaC,UAAAA,GAAAA;IACzC,MAAMC,SAAAA,GAAYD,UAAU,CAACD,GAAAA,CAAI;IAEjC,IAAIE,SAAAA,EAAWC,SAAS,UAAA,EAAY;QAClC,OAAOZ,CAAAA,CAAEa,OAAO,EAAA,CAAGR,QAAQ,EAAA;AAC7B,IAAA;;AAGA,IAAA,IAAI,SAACM,CAAkCG,MAAM,KAAK,aAAA,EAAe;QAC/D,OAAOd,CAAAA,CAAEa,OAAO,EAAA,CAAGR,QAAQ,EAAA;AAC7B,IAAA;;;AAIA,IAAA,IAAIU,qBAAqBJ,SAAAA,CAAAA,EAAqC;AAC5D,QAAA,OAAOX,CAAAA,CAAEgB,KAAK,CAACjB,gBAAAA,CAAAA,CAAkBM,QAAQ,EAAA;AAC3C,IAAA;IAEA,OAAON,gBAAAA,CAAiBkB,QAAQ,EAAA,CAAGZ,QAAQ,EAAA;AAC7C,CAAA;AAEA,MAAMa,qBAAAA,GAAwB,CAC5BR,UAAAA,EACAS,eAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,IAAI,CAACZ,UAAAA,CAAAA,CAAYa,MAAM,CACjD,CAACd,GAAAA,GAAQU,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,CAAgBK,GAAG,CAACf,GAAAA,CAAAA,CAAAA;IAG3D,IAAIW,YAAAA,CAAaK,MAAM,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAOzB,EAAE0B,MAAM,CAAC1B,EAAEG,MAAM,EAAA,EAAIH,EAAEa,OAAO,EAAA,CAAA;AACvC,IAAA;IAEA,MAAMc,KAAAA,GAAQN,OAAOO,WAAW,CAC9BR,aAAaS,GAAG,CAAC,CAACpB,GAAAA,GAAQ;AAACA,YAAAA,GAAAA;AAAKD,YAAAA,oBAAAA,CAAqBC,GAAAA,EAAKC,UAAAA;AAAY,SAAA,CAAA,CAAA;AAGxE,IAAA,OAAOV,CAAAA,CAAEC,MAAM,CAAC0B,KAAAA,CAAAA,CAAOG,KAAK,EAAA;AAC9B,CAAA;AAEA;;;UAIaC,yBAAAA,GAA4B,CACvCrB,YACAsB,UAAAA,GAEAhC,CAAAA,CACGC,MAAM,CAAC;QACNgC,IAAAA,EAAMf,qBAAAA,CAAsBR,UAAAA,EAAYsB,UAAAA,CAAAA,CAAYf,QAAQ,EAAA;QAC5DiB,IAAAA,EAAMlC,CAAAA,CACHC,MAAM,CAAC;AACNkC,YAAAA,gBAAAA,EAAkBnC,CAAAA,CAAEgB,KAAK,CAAChB,CAAAA,CAAE0B,MAAM,CAAC1B,CAAAA,CAAEG,MAAM,EAAA,EAAIH,CAAAA,CAAEa,OAAO,EAAA,CAAA,CAAA,CAAKR,QAAQ,EAAA;AACrE+B,YAAAA,eAAAA,EAAiBpC,CAAAA,CAAEgB,KAAK,CAAChB,CAAAA,CAAE0B,MAAM,CAAC1B,CAAAA,CAAEG,MAAM,EAAA,EAAIH,CAAAA,CAAEa,OAAO,EAAA,CAAA,CAAA,CAAKR,QAAQ;
|
|
1
|
+
{"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n defaultLocale: z.string().nullable().optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","defaultLocale","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
|
|
@@ -100,8 +100,9 @@ const documentManager = ({ strapi })=>{
|
|
|
100
100
|
},
|
|
101
101
|
async clone (id, body, uid) {
|
|
102
102
|
const populate$1 = await populate.buildDeepPopulate(uid);
|
|
103
|
-
// Extract the locale to pass it as a plain param
|
|
104
|
-
|
|
103
|
+
// Extract the locale to pass it as a plain param. The clone route accepts a null locale,
|
|
104
|
+
// which the document service handles like an absent one: pass undefined instead.
|
|
105
|
+
const locale = body?.locale ?? undefined;
|
|
105
106
|
const params = {
|
|
106
107
|
// Ensure id and documentId are not copied to the clone
|
|
107
108
|
data: _.omit(body, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param. The clone route accepts a null locale,\n // which the document service handles like an absent one: pass undefined instead.\n const locale = body?.locale ?? undefined;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","undefined","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
|
|
@@ -98,8 +98,9 @@ const documentManager = ({ strapi })=>{
|
|
|
98
98
|
},
|
|
99
99
|
async clone (id, body, uid) {
|
|
100
100
|
const populate = await buildDeepPopulate(uid);
|
|
101
|
-
// Extract the locale to pass it as a plain param
|
|
102
|
-
|
|
101
|
+
// Extract the locale to pass it as a plain param. The clone route accepts a null locale,
|
|
102
|
+
// which the document service handles like an absent one: pass undefined instead.
|
|
103
|
+
const locale = body?.locale ?? undefined;
|
|
103
104
|
const params = {
|
|
104
105
|
// Ensure id and documentId are not copied to the clone
|
|
105
106
|
data: omit(body, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param. The clone route accepts a null locale,\n // which the document service handles like an absent one: pass undefined instead.\n const locale = body?.locale ?? undefined;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","undefined","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
|
|
@@ -47,6 +47,35 @@ const AVAILABLE_LOCALES_FIELDS = [
|
|
|
47
47
|
'createdAt',
|
|
48
48
|
'publishedAt'
|
|
49
49
|
];
|
|
50
|
+
/**
|
|
51
|
+
* Convert dotted populate paths (`comp.mid.inners`) into a nested populate object
|
|
52
|
+
* the query-params transformer understands.
|
|
53
|
+
*/ const dottedPathsToPopulate = (paths)=>{
|
|
54
|
+
const root = {};
|
|
55
|
+
for (const path of paths){
|
|
56
|
+
const parts = path.split('.').filter(Boolean);
|
|
57
|
+
let node = root;
|
|
58
|
+
for (const [i, part] of parts.entries()){
|
|
59
|
+
const isLast = i === parts.length - 1;
|
|
60
|
+
if (isLast) {
|
|
61
|
+
if (node[part] === undefined) {
|
|
62
|
+
node[part] = true;
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const current = node[part];
|
|
67
|
+
if (current === true || current === undefined) {
|
|
68
|
+
node[part] = {
|
|
69
|
+
populate: {}
|
|
70
|
+
};
|
|
71
|
+
} else if (typeof current === 'object' && current !== null && !('populate' in current)) {
|
|
72
|
+
current.populate = {};
|
|
73
|
+
}
|
|
74
|
+
node = node[part].populate;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return root;
|
|
78
|
+
};
|
|
50
79
|
/** Returns a DB filter that matches the opposite publish status. */ const oppositePublishStatus = (publishedAt)=>publishedAt !== null ? {
|
|
51
80
|
$null: true
|
|
52
81
|
} : {
|
|
@@ -74,7 +103,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
74
103
|
* The result is sorted with the default locale (as defined by the i18n plugin)
|
|
75
104
|
* at index 0 when present. This is the canonical-source invariant relied on by
|
|
76
105
|
* `useDocument.getInitialFormValues` in the admin: when creating a new locale
|
|
77
|
-
* draft, non-localized scalar/media values are inherited from
|
|
106
|
+
* draft, non-localized scalar/media/component/dynamic-zone values are inherited from
|
|
78
107
|
* `availableLocales[0]`. Putting the default locale first means inheritance
|
|
79
108
|
* stays predictable when sibling locales have drifted on non-localized fields
|
|
80
109
|
* (which can happen because the server only syncs non-localized fields at
|
|
@@ -223,11 +252,22 @@ var documentMetadata = (({ strapi })=>({
|
|
|
223
252
|
const model = strapi.getModel(uid);
|
|
224
253
|
const hasDnP = strapiUtils.contentTypes.hasDraftAndPublish(model);
|
|
225
254
|
const isLocalized = strapi.localization.isLocalizedContentType(model);
|
|
255
|
+
// Resolve once for all return paths — admin lock logic needs this even when
|
|
256
|
+
// the current locale is excluded from `availableLocales`.
|
|
257
|
+
let defaultLocale = null;
|
|
258
|
+
if (isLocalized) {
|
|
259
|
+
try {
|
|
260
|
+
defaultLocale = await strapi.localization.getDefaultLocale() ?? null;
|
|
261
|
+
} catch {
|
|
262
|
+
defaultLocale = null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
226
265
|
if (!availableLocales && !availableStatus) {
|
|
227
266
|
// Nothing to compute.
|
|
228
267
|
return {
|
|
229
268
|
availableLocales: [],
|
|
230
269
|
availableStatus: [],
|
|
270
|
+
defaultLocale,
|
|
231
271
|
versions: []
|
|
232
272
|
};
|
|
233
273
|
}
|
|
@@ -236,6 +276,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
236
276
|
return {
|
|
237
277
|
availableLocales: [],
|
|
238
278
|
availableStatus: [],
|
|
279
|
+
defaultLocale,
|
|
239
280
|
versions: []
|
|
240
281
|
};
|
|
241
282
|
}
|
|
@@ -257,16 +298,19 @@ var documentMetadata = (({ strapi })=>({
|
|
|
257
298
|
availableStatus: otherVersion ? [
|
|
258
299
|
_.pick(otherVersion, AVAILABLE_STATUS_FIELDS)
|
|
259
300
|
] : [],
|
|
301
|
+
defaultLocale,
|
|
260
302
|
versions: []
|
|
261
303
|
};
|
|
262
304
|
}
|
|
263
305
|
// Full path for localized content types
|
|
264
306
|
// TODO: Ignore publishedAt if availableStatus=false, and ignore locale if
|
|
265
307
|
// i18n is disabled
|
|
266
|
-
// Include non-translatable
|
|
308
|
+
// Include non-translatable fields in availableLocales for i18n prefilling
|
|
309
|
+
// (scalars + media + components + dynamic zones; relations stay server-filled).
|
|
267
310
|
let nonLocalizedFields = [];
|
|
268
311
|
let nonLocalizedMediaFields = [];
|
|
269
312
|
// Without a localization provider there are no non-localized attributes.
|
|
313
|
+
let nestedPopulate = {};
|
|
270
314
|
try {
|
|
271
315
|
if (model?.attributes !== undefined) {
|
|
272
316
|
const allNonLocalized = strapi.localization.getNonLocalizedAttributes(model);
|
|
@@ -276,11 +320,52 @@ var documentMetadata = (({ strapi })=>({
|
|
|
276
320
|
// Separate scalar fields (can be in fields array) from media fields (need to be populated)
|
|
277
321
|
nonLocalizedFields = allNonLocalized.filter((field)=>field in model.attributes && scalarAttrs.includes(field));
|
|
278
322
|
nonLocalizedMediaFields = allNonLocalized.filter((field)=>field in model.attributes && mediaAttrs.includes(field));
|
|
323
|
+
const getNestedPopulate = strapi.localization.getNestedPopulateOfNonLocalizedAttributes;
|
|
324
|
+
if (typeof getNestedPopulate === 'function') {
|
|
325
|
+
const buildNestedPopulate = (schemaUID, populate = dottedPathsToPopulate(getNestedPopulate(schemaUID)))=>{
|
|
326
|
+
const schema = strapi.getModel(schemaUID);
|
|
327
|
+
return Object.fromEntries(Object.entries(populate).map(([field, value])=>{
|
|
328
|
+
const attribute = schema?.attributes[field];
|
|
329
|
+
if (attribute?.type === 'dynamiczone') {
|
|
330
|
+
return [
|
|
331
|
+
field,
|
|
332
|
+
{
|
|
333
|
+
on: attribute.components.reduce((acc, componentUID)=>{
|
|
334
|
+
acc[componentUID] = {
|
|
335
|
+
populate: buildNestedPopulate(componentUID)
|
|
336
|
+
};
|
|
337
|
+
return acc;
|
|
338
|
+
}, {})
|
|
339
|
+
}
|
|
340
|
+
];
|
|
341
|
+
}
|
|
342
|
+
if (attribute?.type === 'component' && typeof value === 'object' && value !== null && 'populate' in value) {
|
|
343
|
+
return [
|
|
344
|
+
field,
|
|
345
|
+
{
|
|
346
|
+
populate: buildNestedPopulate(attribute.component, value.populate)
|
|
347
|
+
}
|
|
348
|
+
];
|
|
349
|
+
}
|
|
350
|
+
return [
|
|
351
|
+
field,
|
|
352
|
+
value
|
|
353
|
+
];
|
|
354
|
+
}));
|
|
355
|
+
};
|
|
356
|
+
nestedPopulate = buildNestedPopulate(uid);
|
|
357
|
+
} else {
|
|
358
|
+
const componentAndDzFields = allNonLocalized.filter((field)=>field in model.attributes && (model.attributes[field]?.type === 'component' || model.attributes[field]?.type === 'dynamiczone'));
|
|
359
|
+
nestedPopulate = componentAndDzFields.reduce((acc, field)=>{
|
|
360
|
+
acc[field] = true;
|
|
361
|
+
return acc;
|
|
362
|
+
}, {});
|
|
363
|
+
}
|
|
279
364
|
}
|
|
280
365
|
} catch {
|
|
281
366
|
// The provider errored — fall back to no prefilled non-localized fields
|
|
282
367
|
}
|
|
283
|
-
// Build populate object for non-localized media fields
|
|
368
|
+
// Build populate object for non-localized media + nested component/DZ fields
|
|
284
369
|
const mediaPopulate = nonLocalizedMediaFields.reduce((acc, field)=>{
|
|
285
370
|
acc[field] = {
|
|
286
371
|
populate: {
|
|
@@ -291,6 +376,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
291
376
|
}, {});
|
|
292
377
|
const params = {
|
|
293
378
|
populate: {
|
|
379
|
+
...nestedPopulate,
|
|
294
380
|
...mediaPopulate,
|
|
295
381
|
...AVAILABLE_STATUS_POPULATE
|
|
296
382
|
},
|
|
@@ -314,6 +400,7 @@ var documentMetadata = (({ strapi })=>({
|
|
|
314
400
|
availableStatus: availableStatusResult ? [
|
|
315
401
|
availableStatusResult
|
|
316
402
|
] : [],
|
|
403
|
+
defaultLocale,
|
|
317
404
|
versions
|
|
318
405
|
};
|
|
319
406
|
},
|
|
@@ -327,7 +414,8 @@ var documentMetadata = (({ strapi })=>({
|
|
|
327
414
|
data: document,
|
|
328
415
|
meta: {
|
|
329
416
|
availableLocales: [],
|
|
330
|
-
availableStatus: []
|
|
417
|
+
availableStatus: [],
|
|
418
|
+
defaultLocale: null
|
|
331
419
|
}
|
|
332
420
|
};
|
|
333
421
|
}
|