@betterinternship/core 2.16.9 → 2.18.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
+ ```
@@ -1,5 +1,3 @@
1
- import { SESClient } from '@aws-sdk/client-ses';
2
- export declare const sesClient: SESClient;
3
1
  type EmailAlias = 'otp' | 'applications' | 'sign' | 'hello' | 'apply';
4
2
  export interface IEmailParams {
5
3
  sender?: string;
@@ -7,6 +5,8 @@ export interface IEmailParams {
7
5
  recipient: string;
8
6
  content: string;
9
7
  alias?: EmailAlias;
8
+ configurationSetName?: string;
9
+ tags?: Record<string, string>;
10
10
  }
11
11
  export interface IMultiEmailParams {
12
12
  sender?: string;
@@ -16,12 +16,14 @@ export interface IMultiEmailParams {
16
16
  bcc?: string | string[];
17
17
  content: string;
18
18
  alias?: EmailAlias;
19
+ configurationSetName?: string;
20
+ tags?: Record<string, string>;
19
21
  }
20
- export declare const sendSingleEmail: (params: IEmailParams) => Promise<{
22
+ export declare const sendMultiEmail: ({ sender, subject, to, cc, bcc, content, alias, configurationSetName, tags, }: IMultiEmailParams) => Promise<{
21
23
  messageId: string | undefined;
22
24
  response: string;
23
25
  } | undefined>;
24
- export declare const sendMultiEmail: (params: IMultiEmailParams) => Promise<{
26
+ export declare const sendSingleEmail: (params: IEmailParams) => Promise<{
25
27
  messageId: string | undefined;
26
28
  response: string;
27
29
  } | undefined>;
@@ -1,30 +1,61 @@
1
- import { SendEmailCommand } from '@aws-sdk/client-ses';
2
- import { SESClient } from '@aws-sdk/client-ses';
1
+ import { SendEmailCommand, SESClient, } from '@aws-sdk/client-ses';
2
+ import { randomUUID } from 'crypto';
3
3
  import { ENV } from '../env.js';
4
- const SMTP_EMAIL = ENV.SMTP_EMAIL;
5
- const SMTP_PASSWORD = ENV.SMTP_PASSWORD;
6
- if (!SMTP_EMAIL || !SMTP_PASSWORD)
7
- throw Error('[ERROR:ENV]: Missing SMTP setup.');
8
- const AWS_ACCESS_KEY_ID = ENV.AWS_ACCESS_KEY_ID;
9
- const AWS_SECRET_ACCESS_KEY = ENV.AWS_SECRET_ACCESS_KEY;
10
- const AWS_REGION = ENV.AWS_REGION;
11
- const AWS_DISABLED = !AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY || !AWS_REGION;
12
- if (AWS_DISABLED)
13
- console.error('[ERROR:ENV]: Missing Amazon setup.');
14
- export const sesClient = new SESClient({
15
- region: ENV.AWS_REGION,
16
- });
17
- const onEmailError = (recipient, resolve) => (error, info) => {
18
- if (error) {
19
- console.error('[ERROR:EMAIL] Could not send email.');
20
- console.error('[-----] ' + error.message);
4
+ let _sesClient = null;
5
+ const getSesClient = () => {
6
+ if (!_sesClient) {
7
+ if (!ENV.AWS_ACCESS_KEY_ID || !ENV.AWS_SECRET_ACCESS_KEY || !ENV.AWS_REGION)
8
+ console.error('[ERROR:ENV]: Missing Amazon setup.');
9
+ _sesClient = new SESClient({ region: ENV.AWS_REGION, maxAttempts: 1 });
21
10
  }
22
- else {
23
- resolve({
24
- messageId: info.messageId,
25
- response: info.response,
11
+ return _sesClient;
12
+ };
13
+ const RETRY_BASE_DELAY_MS = 500;
14
+ const RETRY_DELAY_FACTOR = 3;
15
+ const getMaxAttempts = () => {
16
+ const parsed = parseInt(ENV.EMAIL_SEND_MAX_ATTEMPTS ?? '', 10);
17
+ return Number.isFinite(parsed) && parsed >= 1 ? parsed : 3;
18
+ };
19
+ const getRetryDelayMs = (attempt) => {
20
+ const base = RETRY_BASE_DELAY_MS * RETRY_DELAY_FACTOR ** (attempt - 1);
21
+ const jitter = base * 0.25 * (Math.random() * 2 - 1);
22
+ return Math.round(base + jitter);
23
+ };
24
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
25
+ const isRetryableSendError = (error) => {
26
+ const err = error;
27
+ if (err.name === 'ThrottlingException')
28
+ return true;
29
+ if (err.name === 'TooManyRequestsException')
30
+ return true;
31
+ const status = err.$metadata?.httpStatusCode;
32
+ if (status === undefined)
33
+ return true;
34
+ return status === 429 || status >= 500;
35
+ };
36
+ const describeError = (error) => {
37
+ const err = error;
38
+ return `${err.name ?? 'Error'}: ${err.message ?? String(error)}`;
39
+ };
40
+ const recordSendFailure = async (failure) => {
41
+ if (!ENV.DB_URL) {
42
+ console.warn('[EMAIL] DB_URL not set; send failure not recorded.');
43
+ return;
44
+ }
45
+ try {
46
+ const { emailDeliveryEvents } = await import('@betterinternship/db');
47
+ await emailDeliveryEvents.create({
48
+ data: {
49
+ event_type: 'send_failure',
50
+ recipient_email: failure.recipient,
51
+ feedback_id: randomUUID(),
52
+ attempts: failure.attempts,
53
+ error_message: describeError(failure.error),
54
+ },
26
55
  });
27
- console.warn('[EMAIL] Email sent to ' + recipient);
56
+ }
57
+ catch (error) {
58
+ console.error('[ERROR:EMAIL] Could not record send failure.', error);
28
59
  }
29
60
  };
30
61
  const normalizeRecipients = (value) => {
@@ -35,34 +66,41 @@ const normalizeRecipients = (value) => {
35
66
  ...new Set(list.map((recipient) => recipient.trim()).filter(Boolean)),
36
67
  ];
37
68
  };
38
- const amazonEmailRoute = async ({ sender, subject, recipient, content, alias = 'hello', }) => {
39
- const params = {
40
- Destination: {
41
- ToAddresses: [recipient],
42
- },
43
- Message: {
44
- Subject: { Data: subject },
45
- Body: {
46
- Html: { Data: content },
47
- },
48
- },
49
- Source: `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`,
50
- };
51
- try {
52
- const command = new SendEmailCommand(params);
53
- const result = await sesClient.send(command);
54
- console.warn('[AWSSES] Email sent to ' + recipient);
55
- return {
56
- messageId: result.MessageId,
57
- response: 'Successfully sent via Amazon SES.',
58
- };
59
- }
60
- catch (error) {
61
- console.error('[ERROR:AWSSES] Could not send email.');
62
- console.error('[-----] ' + error);
69
+ const toSesTags = (tags) => Object.entries(tags).map(([name, value]) => ({
70
+ Name: name,
71
+ Value: value.trim().slice(0, 256).replaceAll(' ', ''),
72
+ }));
73
+ const sendWithRetries = async (params, logRecipients) => {
74
+ const maxAttempts = getMaxAttempts();
75
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
76
+ try {
77
+ const command = new SendEmailCommand(params);
78
+ const result = await getSesClient().send(command);
79
+ console.warn('[AWSSES] Email sent to ' + logRecipients.join(', '));
80
+ return {
81
+ messageId: result.MessageId,
82
+ response: 'Successfully sent via Amazon SES.',
83
+ };
84
+ }
85
+ catch (error) {
86
+ if (isRetryableSendError(error) && attempt < maxAttempts) {
87
+ const delay = getRetryDelayMs(attempt);
88
+ console.error(`[ERROR:AWSSES] Send failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms: ${describeError(error)}`);
89
+ await sleep(delay);
90
+ continue;
91
+ }
92
+ console.error(`[ERROR:AWSSES] Send failed permanently after ${attempt} attempt(s) to ${logRecipients.join(', ')}: ${describeError(error)}`);
93
+ await recordSendFailure({
94
+ recipient: logRecipients[0],
95
+ attempts: attempt,
96
+ error,
97
+ });
98
+ return undefined;
99
+ }
63
100
  }
101
+ return undefined;
64
102
  };
65
- const amazonMultiEmailRoute = async ({ sender, subject, to, cc, bcc, content, alias = 'hello', }) => {
103
+ export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, alias = 'hello', configurationSetName, tags, }) => {
66
104
  const toRecipients = normalizeRecipients(to);
67
105
  if (!toRecipients.length)
68
106
  throw Error('[ERROR:EMAIL] No recipients provided for email.');
@@ -82,25 +120,16 @@ const amazonMultiEmailRoute = async ({ sender, subject, to, cc, bcc, content, al
82
120
  },
83
121
  },
84
122
  Source: `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`,
123
+ ConfigurationSetName: configurationSetName,
124
+ Tags: tags ? toSesTags(tags) : undefined,
85
125
  };
86
- try {
87
- const command = new SendEmailCommand(params);
88
- const result = await sesClient.send(command);
89
- console.warn('[AWSSES] Email sent to ' + logRecipients.join(', '));
90
- return {
91
- messageId: result.MessageId,
92
- response: 'Successfully sent via Amazon SES.',
93
- };
94
- }
95
- catch (error) {
96
- console.error('[ERROR:AWSSES] Could not send email.');
97
- console.error('[-----] ' + error);
98
- }
126
+ return await sendWithRetries(params, logRecipients);
99
127
  };
100
128
  export const sendSingleEmail = async (params) => {
101
- return await amazonEmailRoute(params);
102
- };
103
- export const sendMultiEmail = async (params) => {
104
- return await amazonMultiEmailRoute(params);
129
+ if (!normalizeRecipients(params.recipient).length) {
130
+ console.error('[ERROR:EMAIL] No recipient provided for email.');
131
+ return undefined;
132
+ }
133
+ return await sendMultiEmail({ ...params, to: params.recipient });
105
134
  };
106
135
  //# sourceMappingURL=email.js.map
@@ -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":"AAaA,OAAO,EAEL,gBAAgB,EAEhB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAmChC,IAAI,UAAU,GAAqB,IAAI,CAAC;AACxC,MAAM,YAAY,GAAG,GAAc,EAAE;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,GAAG,CAAC,UAAU;YACzE,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACtD,UAAU,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAGF,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE;IAC1C,MAAM,IAAI,GAAG,mBAAmB,GAAG,kBAAkB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAMhF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,EAAE;IAC9C,MAAM,GAAG,GAAG,KAGX,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC;IAE7C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,EAAE;IACvC,MAAM,GAAG,GAAG,KAA4C,CAAC;IACzD,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnE,CAAC,CAAC;AAMF,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAIhC,EAAE,EAAE;IACH,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACrE,MAAM,mBAAmB,CAAC,MAAM,CAAC;YAC/B,IAAI,EAAE;gBACJ,UAAU,EAAE,cAAc;gBAC1B,eAAe,EAAE,OAAO,CAAC,SAAS;gBAClC,WAAW,EAAE,UAAU,EAAE;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;aAC5C;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAyB,EAAE,EAAE;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO;QACL,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACtE,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,SAAS,GAAG,CAAC,IAA4B,EAAgB,EAAE,CAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;CACtD,CAAC,CAAC,CAAC;AAEN,MAAM,eAAe,GAAG,KAAK,EAC3B,MAA6B,EAC7B,aAAuB,EACvB,EAAE;IACF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,yBAAyB,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,OAAO;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,mCAAmC;aAC9C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBACzD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACvC,OAAO,CAAC,KAAK,CACX,uCAAuC,OAAO,IAAI,WAAW,kBAAkB,KAAK,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,CAClH,CAAC;gBACF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,OAAO,CAAC,KAAK,CACX,gDAAgD,OAAO,kBAAkB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAC7H,CAAC;YACF,MAAM,iBAAiB,CAAC;gBACtB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,KAAK;aACN,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,EACnC,MAAM,EACN,OAAO,EACP,EAAE,EACF,EAAE,EACF,GAAG,EACH,OAAO,EACP,KAAK,GAAG,OAAO,EACf,oBAAoB,EACpB,IAAI,GACc,EAAE,EAAE;IACtB,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,YAAY,CAAC,MAAM;QACtB,MAAM,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC;IAE3E,MAAM,MAAM,GAA0B;QACpC,WAAW,EAAE;YACX,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YAC3D,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;SAC/D;QACD,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1B,IAAI,EAAE;gBACJ,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACxB;SACF;QACD,MAAM,EAAE,IAAI,MAAM,IAAI,kBAAkB,MAAM,KAAK,wBAAwB;QAC3E,oBAAoB,EAAE,oBAAoB;QAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC;IAEF,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,MAAoB,EAAE,EAAE;IAG5D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC"}
@@ -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")';
@@ -77,13 +77,13 @@ export const ensurePreviewFontsLoaded = () => {
77
77
  if (!document.getElementById(PREVIEW_FONT_STYLE_ID)) {
78
78
  const style = document.createElement("style");
79
79
  style.id = PREVIEW_FONT_STYLE_ID;
80
- style.textContent = `
81
- @font-face {
82
- font-family: "MegastinaPreview";
83
- src: url("/fonts/megastina.regular.ttf") format("truetype");
84
- font-weight: 400;
85
- font-style: normal;
86
- font-display: block;
80
+ style.textContent = `
81
+ @font-face {
82
+ font-family: "MegastinaPreview";
83
+ src: url("/fonts/megastina.regular.ttf") format("truetype");
84
+ font-weight: 400;
85
+ font-style: normal;
86
+ font-display: block;
87
87
  }`;
88
88
  document.head.appendChild(style);
89
89
  }