{"version":3,"file":"collections.mjs","names":[],"sources":["../../../src/libs/formatters/collections.ts"],"sourcesContent":["import type { Collection } from \"../../types/response.js\";\nimport { tenantAccessAllowed } from \"../../utils/helpers/index.js\";\nimport type BrickBuilder from \"../collection/builders/brick-builder/index.js\";\nimport type CollectionBuilder from \"../collection/builders/collection-builder/index.js\";\nimport type CustomField from \"../collection/custom-fields/custom-field.js\";\nimport type {\n\tCFConfig,\n\tFieldTypes,\n} from \"../collection/custom-fields/types.js\";\nimport type { MigrationStatus } from \"../collection/get-collection-migration-status.js\";\nimport { hydrateAdminCopyDefaults } from \"../i18n/hydrate-admin-copy-defaults.js\";\nimport {\n\tresolveCollectionPermission,\n\tresolveCollectionPermissions,\n} from \"../permission/collection-permissions.js\";\n\nconst formatMultiple = (props: {\n\tcollections: CollectionBuilder[];\n\tallCollections: CollectionBuilder[];\n\ttenantKey?: string | null;\n\tqueueSupportsScheduling?: boolean;\n\tadminTranslations?: Record<string, string>;\n\tinclude?: {\n\t\tbricks?: boolean;\n\t\tfields?: boolean;\n\t\tdocumentId?: boolean;\n\t};\n\tdocuments?: Array<{\n\t\tid: number;\n\t\tcollection_key: string;\n\t}>;\n}) => {\n\tconst documentTargetCollectionKeys = getDocumentTargetCollectionKeys({\n\t\tcollections: props.allCollections,\n\t\ttenantKey: props.tenantKey,\n\t});\n\n\treturn props.collections.map((c) =>\n\t\tformatSingle({\n\t\t\tcollection: c,\n\t\t\tdocumentTargetCollectionKeys,\n\t\t\ttenantKey: props.tenantKey,\n\t\t\tqueueSupportsScheduling: props.queueSupportsScheduling,\n\t\t\tadminTranslations: props.adminTranslations,\n\t\t\tinclude: props.include,\n\t\t\tdocuments: props.documents,\n\t\t}),\n\t);\n};\n\nconst formatSingle = (props: {\n\tcollection: CollectionBuilder;\n\tallCollections?: CollectionBuilder[];\n\tdocumentTargetCollectionKeys?: Set<string>;\n\ttenantKey?: string | null;\n\tqueueSupportsScheduling?: boolean;\n\tadminTranslations?: Record<string, string>;\n\tmigrationStatus?: MigrationStatus;\n\tinclude?: {\n\t\tbricks?: boolean;\n\t\tfields?: boolean;\n\t\tdocumentId?: boolean;\n\t};\n\tdocuments?: Array<{\n\t\tid?: number;\n\t\tcollection_key: string;\n\t}>;\n}): Collection => {\n\tconst collectionData = props.collection.getData;\n\tconst key = props.collection.key;\n\tconst resolvedPermissions = resolveCollectionPermissions(props.collection);\n\tconst documentTargetCollectionKeys =\n\t\tprops.documentTargetCollectionKeys ??\n\t\tgetDocumentTargetCollectionKeys({\n\t\t\tcollections: props.allCollections ?? [props.collection],\n\t\t\ttenantKey: props.tenantKey,\n\t\t});\n\n\tconst formattedCollection: Collection = {\n\t\tkey: key,\n\t\tmode: collectionData.mode,\n\t\ttenants: collectionData.tenants,\n\t\tgroup: collectionData.group,\n\t\tdocumentId: props.include?.documentId\n\t\t\t? getDocumentId(key, props.documents)\n\t\t\t: undefined,\n\t\tdetails: {\n\t\t\tname: collectionData.details.name,\n\t\t\tsingularName: collectionData.details.singularName,\n\t\t\tsummary: collectionData.details.summary,\n\t\t},\n\t\tlocalized: collectionData.localized,\n\t\trevisions: collectionData.revisions,\n\t\tlocked: collectionData.locked,\n\t\tlisting: props.collection.listing,\n\t\tlabelFields: collectionData.labelFields,\n\t\tautoSave: collectionData.autoSave,\n\t\tscheduling: collectionData.scheduling,\n\t\torderable: collectionData.orderable,\n\t\trevisionRetentionDays: collectionData.revisionRetentionDays,\n\t\treview: collectionData.review,\n\t\tworkflow: collectionData.workflow,\n\t\tenvironments: collectionData.environments.map((environment) => ({\n\t\t\tkey: environment.key,\n\t\t\tname: environment.name,\n\t\t\trequires: environment.requires,\n\t\t\tpermissions: {\n\t\t\t\tpublish: resolveCollectionPermission({\n\t\t\t\t\tcollection: props.collection,\n\t\t\t\t\taction: \"publish\",\n\t\t\t\t}),\n\t\t\t\treview: resolveCollectionPermission({\n\t\t\t\t\tcollection: props.collection,\n\t\t\t\t\taction: \"review\",\n\t\t\t\t}),\n\t\t\t},\n\t\t})),\n\t\tpreview: collectionData.preview,\n\t\tcapabilities: {\n\t\t\tscheduling:\n\t\t\t\tcollectionData.scheduling === true &&\n\t\t\t\tprops.queueSupportsScheduling === true,\n\t\t\tpreview: collectionData.preview !== null,\n\t\t},\n\t\tpermissions: resolvedPermissions,\n\t\tmigrationStatus: props.migrationStatus ?? null,\n\t\tfixedBricks: props.include?.bricks\n\t\t\t? (props.collection.config.bricks?.fixed\n\t\t\t\t\t?.filter((brick) =>\n\t\t\t\t\t\ttenantAccessAllowed(brick.config.tenants, props.tenantKey),\n\t\t\t\t\t)\n\t\t\t\t\t.map((brick) =>\n\t\t\t\t\t\tformatBrick({\n\t\t\t\t\t\t\tbrick,\n\t\t\t\t\t\t\tdocumentTargetCollectionKeys,\n\t\t\t\t\t\t}),\n\t\t\t\t\t) ?? [])\n\t\t\t: [],\n\t\tbuilderBricks: props.include?.bricks\n\t\t\t? (props.collection.config.bricks?.builder\n\t\t\t\t\t?.filter((brick) =>\n\t\t\t\t\t\ttenantAccessAllowed(brick.config.tenants, props.tenantKey),\n\t\t\t\t\t)\n\t\t\t\t\t.map((brick) =>\n\t\t\t\t\t\tformatBrick({\n\t\t\t\t\t\t\tbrick,\n\t\t\t\t\t\t\tdocumentTargetCollectionKeys,\n\t\t\t\t\t\t}),\n\t\t\t\t\t) ?? [])\n\t\t\t: [],\n\t\tfields: props.include?.fields\n\t\t\t? formatFields(\n\t\t\t\t\tprops.collection.fieldTree,\n\t\t\t\t\tprops.collection.fields,\n\t\t\t\t\tdocumentTargetCollectionKeys,\n\t\t\t\t)\n\t\t\t: [],\n\t};\n\n\treturn hydrateAdminCopyDefaults(formattedCollection, props.adminTranslations);\n};\n\nconst formatBrick = (props: {\n\tbrick: BrickBuilder;\n\tdocumentTargetCollectionKeys: Set<string>;\n}): Collection[\"fixedBricks\"][number] => ({\n\tkey: props.brick.key,\n\tdetails: props.brick.config.details,\n\tpreview: props.brick.config.preview,\n\tfields: formatFields(\n\t\tprops.brick.fieldTree,\n\t\tprops.brick.fields,\n\t\tprops.documentTargetCollectionKeys,\n\t),\n});\n\nconst formatFields = (\n\tfields: CFConfig<FieldTypes>[],\n\tinstances: Map<string, CustomField<FieldTypes>>,\n\tdocumentTargetCollectionKeys: Set<string>,\n): Collection[\"fields\"] => {\n\treturn fields.map((field) =>\n\t\tformatField(field, instances, documentTargetCollectionKeys),\n\t);\n};\n\nconst formatField = (\n\tfield: CFConfig<FieldTypes>,\n\tinstances: Map<string, CustomField<FieldTypes>>,\n\tdocumentTargetCollectionKeys: Set<string>,\n): Collection[\"fields\"][number] => {\n\tconst nestedFields =\n\t\t\"fields\" in field && Array.isArray(field.fields) ? field.fields : undefined;\n\n\tconst fieldInstance = instances.get(field.key);\n\tconst aiConfig = fieldInstance\n\t\t? getFieldAiConfig(field, fieldInstance)\n\t\t: undefined;\n\n\tconst formattedField = {\n\t\t...field,\n\t} as Collection[\"fields\"][number] & {\n\t\tfields?: Collection[\"fields\"];\n\t\tai?: Collection[\"fields\"][number][\"ai\"];\n\t};\n\n\tif (aiConfig) {\n\t\tformattedField.ai = aiConfig;\n\t} else {\n\t\tdelete formattedField.ai;\n\t}\n\n\tif (formattedField.type === \"relation\") {\n\t\tconst filteredCollection = (\n\t\t\tArray.isArray(formattedField.collection)\n\t\t\t\t? formattedField.collection\n\t\t\t\t: [formattedField.collection]\n\t\t).filter((collectionKey) =>\n\t\t\tdocumentTargetCollectionKeys.has(collectionKey),\n\t\t);\n\n\t\tformattedField.collection = filteredCollection;\n\t\tformattedField.default = formattedField.default?.filter((defaultValue) =>\n\t\t\tdocumentTargetCollectionKeys.has(defaultValue.collectionKey),\n\t\t);\n\t}\n\n\tif (nestedFields) {\n\t\tformattedField.fields = formatFields(\n\t\t\tnestedFields,\n\t\t\tinstances,\n\t\t\tdocumentTargetCollectionKeys,\n\t\t);\n\t}\n\n\treturn formattedField;\n};\n\nconst getDocumentTargetCollectionKeys = (props: {\n\tcollections: CollectionBuilder[];\n\ttenantKey?: string | null;\n}) => {\n\treturn new Set(\n\t\tprops.collections\n\t\t\t.filter((collection) =>\n\t\t\t\ttenantAccessAllowed(collection.getData.tenants, props.tenantKey),\n\t\t\t)\n\t\t\t.map((collection) => collection.key),\n\t);\n};\n\nconst getFieldAiConfig = (\n\tfield: CFConfig<FieldTypes>,\n\tfieldInstance: CustomField<FieldTypes>,\n): Collection[\"fields\"][number][\"ai\"] => {\n\tif (!fieldInstance.supportsAi) return undefined;\n\n\tconst fieldHasAiConfig = Object.hasOwn(field, \"ai\");\n\tconst aiConfig = fieldInstance.aiConfig;\n\tif (\n\t\taiConfig.enabled !== true &&\n\t\taiConfig.guidance.length === 0 &&\n\t\tfieldHasAiConfig === false\n\t) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tenabled: aiConfig.enabled,\n\t\tguidance: aiConfig.guidance.map((guidance) => ({\n\t\t\tkey: guidance.key,\n\t\t\tlabel: guidance.label,\n\t\t})),\n\t};\n};\n\nconst getDocumentId = (\n\tcollectionKey: string,\n\tdocuments?: Array<{\n\t\tid?: number;\n\t\tcollection_key: string;\n\t}>,\n) => {\n\tconst document = documents?.find(\n\t\t(document) => document.collection_key === collectionKey,\n\t);\n\n\treturn document?.id ?? undefined;\n};\n\nexport default {\n\tformatMultiple,\n\tformatSingle,\n};\n"],"mappings":"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"}