feat(core-dsr): Payload impls, recording doubles, DI binders, contract tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
65
packages/core-dsr/src/dsr-collection-custom.ts
Normal file
65
packages/core-dsr/src/dsr-collection-custom.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
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>;
|
||||
};
|
||||
Reference in New Issue
Block a user