@betterinternship/core 2.23.2 → 2.24.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/README.md CHANGED
@@ -1,26 +1,26 @@
1
- # Package.Core
2
-
3
- Contains dependencies shared between the different services of the site.
4
-
5
- ## How to update
6
-
7
- 1. Build the package:
8
-
9
- ```bash
10
- npm run build
11
- ```
12
-
13
- 2. Commit the build:
14
-
15
- ```bash
16
- git add .
17
- git commit -m "<follow conventional commits, k thanks>"
18
- git push
19
- ```
20
-
21
- 3. Update the version and publish the package to NPM:
22
-
23
- ```bash
24
- npm version <patch|minor|major>
25
- npm publish
26
- ```
1
+ # Package.Core
2
+
3
+ Contains dependencies shared between the different services of the site.
4
+
5
+ ## How to update
6
+
7
+ 1. Build the package:
8
+
9
+ ```bash
10
+ npm run build
11
+ ```
12
+
13
+ 2. Commit the build:
14
+
15
+ ```bash
16
+ git add .
17
+ git commit -m "<follow conventional commits, k thanks>"
18
+ git push
19
+ ```
20
+
21
+ 3. Update the version and publish the package to NPM:
22
+
23
+ ```bash
24
+ npm version <patch|minor|major>
25
+ npm publish
26
+ ```
@@ -10,4 +10,4 @@ export interface IArchiveContext {
10
10
  tags?: Record<string, string>;
11
11
  configurationSetName?: string;
12
12
  }
13
- export declare const archiveSentEmail: (context: IArchiveContext, messageId: string | undefined, attempts: number) => Promise<void>;
13
+ export declare const archiveSentEmail: (context: IArchiveContext, messageId: string | undefined, attempts: number, idempotencyKey?: string) => Promise<void>;
@@ -55,19 +55,31 @@ const recordArchiveEvent = async (event) => {
55
55
  attempts: event.attempts,
56
56
  correlation_type: event.correlationDetail ? 'email_archive' : null,
57
57
  correlation_detail: event.correlationDetail,
58
+ message_id: event.idempotencyKey ?? null,
58
59
  })
59
60
  .execute();
60
61
  }
61
62
  catch (error) {
62
63
  console.error('[ERROR:EMAIL_ARCHIVE] Could not record archive event.', error);
64
+ if (event.idempotencyKey)
65
+ console.error(`[ERROR:EMAIL_ARCHIVE] Dedup record for key ${event.idempotencyKey} was NOT written; a redelivery of this message would send it again.`);
63
66
  }
64
67
  };
65
- export const archiveSentEmail = async (context, messageId, attempts) => {
68
+ export const archiveSentEmail = async (context, messageId, attempts, idempotencyKey) => {
66
69
  const bucketName = getArchiveBucketName();
67
- if (!bucketName)
68
- return;
69
70
  const sentAt = new Date();
70
71
  const idForKey = messageId ?? randomUUID();
72
+ if (!bucketName) {
73
+ if (idempotencyKey)
74
+ await recordArchiveEvent({
75
+ recipient: context.to[0],
76
+ feedbackId: idForKey,
77
+ attempts,
78
+ correlationDetail: null,
79
+ idempotencyKey,
80
+ });
81
+ return;
82
+ }
71
83
  const key = buildObjectKey(sentAt, idForKey);
72
84
  const payload = {
73
85
  message_id: messageId ?? null,
@@ -102,6 +114,7 @@ export const archiveSentEmail = async (context, messageId, attempts) => {
102
114
  feedbackId: idForKey,
103
115
  attempts,
104
116
  correlationDetail: uploadedKey,
117
+ idempotencyKey,
105
118
  });
106
119
  };
107
120
  //# sourceMappingURL=archive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../lib/email/archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../lib/email/archive.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAgBhC,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAChC,IAAI,wBAAwB,GAAG,KAAK,CAAC;AAGrC,MAAM,oBAAoB,GAAG,GAAuB,EAAE;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,oBAAoB,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CACV,iFAAiF,CAClF,CAAC;YACF,mBAAmB,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QAClE,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CACX,uJAAuJ,CACxJ,CAAC;YACF,wBAAwB,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AASF,IAAI,OAAO,GAAkD,IAAI,CAAC;AAClE,MAAM,gBAAgB,GAAG,KAAK,EAAE,UAAkB,EAAE,EAAE;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAyB,CAG3D,CAAC;QACF,OAAO,GAAG,IAAI,OAAO,CAAC;YACpB,SAAS,EAAE,GAAG,CAAC,uBAAuB;YACtC,WAAW;SACZ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAGF,MAAM,cAAc,GAAG,CAAC,MAAY,EAAE,QAAgB,EAAE,EAAE;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,iBAAiB,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,kBAAkB,IAAI,QAAQ,OAAO,CAAC;IAE3F,OAAO,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC,CAAC;AAMF,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAMjC,EAAE,EAAE;IACH,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CACV,mEAAmE,CACpE,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QAKH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAChE,MAAM,UAAU;aACb,UAAU,CAAC,gCAAgC,CAAC;aAC5C,MAAM,CAAC;YACN,UAAU,EAAE,cAAc;YAC1B,eAAe,EAAE,KAAK,CAAC,SAAS;YAChC,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAClE,kBAAkB,EAAE,KAAK,CAAC,iBAAiB;YAC3C,UAAU,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;SACzC,CAAC;aACD,OAAO,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uDAAuD,EACvD,KAAK,CACN,CAAC;QAOF,IAAI,KAAK,CAAC,cAAc;YACtB,OAAO,CAAC,KAAK,CACX,8CAA8C,KAAK,CAAC,cAAc,qEAAqE,CACxI,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAAwB,EACxB,SAA6B,EAC7B,QAAgB,EAChB,cAAuB,EACR,EAAE;IACjB,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;IAI3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,cAAc;YAChB,MAAM,kBAAkB,CAAC;gBACvB,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,UAAU,EAAE,QAAQ;gBACpB,QAAQ;gBACR,iBAAiB,EAAE,IAAI;gBACvB,cAAc;aACf,CAAC,CAAC;QACL,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,SAAS,IAAI,IAAI;QAC7B,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE;QAC7B,OAAO,EAAE,GAAG,CAAC,qBAAqB;QAClC,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,sBAAsB,EAAE,OAAO,CAAC,oBAAoB,IAAI,IAAI;KAC7D,CAAC;IAEF,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC5D,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,WAAW,GAAG,GAAG,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,wDAAwD,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,UAAU,EAAE,QAAQ;QACpB,QAAQ;QACR,iBAAiB,EAAE,WAAW;QAC9B,cAAc;KACf,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,5 +1,8 @@
1
1
  type EmailAlias = 'otp' | 'applications' | 'sign' | 'hello' | 'apply';
2
- export interface IEmailParams {
2
+ interface IIdempotency {
3
+ idempotencyKey?: string;
4
+ }
5
+ export interface IEmailParams extends IIdempotency {
3
6
  sender?: string;
4
7
  subject: string;
5
8
  recipient: string;
@@ -8,7 +11,7 @@ export interface IEmailParams {
8
11
  configurationSetName?: string;
9
12
  tags?: Record<string, string>;
10
13
  }
11
- export interface IMultiEmailParams {
14
+ export interface IMultiEmailParams extends IIdempotency {
12
15
  sender?: string;
13
16
  subject: string;
14
17
  to: string | string[];
@@ -19,12 +22,11 @@ export interface IMultiEmailParams {
19
22
  configurationSetName?: string;
20
23
  tags?: Record<string, string>;
21
24
  }
22
- export declare const sendMultiEmail: ({ sender, subject, to, cc, bcc, content, alias, configurationSetName, tags, }: IMultiEmailParams) => Promise<{
23
- messageId: string | undefined;
24
- response: string;
25
- } | undefined>;
26
- export declare const sendSingleEmail: (params: IEmailParams) => Promise<{
27
- messageId: string | undefined;
25
+ export interface ISendResult {
26
+ messageId?: string;
28
27
  response: string;
29
- } | undefined>;
28
+ deduplicated?: boolean;
29
+ }
30
+ export declare const sendMultiEmail: ({ sender, subject, to, cc, bcc, content, alias, configurationSetName, tags, idempotencyKey, }: IMultiEmailParams) => Promise<ISendResult | undefined>;
31
+ export declare const sendSingleEmail: (params: IEmailParams) => Promise<ISendResult | undefined>;
30
32
  export {};
@@ -53,6 +53,7 @@ const recordSendFailure = async (failure) => {
53
53
  feedback_id: randomUUID(),
54
54
  attempts: failure.attempts,
55
55
  error_message: describeError(failure.error),
56
+ message_id: failure.idempotencyKey ?? null,
56
57
  })
57
58
  .execute();
58
59
  }
@@ -60,6 +61,19 @@ const recordSendFailure = async (failure) => {
60
61
  console.error('[ERROR:EMAIL] Could not record send failure.', error);
61
62
  }
62
63
  };
64
+ const hasAlreadyBeenSent = async (idempotencyKey) => {
65
+ if (!ENV.DATABASE_URL)
66
+ throw new Error('[ERROR:EMAIL] DATABASE_URL is not set; cannot honour an idempotency key.');
67
+ const { internalDb } = await import('@betterinternship/schema');
68
+ const existing = await internalDb
69
+ .selectFrom('internal.email_delivery_events')
70
+ .select('id')
71
+ .where('message_id', '=', idempotencyKey)
72
+ .where('event_type', '=', 'send_success')
73
+ .limit(1)
74
+ .executeTakeFirst();
75
+ return !!existing;
76
+ };
63
77
  const normalizeRecipients = (value) => {
64
78
  if (!value)
65
79
  return [];
@@ -72,14 +86,18 @@ const toSesTags = (tags) => Object.entries(tags).map(([name, value]) => ({
72
86
  Name: name,
73
87
  Value: value.trim().slice(0, 256).replaceAll(' ', ''),
74
88
  }));
75
- const sendWithRetries = async (params, logRecipients, archiveContext) => {
89
+ const sendWithRetries = async (params, logRecipients, archiveContext, idempotencyKey) => {
76
90
  const maxAttempts = getMaxAttempts();
77
91
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
78
92
  try {
79
93
  const command = new SendEmailCommand(params);
80
94
  const result = await getSesClient().send(command);
81
95
  console.warn('[AWSSES] Email sent to ' + logRecipients.join(', '));
82
- void archiveSentEmail(archiveContext, result.MessageId, attempt).catch((error) => console.error('[ERROR:EMAIL_ARCHIVE] Archive failed.', error));
96
+ const archived = archiveSentEmail(archiveContext, result.MessageId, attempt, idempotencyKey).catch((error) => console.error('[ERROR:EMAIL_ARCHIVE] Archive failed.', error));
97
+ if (idempotencyKey)
98
+ await archived;
99
+ else
100
+ void archived;
83
101
  return {
84
102
  messageId: result.MessageId,
85
103
  response: 'Successfully sent via Amazon SES.',
@@ -97,16 +115,24 @@ const sendWithRetries = async (params, logRecipients, archiveContext) => {
97
115
  recipient: logRecipients[0],
98
116
  attempts: attempt,
99
117
  error,
118
+ idempotencyKey,
100
119
  });
101
120
  return undefined;
102
121
  }
103
122
  }
104
123
  return undefined;
105
124
  };
106
- export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, alias = 'hello', configurationSetName, tags, }) => {
125
+ export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, alias = 'hello', configurationSetName, tags, idempotencyKey, }) => {
107
126
  const toRecipients = normalizeRecipients(to);
108
127
  if (!toRecipients.length)
109
128
  throw Error('[ERROR:EMAIL] No recipients provided for email.');
129
+ if (idempotencyKey && (await hasAlreadyBeenSent(idempotencyKey))) {
130
+ console.warn(`[AWSSES] Skipping duplicate send for idempotency key ${idempotencyKey}.`);
131
+ return {
132
+ response: 'Already sent; skipped as a duplicate.',
133
+ deduplicated: true,
134
+ };
135
+ }
110
136
  const ccRecipients = normalizeRecipients(cc);
111
137
  const bccRecipients = normalizeRecipients(bcc);
112
138
  const logRecipients = [...toRecipients, ...ccRecipients, ...bccRecipients];
@@ -139,7 +165,7 @@ export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, al
139
165
  tags,
140
166
  configurationSetName,
141
167
  };
142
- return await sendWithRetries(params, logRecipients, archiveContext);
168
+ return await sendWithRetries(params, logRecipients, archiveContext, idempotencyKey);
143
169
  };
144
170
  export const sendSingleEmail = async (params) => {
145
171
  if (!normalizeRecipients(params.recipient).length) {
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,14 @@ const LONG_TEXT_VALIDATOR = `${TEXT_PREPROCESS}z.string().describe("textarea"))`
5
5
  const NUMBER_VALIDATOR = 'z.number()';
6
6
  const SIGNATURE_VALIDATOR = `${TEXT_PREPROCESS}z.string().nonempty({ message: "This field is required." }))`;
7
7
  const DROPDOWN_VALIDATOR = `z.enum(["Option 1", "Option 2"], {message:"This field is required."})`;
8
- const MULTISELECT_VALIDATOR = `z.array(
9
- z.enum(
10
- [
11
- "Option 1",
12
- "Option 2"
13
- ],
14
- { message: "This field is required." }
15
- )
8
+ const MULTISELECT_VALIDATOR = `z.array(
9
+ z.enum(
10
+ [
11
+ "Option 1",
12
+ "Option 2"
13
+ ],
14
+ { message: "This field is required." }
15
+ )
16
16
  ).describe("multiselect")`;
17
17
  const DATE_VALIDATOR = 'z.coerce.date()';
18
18
  const TIME_VALIDATOR = 'z.string().describe("time")';
@@ -1,140 +1,141 @@
1
- import { ZodType } from 'zod';
2
- import { ClientBlock, ClientField, ClientPhantomField } from './fields.client.js';
3
- import { ServerField } from './fields.server.js';
4
- import { FontName } from './constants/fonts.js';
5
- import type { ValidatorIRv0 } from './validator-ir.js';
6
- export type FormValues = Record<string, string>;
7
- export type FormErrors = Record<string, string>;
8
- export declare const SCHEMA_VERSION = 1;
9
- export declare const FIELD_TYPES: string[];
10
- export declare const BLOCK_TYPES: string[];
11
- export declare const ALIGN_H: string[];
12
- export declare const ALIGN_V: string[];
13
- export declare const SOURCES: string[];
14
- export type { ValidatorIRv0, ValidatorBaseType } from './validator-ir.js';
15
- export interface IFormMetadata {
16
- name: string;
17
- label: string;
18
- schema_version: number;
19
- schema: IForm;
20
- signing_parties: IFormSigningParty[];
21
- subscribers?: IFormSubscriber[];
22
- }
23
- export type IFormSubscriber = {
24
- email: string;
25
- };
26
- export interface IFormSignatory {
27
- name?: string;
28
- email: string;
29
- title?: string;
30
- honorific?: string;
31
- }
32
- export interface IFormSigningParty {
33
- _id: string;
34
- order: number;
35
- signatory_title: string;
36
- signatory_account?: IFormSignatory;
37
- signatory_source?: {
38
- _id: string;
39
- label: string;
40
- tooltip_label: string;
41
- };
42
- signed?: boolean;
43
- }
44
- export interface IFormSignee {
45
- name: string;
46
- sourceEmail: string;
47
- title?: string;
48
- honorific?: string;
49
- signedDate?: number;
50
- }
51
- export interface IForm {
52
- blocks: IFormBlock[];
53
- }
54
- export interface IFormBlock {
55
- _id: string;
56
- block_type: (typeof BLOCK_TYPES)[number];
57
- order: number;
58
- signing_party_id: IFormSigningParty['_id'];
59
- text_content?: string;
60
- field_schema?: IFormField;
61
- phantom_field_schema?: IFormPhantomField;
62
- }
63
- export interface IFormField {
64
- field: string;
65
- type: 'text' | 'signature' | 'image';
66
- x: number;
67
- y: number;
68
- w: number;
69
- h: number;
70
- page: number;
71
- align_h?: (typeof ALIGN_H)[number];
72
- align_v?: (typeof ALIGN_V)[number];
73
- label: string;
74
- tooltip_label: string;
75
- shared: boolean;
76
- source: (typeof SOURCES)[number];
77
- prefiller?: string;
78
- validator?: string;
79
- validator_ir?: ValidatorIRv0 | null;
80
- size?: number;
81
- wrap?: boolean;
82
- font?: FontName;
83
- radio_group_id?: string;
84
- radio_option_label?: string;
85
- }
86
- export interface IFormPhantomField {
87
- field: string;
88
- type: 'text' | 'signature' | 'image';
89
- label: string;
90
- tooltip_label: string;
91
- shared: boolean;
92
- source: (typeof SOURCES)[number];
93
- prefiller?: string;
94
- validator?: string;
95
- validator_ir?: ValidatorIRv0 | null;
96
- radio_group_id?: string;
97
- radio_option_label?: string;
98
- }
99
- export interface IFormParameters {
100
- [key: string]: string | ZodType;
101
- }
102
- export type IFormSourceDomains<SourceDomains extends any[]> = Record<string, SourceDomains[number]>;
103
- export type IFormFieldValidator = ZodType;
104
- export type IFormFieldPrefiller<SourceDomains extends any[]> = (sourceDomains: IFormSourceDomains<SourceDomains>) => string;
105
- export declare class FormMetadata<SourceDomains extends any[]> {
106
- private readonly formMetadata;
107
- private readonly blocks;
108
- constructor(formMetadata: IFormMetadata);
109
- getBlocksForClientService(signingPartyId?: string): ClientBlock<SourceDomains>[];
110
- getSigningPartyFieldName(signingPartyId: string): string;
111
- getSigningPartyTitleFromFieldName(signingPartyFieldName: string): string | undefined;
112
- getSigningPartyBlocks(sourceSigningPartyId: string): ClientBlock<SourceDomains>[];
113
- getSigningPartyFields(signingPartyId: string): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
114
- static getSigningPartyValues(signingParties: IFormSigningParty[], values: FormValues): Record<string, IFormSignatory>;
115
- private getFields;
116
- private getField;
117
- private getPhantomFields;
118
- private getPhantomField;
119
- encodeAsJSON(): string;
120
- static decodeFromJSON<SourceDomains extends any[]>(json: string): FormMetadata<SourceDomains>;
121
- getLabel(): string;
122
- private getFieldForClientService;
123
- getFieldsForClientService(signingPartyId?: string, sourceDomains?: IFormSourceDomains<SourceDomains>, derivationBase?: IFormParameters): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
124
- getSignatureFieldsForClientService(signingPartyId: string): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
125
- getSignatureValueForSigningParty(values: FormValues, signingPartyId: string): string;
126
- setSignatureValueForSigningParty(values: FormValues, signatureString: string, signingPartyId: string): FormValues;
127
- getFieldsForEditorService(): IFormField[];
128
- getPhantomFieldsForEditorService(): IFormPhantomField[];
129
- getBlocksForEditorService(): IFormBlock[];
130
- getFieldsForSigningService(): ServerField[];
131
- inferParams(): string[];
132
- private parseValidator;
133
- private parsePrefiller;
134
- private enumerateParams;
135
- private populateParams;
136
- getSchemaVersion(): number;
137
- getSubscribers(): IFormSubscriber[];
138
- getSigningParties(): IFormSigningParty[];
139
- mayInvolveEsign(): boolean;
140
- }
1
+ import { ZodType } from 'zod';
2
+ import { ClientBlock, ClientField, ClientPhantomField } from './fields.client.js';
3
+ import { ServerField } from './fields.server.js';
4
+ import { FontName } from './constants/fonts.js';
5
+ import type { ValidatorIRv0 } from './validator-ir.js';
6
+ export type FormValues = Record<string, string>;
7
+ export type FormErrors = Record<string, string>;
8
+ export declare const SCHEMA_VERSION = 1;
9
+ export declare const FIELD_TYPES: string[];
10
+ export declare const BLOCK_TYPES: string[];
11
+ export declare const ALIGN_H: string[];
12
+ export declare const ALIGN_V: string[];
13
+ export declare const SOURCES: string[];
14
+ export type { ValidatorIRv0, ValidatorBaseType } from './validator-ir.js';
15
+ export interface IFormMetadata {
16
+ name: string;
17
+ label: string;
18
+ schema_version: number;
19
+ schema: IForm;
20
+ signing_parties: IFormSigningParty[];
21
+ subscribers?: IFormSubscriber[];
22
+ }
23
+ export type IFormSubscriber = {
24
+ email: string;
25
+ };
26
+ export interface IFormSignatory {
27
+ name?: string;
28
+ email: string;
29
+ title?: string;
30
+ honorific?: string;
31
+ }
32
+ export interface IFormSigningParty {
33
+ _id: string;
34
+ order: number;
35
+ signatory_title: string;
36
+ signatory_account?: IFormSignatory;
37
+ signatory_source?: {
38
+ _id: string;
39
+ label: string;
40
+ tooltip_label: string;
41
+ };
42
+ signed?: boolean;
43
+ signed_ip_address?: string;
44
+ }
45
+ export interface IFormSignee {
46
+ name: string;
47
+ sourceEmail: string;
48
+ title?: string;
49
+ honorific?: string;
50
+ signedDate?: number;
51
+ }
52
+ export interface IForm {
53
+ blocks: IFormBlock[];
54
+ }
55
+ export interface IFormBlock {
56
+ _id: string;
57
+ block_type: (typeof BLOCK_TYPES)[number];
58
+ order: number;
59
+ signing_party_id: IFormSigningParty['_id'];
60
+ text_content?: string;
61
+ field_schema?: IFormField;
62
+ phantom_field_schema?: IFormPhantomField;
63
+ }
64
+ export interface IFormField {
65
+ field: string;
66
+ type: 'text' | 'signature' | 'image';
67
+ x: number;
68
+ y: number;
69
+ w: number;
70
+ h: number;
71
+ page: number;
72
+ align_h?: (typeof ALIGN_H)[number];
73
+ align_v?: (typeof ALIGN_V)[number];
74
+ label: string;
75
+ tooltip_label: string;
76
+ shared: boolean;
77
+ source: (typeof SOURCES)[number];
78
+ prefiller?: string;
79
+ validator?: string;
80
+ validator_ir?: ValidatorIRv0 | null;
81
+ size?: number;
82
+ wrap?: boolean;
83
+ font?: FontName;
84
+ radio_group_id?: string;
85
+ radio_option_label?: string;
86
+ }
87
+ export interface IFormPhantomField {
88
+ field: string;
89
+ type: 'text' | 'signature' | 'image';
90
+ label: string;
91
+ tooltip_label: string;
92
+ shared: boolean;
93
+ source: (typeof SOURCES)[number];
94
+ prefiller?: string;
95
+ validator?: string;
96
+ validator_ir?: ValidatorIRv0 | null;
97
+ radio_group_id?: string;
98
+ radio_option_label?: string;
99
+ }
100
+ export interface IFormParameters {
101
+ [key: string]: string | ZodType;
102
+ }
103
+ export type IFormSourceDomains<SourceDomains extends any[]> = Record<string, SourceDomains[number]>;
104
+ export type IFormFieldValidator = ZodType;
105
+ export type IFormFieldPrefiller<SourceDomains extends any[]> = (sourceDomains: IFormSourceDomains<SourceDomains>) => string;
106
+ export declare class FormMetadata<SourceDomains extends any[]> {
107
+ private readonly formMetadata;
108
+ private readonly blocks;
109
+ constructor(formMetadata: IFormMetadata);
110
+ getBlocksForClientService(signingPartyId?: string): ClientBlock<SourceDomains>[];
111
+ getSigningPartyFieldName(signingPartyId: string): string;
112
+ getSigningPartyTitleFromFieldName(signingPartyFieldName: string): string | undefined;
113
+ getSigningPartyBlocks(sourceSigningPartyId: string): ClientBlock<SourceDomains>[];
114
+ getSigningPartyFields(signingPartyId: string): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
115
+ static getSigningPartyValues(signingParties: IFormSigningParty[], values: FormValues): Record<string, IFormSignatory>;
116
+ private getFields;
117
+ private getField;
118
+ private getPhantomFields;
119
+ private getPhantomField;
120
+ encodeAsJSON(): string;
121
+ static decodeFromJSON<SourceDomains extends any[]>(json: string): FormMetadata<SourceDomains>;
122
+ getLabel(): string;
123
+ private getFieldForClientService;
124
+ getFieldsForClientService(signingPartyId?: string, sourceDomains?: IFormSourceDomains<SourceDomains>, derivationBase?: IFormParameters): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
125
+ getSignatureFieldsForClientService(signingPartyId: string): (ClientField<SourceDomains> | ClientPhantomField<SourceDomains>)[];
126
+ getSignatureValueForSigningParty(values: FormValues, signingPartyId: string): string;
127
+ setSignatureValueForSigningParty(values: FormValues, signatureString: string, signingPartyId: string): FormValues;
128
+ getFieldsForEditorService(): IFormField[];
129
+ getPhantomFieldsForEditorService(): IFormPhantomField[];
130
+ getBlocksForEditorService(): IFormBlock[];
131
+ getFieldsForSigningService(): ServerField[];
132
+ inferParams(): string[];
133
+ private parseValidator;
134
+ private parsePrefiller;
135
+ private enumerateParams;
136
+ private populateParams;
137
+ getSchemaVersion(): number;
138
+ getSubscribers(): IFormSubscriber[];
139
+ getSigningParties(): IFormSigningParty[];
140
+ mayInvolveEsign(): boolean;
141
+ }