@josephomills/esign 0.4.0 → 0.5.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.
@@ -47,6 +47,68 @@ declare const placementSchema: z.ZodObject<{
47
47
  w: number;
48
48
  h: number;
49
49
  }>;
50
+ /**
51
+ * A named signature field — a placement with an id + label. A document version
52
+ * carries one or more; the signer signs once and the signature is stamped at
53
+ * every field. Labels organize the fields in the designer ("Signature", "Initials
54
+ * page 2", …); the signer always sees "Sign here".
55
+ */
56
+ interface SignatureField extends Placement {
57
+ id: string;
58
+ label: string;
59
+ }
60
+ declare const signatureFieldSchema: z.ZodObject<{
61
+ page: z.ZodNumber;
62
+ x: z.ZodNumber;
63
+ y: z.ZodNumber;
64
+ w: z.ZodNumber;
65
+ h: z.ZodNumber;
66
+ } & {
67
+ id: z.ZodString;
68
+ label: z.ZodString;
69
+ }, "strict", z.ZodTypeAny, {
70
+ page: number;
71
+ x: number;
72
+ y: number;
73
+ w: number;
74
+ h: number;
75
+ id: string;
76
+ label: string;
77
+ }, {
78
+ page: number;
79
+ x: number;
80
+ y: number;
81
+ w: number;
82
+ h: number;
83
+ id: string;
84
+ label: string;
85
+ }>;
86
+ declare const placementsSchema: z.ZodArray<z.ZodObject<{
87
+ page: z.ZodNumber;
88
+ x: z.ZodNumber;
89
+ y: z.ZodNumber;
90
+ w: z.ZodNumber;
91
+ h: z.ZodNumber;
92
+ } & {
93
+ id: z.ZodString;
94
+ label: z.ZodString;
95
+ }, "strict", z.ZodTypeAny, {
96
+ page: number;
97
+ x: number;
98
+ y: number;
99
+ w: number;
100
+ h: number;
101
+ id: string;
102
+ label: string;
103
+ }, {
104
+ page: number;
105
+ x: number;
106
+ y: number;
107
+ w: number;
108
+ h: number;
109
+ id: string;
110
+ label: string;
111
+ }>, "many">;
50
112
  /** A resolved recipient — the only thing the fan-out needs. subjectId = the host's profileId. */
51
113
  interface Recipient {
52
114
  name: string;
@@ -124,7 +186,7 @@ interface SigningDocumentVersionDTO {
124
186
  version: number;
125
187
  sourceObjectKey: string;
126
188
  sourceSha256: string;
127
- placement: Placement;
189
+ placements: SignatureField[];
128
190
  changeNote: string | null;
129
191
  createdById: string | null;
130
192
  createdAt: string;
@@ -448,7 +510,7 @@ interface PersistencePort {
448
510
  version: number;
449
511
  sourceObjectKey: string;
450
512
  sourceSha256: string;
451
- placement: Placement;
513
+ placements: SignatureField[];
452
514
  changeNote: string | null;
453
515
  createdById: string | null;
454
516
  }): Promise<SigningDocumentVersionDTO>;
@@ -550,4 +612,4 @@ interface EsignConfig<S> {
550
612
  defaultExpiryDays?: number;
551
613
  }
552
614
 
553
- export { submitSignatureSchema as $, ACTIVE_STATUSES as A, type StatusCountMap as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type SubjectFilter as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilterField as I, type SubjectSigningState as J, type SubjectSummary as K, type SubmitSignatureInput as L, assertTransition as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, canTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, declineSchema as U, type VersionPolicy as V, esignChannelSchema as W, isActive as X, isTerminal as Y, placementSchema as Z, subjectSelectionSchema as _, type SubjectsPort as a, type SkippedSubject as b, type Placement as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type AuthPort as o, type DeclineInput as p, ESIGN_CHANNELS as q, ESIGN_STATUSES as r, type EsignStatus as s, type NewAuditEventRow as t, type NewRequestRow as u, type NotifierAttachment as v, type Recipient as w, type RequestSummary as x, type SigningAuditEventDTO as y, type SigningCampaignDTO as z };
615
+ export { placementsSchema as $, ACTIVE_STATUSES as A, type SigningCampaignDTO as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type StatusCountMap as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilter as I, type SubjectFilterField as J, type SubjectSigningState as K, type SubjectSummary as L, type SubmitSignatureInput as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, assertTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, canTransition as U, type VersionPolicy as V, declineSchema as W, esignChannelSchema as X, isActive as Y, isTerminal as Z, placementSchema as _, type SubjectsPort as a, signatureFieldSchema as a0, subjectSelectionSchema as a1, submitSignatureSchema as a2, type SkippedSubject as b, type SignatureField as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type Placement as o, type AuthPort as p, type DeclineInput as q, ESIGN_CHANNELS as r, ESIGN_STATUSES as s, type EsignStatus as t, type NewAuditEventRow as u, type NewRequestRow as v, type NotifierAttachment as w, type Recipient as x, type RequestSummary as y, type SigningAuditEventDTO as z };
@@ -47,6 +47,68 @@ declare const placementSchema: z.ZodObject<{
47
47
  w: number;
48
48
  h: number;
49
49
  }>;
50
+ /**
51
+ * A named signature field — a placement with an id + label. A document version
52
+ * carries one or more; the signer signs once and the signature is stamped at
53
+ * every field. Labels organize the fields in the designer ("Signature", "Initials
54
+ * page 2", …); the signer always sees "Sign here".
55
+ */
56
+ interface SignatureField extends Placement {
57
+ id: string;
58
+ label: string;
59
+ }
60
+ declare const signatureFieldSchema: z.ZodObject<{
61
+ page: z.ZodNumber;
62
+ x: z.ZodNumber;
63
+ y: z.ZodNumber;
64
+ w: z.ZodNumber;
65
+ h: z.ZodNumber;
66
+ } & {
67
+ id: z.ZodString;
68
+ label: z.ZodString;
69
+ }, "strict", z.ZodTypeAny, {
70
+ page: number;
71
+ x: number;
72
+ y: number;
73
+ w: number;
74
+ h: number;
75
+ id: string;
76
+ label: string;
77
+ }, {
78
+ page: number;
79
+ x: number;
80
+ y: number;
81
+ w: number;
82
+ h: number;
83
+ id: string;
84
+ label: string;
85
+ }>;
86
+ declare const placementsSchema: z.ZodArray<z.ZodObject<{
87
+ page: z.ZodNumber;
88
+ x: z.ZodNumber;
89
+ y: z.ZodNumber;
90
+ w: z.ZodNumber;
91
+ h: z.ZodNumber;
92
+ } & {
93
+ id: z.ZodString;
94
+ label: z.ZodString;
95
+ }, "strict", z.ZodTypeAny, {
96
+ page: number;
97
+ x: number;
98
+ y: number;
99
+ w: number;
100
+ h: number;
101
+ id: string;
102
+ label: string;
103
+ }, {
104
+ page: number;
105
+ x: number;
106
+ y: number;
107
+ w: number;
108
+ h: number;
109
+ id: string;
110
+ label: string;
111
+ }>, "many">;
50
112
  /** A resolved recipient — the only thing the fan-out needs. subjectId = the host's profileId. */
51
113
  interface Recipient {
52
114
  name: string;
@@ -124,7 +186,7 @@ interface SigningDocumentVersionDTO {
124
186
  version: number;
125
187
  sourceObjectKey: string;
126
188
  sourceSha256: string;
127
- placement: Placement;
189
+ placements: SignatureField[];
128
190
  changeNote: string | null;
129
191
  createdById: string | null;
130
192
  createdAt: string;
@@ -448,7 +510,7 @@ interface PersistencePort {
448
510
  version: number;
449
511
  sourceObjectKey: string;
450
512
  sourceSha256: string;
451
- placement: Placement;
513
+ placements: SignatureField[];
452
514
  changeNote: string | null;
453
515
  createdById: string | null;
454
516
  }): Promise<SigningDocumentVersionDTO>;
@@ -550,4 +612,4 @@ interface EsignConfig<S> {
550
612
  defaultExpiryDays?: number;
551
613
  }
552
614
 
553
- export { submitSignatureSchema as $, ACTIVE_STATUSES as A, type StatusCountMap as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type SubjectFilter as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilterField as I, type SubjectSigningState as J, type SubjectSummary as K, type SubmitSignatureInput as L, assertTransition as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, canTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, declineSchema as U, type VersionPolicy as V, esignChannelSchema as W, isActive as X, isTerminal as Y, placementSchema as Z, subjectSelectionSchema as _, type SubjectsPort as a, type SkippedSubject as b, type Placement as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type AuthPort as o, type DeclineInput as p, ESIGN_CHANNELS as q, ESIGN_STATUSES as r, type EsignStatus as s, type NewAuditEventRow as t, type NewRequestRow as u, type NotifierAttachment as v, type Recipient as w, type RequestSummary as x, type SigningAuditEventDTO as y, type SigningCampaignDTO as z };
615
+ export { placementsSchema as $, ACTIVE_STATUSES as A, type SigningCampaignDTO as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type StatusCountMap as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilter as I, type SubjectFilterField as J, type SubjectSigningState as K, type SubjectSummary as L, type SubmitSignatureInput as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, assertTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, canTransition as U, type VersionPolicy as V, declineSchema as W, esignChannelSchema as X, isActive as Y, isTerminal as Z, placementSchema as _, type SubjectsPort as a, signatureFieldSchema as a0, subjectSelectionSchema as a1, submitSignatureSchema as a2, type SkippedSubject as b, type SignatureField as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type Placement as o, type AuthPort as p, type DeclineInput as q, ESIGN_CHANNELS as r, ESIGN_STATUSES as s, type EsignStatus as t, type NewAuditEventRow as u, type NewRequestRow as v, type NotifierAttachment as w, type Recipient as x, type RequestSummary as y, type SigningAuditEventDTO as z };
@@ -39,13 +39,20 @@ var mapDoc = (r) => ({
39
39
  createdAt: iso(r.createdAt),
40
40
  updatedAt: iso(r.updatedAt)
41
41
  });
42
+ function toFields(raw) {
43
+ if (Array.isArray(raw)) return raw;
44
+ if (raw && typeof raw === "object") {
45
+ return [{ ...raw, id: "field-1", label: "Signature" }];
46
+ }
47
+ return [];
48
+ }
42
49
  var mapVer = (r) => ({
43
50
  id: r.id,
44
51
  documentId: r.documentId,
45
52
  version: r.version,
46
53
  sourceObjectKey: r.sourceObjectKey,
47
54
  sourceSha256: r.sourceSha256,
48
- placement: r.placement,
55
+ placements: toFields(r.placement),
49
56
  changeNote: r.changeNote,
50
57
  createdById: r.createdById,
51
58
  createdAt: iso(r.createdAt)
@@ -185,7 +192,7 @@ function createPrismaPersistence(prisma) {
185
192
  version: input.version,
186
193
  sourceObjectKey: input.sourceObjectKey,
187
194
  sourceSha256: input.sourceSha256,
188
- placement: input.placement,
195
+ placement: input.placements,
189
196
  changeNote: input.changeNote,
190
197
  createdById: input.createdById
191
198
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":["randomBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placement: r.placement as Placement,\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placement,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":["randomBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SignatureField,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\n/** The `placement` Json column holds a SignatureField[]; tolerate a legacy single object. */\nfunction toFields(raw: unknown): SignatureField[] {\n if (Array.isArray(raw)) return raw as SignatureField[];\n if (raw && typeof raw === \"object\") {\n return [{ ...(raw as Placement), id: \"field-1\", label: \"Signature\" }];\n }\n return [];\n}\n\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placements: toFields(r.placement),\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placements,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { P as PersistencePort } from '../ports-DtICqgEf.cjs';
1
+ import { P as PersistencePort } from '../ports-DM0-2hQd.cjs';
2
2
  import 'zod';
3
3
 
4
4
  interface Delegate {
@@ -1,4 +1,4 @@
1
- import { P as PersistencePort } from '../ports-DtICqgEf.js';
1
+ import { P as PersistencePort } from '../ports-DM0-2hQd.js';
2
2
  import 'zod';
3
3
 
4
4
  interface Delegate {
@@ -37,13 +37,20 @@ var mapDoc = (r) => ({
37
37
  createdAt: iso(r.createdAt),
38
38
  updatedAt: iso(r.updatedAt)
39
39
  });
40
+ function toFields(raw) {
41
+ if (Array.isArray(raw)) return raw;
42
+ if (raw && typeof raw === "object") {
43
+ return [{ ...raw, id: "field-1", label: "Signature" }];
44
+ }
45
+ return [];
46
+ }
40
47
  var mapVer = (r) => ({
41
48
  id: r.id,
42
49
  documentId: r.documentId,
43
50
  version: r.version,
44
51
  sourceObjectKey: r.sourceObjectKey,
45
52
  sourceSha256: r.sourceSha256,
46
- placement: r.placement,
53
+ placements: toFields(r.placement),
47
54
  changeNote: r.changeNote,
48
55
  createdById: r.createdById,
49
56
  createdAt: iso(r.createdAt)
@@ -183,7 +190,7 @@ function createPrismaPersistence(prisma) {
183
190
  version: input.version,
184
191
  sourceObjectKey: input.sourceObjectKey,
185
192
  sourceSha256: input.sourceSha256,
186
- placement: input.placement,
193
+ placement: input.placements,
187
194
  changeNote: input.changeNote,
188
195
  createdById: input.createdById
189
196
  }