Files
agentic-dev/packages/core-dsr/src/dsr-collection-custom.ts

66 lines
2.1 KiB
TypeScript

import type { FieldPii } from "@repo/core-shared/payload";
export type { FieldPii };
/**
* DSR-specific Payload collection custom metadata.
*
* Collection authors annotate their collection configs with these shapes so the
* DSR implementations can walk `custom.subject` linkage and filter by each
* field's `custom.pii.exportable` flag.
*
* The `pii` map mirrors the field-level `FieldPii` shape from
* `@repo/core-shared/payload` so that the `pii-declaration-must-be-complete`
* ESLint rule is satisfied for each declared field.
*
* @example
* ```ts
* import type { DsrCollectionCustom } from "@repo/core-dsr";
*
* const ordersCollection: CollectionConfig = {
* slug: "orders",
* custom: {
* subject: { field: "userId", kind: "owner" },
* pii: {
* shippingAddress: {
* category: "contact-address",
* purpose: ["service-delivery"],
* exportable: true,
* restrictable: true,
* },
* },
* } satisfies DsrCollectionCustom,
* };
* ```
*/
export type DsrSubjectLinkKind = "self" | "owner" | "reference";
export type DsrSubjectLinkage = {
/**
* Field name in this collection that contains the subject's canonical ID.
* For "self" collections (e.g. "users"), use the literal "id".
*/
field: string;
/**
* - "self" — this collection IS the subject record (e.g. users).
* - "owner" — the subject owns these rows (e.g. orders, blog posts).
* - "reference" — the subject is referenced but does not own the row.
*/
kind: DsrSubjectLinkKind;
};
/** Shape expected in `collection.custom` for DSR-enabled collections. */
export type DsrCollectionCustom = {
/** Subject linkage metadata. Omit for collections with no subject data. */
subject?: DsrSubjectLinkage;
/**
* Map of field name → FieldPii metadata. Must include all required fields
* (`category`, `purpose`, `exportable`, `restrictable`) to satisfy the
* `pii-declaration-must-be-complete` ESLint conformance rule.
*
* Omit for collections with no PII fields.
*/
pii?: Record<string, FieldPii>;
};