@beabee/beabee-common 0.20.3 → 0.20.5

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.
@@ -0,0 +1,2360 @@
1
+ (() => {
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, { get: all[name], enumerable: true });
6
+ };
7
+
8
+ // src/index.ts
9
+ var src_exports = {};
10
+ __export(src_exports, {
11
+ CalloutComponentBaseType: () => CalloutComponentBaseType,
12
+ CalloutComponentType: () => CalloutComponentType,
13
+ ContributionPeriod: () => ContributionPeriod,
14
+ ContributionType: () => ContributionType,
15
+ InvalidRule: () => InvalidRule,
16
+ ItemStatus: () => ItemStatus,
17
+ MembershipStatus: () => MembershipStatus,
18
+ NewsletterStatus: () => NewsletterStatus,
19
+ PaymentMethod: () => PaymentMethod,
20
+ PaymentStatus: () => PaymentStatus,
21
+ RoleTypes: () => RoleTypes,
22
+ apiKeyFilters: () => apiKeyFilters,
23
+ calcPaymentFee: () => calcPaymentFee,
24
+ calloutComponentContentValidator: () => calloutComponentContentValidator,
25
+ calloutComponentInputAddressValidator: () => calloutComponentInputAddressValidator,
26
+ calloutComponentInputCheckboxValidator: () => calloutComponentInputCheckboxValidator,
27
+ calloutComponentInputCurrencyValidator: () => calloutComponentInputCurrencyValidator,
28
+ calloutComponentInputDateTimeValidator: () => calloutComponentInputDateTimeValidator,
29
+ calloutComponentInputEmailValidator: () => calloutComponentInputEmailValidator,
30
+ calloutComponentInputFileValidator: () => calloutComponentInputFileValidator,
31
+ calloutComponentInputNumberValidator: () => calloutComponentInputNumberValidator,
32
+ calloutComponentInputPhoneNumberValidator: () => calloutComponentInputPhoneNumberValidator,
33
+ calloutComponentInputSelectValidator: () => calloutComponentInputSelectValidator,
34
+ calloutComponentInputSelectableTypes: () => calloutComponentInputSelectableTypes,
35
+ calloutComponentInputSelectableValidator: () => calloutComponentInputSelectableValidator,
36
+ calloutComponentInputSignatureValidator: () => calloutComponentInputSignatureValidator,
37
+ calloutComponentInputTextTypes: () => calloutComponentInputTextTypes,
38
+ calloutComponentInputTextValidator: () => calloutComponentInputTextValidator,
39
+ calloutComponentInputTimeValidator: () => calloutComponentInputTimeValidator,
40
+ calloutComponentInputTypes: () => calloutComponentInputTypes,
41
+ calloutComponentInputUrlValidator: () => calloutComponentInputUrlValidator,
42
+ calloutComponentInputValidator: () => calloutComponentInputValidator,
43
+ calloutComponentNestableTypes: () => calloutComponentNestableTypes,
44
+ calloutComponentNestableValidator: () => calloutComponentNestableValidator,
45
+ calloutComponentTypes: () => calloutComponentTypes,
46
+ calloutComponentValidator: () => calloutComponentValidator,
47
+ calloutFilters: () => calloutFilters,
48
+ calloutResponseCommentFilters: () => calloutResponseCommentFilters,
49
+ calloutResponseFilters: () => calloutResponseFilters,
50
+ calloutTagFilters: () => calloutTagFilters,
51
+ contactCalloutFilters: () => contactCalloutFilters,
52
+ contactFilters: () => contactFilters,
53
+ dateUnitMap: () => dateUnitMap,
54
+ dateUnits: () => dateUnits,
55
+ filterComponents: () => filterComponents,
56
+ flattenComponents: () => flattenComponents,
57
+ getCalloutComponents: () => getCalloutComponents,
58
+ getCalloutFilters: () => getCalloutFilters,
59
+ getMinDateUnit: () => getMinDateUnit,
60
+ isAddressAnswer: () => isAddressAnswer,
61
+ isAmountOfMoney: () => isAmountOfMoney,
62
+ isAngle: () => isAngle,
63
+ isCalloutComponentOfBaseType: () => isCalloutComponentOfBaseType,
64
+ isCalloutComponentOfType: () => isCalloutComponentOfType,
65
+ isDateBetween: () => isDateBetween,
66
+ isEmail: () => isEmail,
67
+ isFileUploadAnswer: () => isFileUploadAnswer,
68
+ isLngLat: () => isLngLat,
69
+ isMapBounds: () => isMapBounds,
70
+ isNumber: () => isNumber,
71
+ isNumberInRange: () => isNumberInRange,
72
+ isPassword: () => isPassword,
73
+ isPeriod: () => isPeriod,
74
+ isPhoneNumber: () => isPhoneNumber,
75
+ isRuleGroup: () => isRuleGroup,
76
+ isSlug: () => isSlug,
77
+ isTextInRange: () => isTextInRange,
78
+ isTextInWordRange: () => isTextInWordRange,
79
+ isType: () => isType,
80
+ isURL: () => isURL,
81
+ isValidDate: () => isValidDate,
82
+ isValidPayFee: () => isValidPayFee,
83
+ noticeFilters: () => noticeFilters,
84
+ nullableOperators: () => nullableOperators,
85
+ operatorsByType: () => operatorsByType,
86
+ operatorsByTypeMap: () => operatorsByTypeMap,
87
+ parseDate: () => parseDate2,
88
+ paymentFilters: () => paymentFilters,
89
+ ruleOperators: () => ruleOperators,
90
+ segmentFilters: () => segmentFilters,
91
+ slug: () => slug,
92
+ stringifyAnswer: () => stringifyAnswer,
93
+ toBytes: () => toBytes,
94
+ toPhoneNumber: () => toPhoneNumber,
95
+ validateRule: () => validateRule,
96
+ validateRuleGroup: () => validateRuleGroup
97
+ });
98
+
99
+ // src/data/callout-component-base-type.ts
100
+ var CalloutComponentBaseType = /* @__PURE__ */ ((CalloutComponentBaseType2) => {
101
+ CalloutComponentBaseType2[CalloutComponentBaseType2["CONTENT"] = 0] = "CONTENT";
102
+ CalloutComponentBaseType2[CalloutComponentBaseType2["INPUT"] = 1] = "INPUT";
103
+ CalloutComponentBaseType2[CalloutComponentBaseType2["INPUT_TEXT"] = 2] = "INPUT_TEXT";
104
+ CalloutComponentBaseType2[CalloutComponentBaseType2["INPUT_SELECTABLE"] = 3] = "INPUT_SELECTABLE";
105
+ CalloutComponentBaseType2[CalloutComponentBaseType2["NESTABLE"] = 4] = "NESTABLE";
106
+ return CalloutComponentBaseType2;
107
+ })(CalloutComponentBaseType || {});
108
+
109
+ // src/data/callout-component-type.ts
110
+ var CalloutComponentType = /* @__PURE__ */ ((CalloutComponentType2) => {
111
+ CalloutComponentType2["CONTENT"] = "content";
112
+ CalloutComponentType2["INPUT_ADDRESS"] = "address";
113
+ CalloutComponentType2["INPUT_CHECKBOX"] = "checkbox";
114
+ CalloutComponentType2["INPUT_CURRENCY"] = "currency";
115
+ CalloutComponentType2["INPUT_DATE_TIME"] = "datetime";
116
+ CalloutComponentType2["INPUT_EMAIL"] = "email";
117
+ CalloutComponentType2["INPUT_FILE"] = "file";
118
+ CalloutComponentType2["INPUT_NUMBER"] = "number";
119
+ CalloutComponentType2["INPUT_PHONE_NUMBER"] = "phoneNumber";
120
+ CalloutComponentType2["INPUT_SELECT"] = "select";
121
+ CalloutComponentType2["INPUT_SELECTABLE_RADIO"] = "radio";
122
+ CalloutComponentType2["INPUT_SELECTABLE_SELECTBOXES"] = "selectboxes";
123
+ CalloutComponentType2["INPUT_SIGNATURE"] = "signature";
124
+ CalloutComponentType2["INPUT_TEXT_AREA"] = "textarea";
125
+ CalloutComponentType2["INPUT_TEXT_FIELD"] = "textfield";
126
+ CalloutComponentType2["INPUT_TIME"] = "time";
127
+ CalloutComponentType2["INPUT_URL"] = "url";
128
+ CalloutComponentType2["NESTABLE_PANEL"] = "panel";
129
+ CalloutComponentType2["NESTABLE_TABS"] = "tabs";
130
+ CalloutComponentType2["NESTABLE_WELL"] = "well";
131
+ return CalloutComponentType2;
132
+ })(CalloutComponentType || {});
133
+
134
+ // src/data/callout-component-input-selectable-types.ts
135
+ var calloutComponentInputSelectableTypes = [
136
+ "radio" /* INPUT_SELECTABLE_RADIO */,
137
+ "selectboxes" /* INPUT_SELECTABLE_SELECTBOXES */
138
+ ];
139
+
140
+ // src/data/callout-component-input-text-types.ts
141
+ var calloutComponentInputTextTypes = [
142
+ "textarea" /* INPUT_TEXT_AREA */,
143
+ "textfield" /* INPUT_TEXT_FIELD */
144
+ ];
145
+
146
+ // src/data/callout-component-input-types.ts
147
+ var calloutComponentInputTypes = [
148
+ ...calloutComponentInputSelectableTypes,
149
+ ...calloutComponentInputTextTypes,
150
+ "address" /* INPUT_ADDRESS */,
151
+ "checkbox" /* INPUT_CHECKBOX */,
152
+ "currency" /* INPUT_CURRENCY */,
153
+ "datetime" /* INPUT_DATE_TIME */,
154
+ "email" /* INPUT_EMAIL */,
155
+ "file" /* INPUT_FILE */,
156
+ "number" /* INPUT_NUMBER */,
157
+ "phoneNumber" /* INPUT_PHONE_NUMBER */,
158
+ "select" /* INPUT_SELECT */,
159
+ "signature" /* INPUT_SIGNATURE */,
160
+ "time" /* INPUT_TIME */,
161
+ "url" /* INPUT_URL */
162
+ ];
163
+
164
+ // src/data/callout-component-nestable-types.ts
165
+ var calloutComponentNestableTypes = [
166
+ "panel" /* NESTABLE_PANEL */,
167
+ "well" /* NESTABLE_WELL */,
168
+ "tabs" /* NESTABLE_TABS */
169
+ ];
170
+
171
+ // src/data/callout-component-types.ts
172
+ var calloutComponentTypes = [
173
+ ...calloutComponentNestableTypes,
174
+ ...calloutComponentInputTypes,
175
+ "content" /* CONTENT */
176
+ ];
177
+
178
+ // src/data/contribution-period.ts
179
+ var ContributionPeriod = /* @__PURE__ */ ((ContributionPeriod2) => {
180
+ ContributionPeriod2["Monthly"] = "monthly";
181
+ ContributionPeriod2["Annually"] = "annually";
182
+ return ContributionPeriod2;
183
+ })(ContributionPeriod || {});
184
+
185
+ // src/data/contribution-type.ts
186
+ var ContributionType = /* @__PURE__ */ ((ContributionType2) => {
187
+ ContributionType2["Automatic"] = "Automatic";
188
+ ContributionType2["Manual"] = "Manual";
189
+ ContributionType2["Gift"] = "Gift";
190
+ ContributionType2["None"] = "None";
191
+ return ContributionType2;
192
+ })(ContributionType || {});
193
+
194
+ // src/data/item-status.ts
195
+ var ItemStatus = /* @__PURE__ */ ((ItemStatus2) => {
196
+ ItemStatus2["Draft"] = "draft";
197
+ ItemStatus2["Scheduled"] = "scheduled";
198
+ ItemStatus2["Open"] = "open";
199
+ ItemStatus2["Ended"] = "ended";
200
+ return ItemStatus2;
201
+ })(ItemStatus || {});
202
+
203
+ // src/data/membership-status.ts
204
+ var MembershipStatus = /* @__PURE__ */ ((MembershipStatus2) => {
205
+ MembershipStatus2["Active"] = "active";
206
+ MembershipStatus2["Expiring"] = "expiring";
207
+ MembershipStatus2["Expired"] = "expired";
208
+ MembershipStatus2["None"] = "none";
209
+ return MembershipStatus2;
210
+ })(MembershipStatus || {});
211
+
212
+ // src/data/newsletter-status.ts
213
+ var NewsletterStatus = /* @__PURE__ */ ((NewsletterStatus2) => {
214
+ NewsletterStatus2["Subscribed"] = "subscribed";
215
+ NewsletterStatus2["Unsubscribed"] = "unsubscribed";
216
+ NewsletterStatus2["Cleaned"] = "cleaned";
217
+ NewsletterStatus2["Pending"] = "pending";
218
+ NewsletterStatus2["None"] = "none";
219
+ return NewsletterStatus2;
220
+ })(NewsletterStatus || {});
221
+
222
+ // src/data/payment-method.ts
223
+ var PaymentMethod = /* @__PURE__ */ ((PaymentMethod2) => {
224
+ PaymentMethod2["StripeCard"] = "s_card";
225
+ PaymentMethod2["StripeSEPA"] = "s_sepa";
226
+ PaymentMethod2["StripeBACS"] = "s_bacs";
227
+ PaymentMethod2["StripePayPal"] = "s_paypal";
228
+ PaymentMethod2["GoCardlessDirectDebit"] = "gc_direct-debit";
229
+ return PaymentMethod2;
230
+ })(PaymentMethod || {});
231
+
232
+ // src/data/payment-status.ts
233
+ var PaymentStatus = /* @__PURE__ */ ((PaymentStatus2) => {
234
+ PaymentStatus2["Pending"] = "pending";
235
+ PaymentStatus2["Successful"] = "successful";
236
+ PaymentStatus2["Failed"] = "failed";
237
+ PaymentStatus2["Cancelled"] = "cancelled";
238
+ return PaymentStatus2;
239
+ })(PaymentStatus || {});
240
+
241
+ // src/error/InvalidRule.ts
242
+ var InvalidRule = class _InvalidRule extends Error {
243
+ constructor(rule, message) {
244
+ super();
245
+ this.rule = rule;
246
+ this.message = message;
247
+ Object.setPrototypeOf(this, _InvalidRule.prototype);
248
+ }
249
+ };
250
+
251
+ // src/search/api-keys.ts
252
+ var apiKeyFilters = {
253
+ id: {
254
+ type: "text"
255
+ },
256
+ createdAt: {
257
+ type: "date"
258
+ }
259
+ };
260
+
261
+ // src/search/callouts.ts
262
+ var calloutFilters = {
263
+ id: {
264
+ type: "text"
265
+ },
266
+ slug: {
267
+ type: "text"
268
+ },
269
+ title: {
270
+ type: "text"
271
+ },
272
+ status: {
273
+ type: "enum",
274
+ options: [
275
+ "draft" /* Draft */,
276
+ "scheduled" /* Scheduled */,
277
+ "open" /* Open */,
278
+ "ended" /* Ended */
279
+ ]
280
+ },
281
+ answeredBy: {
282
+ type: "contact"
283
+ },
284
+ starts: {
285
+ type: "date",
286
+ nullable: true
287
+ },
288
+ expires: {
289
+ type: "date",
290
+ nullable: true
291
+ },
292
+ hidden: {
293
+ type: "boolean"
294
+ }
295
+ };
296
+ var calloutResponseFilters = {
297
+ id: {
298
+ type: "text"
299
+ },
300
+ contact: {
301
+ type: "contact",
302
+ nullable: true
303
+ },
304
+ calloutId: {
305
+ type: "text"
306
+ },
307
+ createdAt: {
308
+ type: "date"
309
+ },
310
+ updatedAt: {
311
+ type: "date"
312
+ },
313
+ bucket: {
314
+ type: "text",
315
+ nullable: true
316
+ },
317
+ tags: {
318
+ type: "array"
319
+ },
320
+ assignee: {
321
+ type: "contact",
322
+ nullable: true
323
+ },
324
+ answers: {
325
+ type: "blob"
326
+ }
327
+ };
328
+ var calloutResponseCommentFilters = {
329
+ id: {
330
+ type: "text"
331
+ },
332
+ responseId: {
333
+ type: "text"
334
+ },
335
+ contact: {
336
+ type: "contact"
337
+ },
338
+ createdAt: {
339
+ type: "date"
340
+ },
341
+ updatedAt: {
342
+ type: "date"
343
+ },
344
+ text: {
345
+ type: "text"
346
+ }
347
+ };
348
+ var calloutTagFilters = {
349
+ id: {
350
+ type: "text"
351
+ },
352
+ name: {
353
+ type: "text"
354
+ },
355
+ description: {
356
+ type: "text"
357
+ },
358
+ calloutId: {
359
+ type: "text"
360
+ }
361
+ };
362
+
363
+ // src/search/contacts.ts
364
+ var RoleTypes = ["member", "admin", "superadmin"];
365
+ var contactFilters = {
366
+ id: {
367
+ type: "contact"
368
+ },
369
+ firstname: {
370
+ type: "text"
371
+ },
372
+ lastname: {
373
+ type: "text"
374
+ },
375
+ email: {
376
+ type: "text"
377
+ },
378
+ joined: {
379
+ type: "date"
380
+ },
381
+ lastSeen: {
382
+ type: "date"
383
+ },
384
+ contributionCancelled: {
385
+ type: "date",
386
+ nullable: true
387
+ },
388
+ contributionType: {
389
+ type: "enum",
390
+ options: [
391
+ "Automatic" /* Automatic */,
392
+ "Gift" /* Gift */,
393
+ "Manual" /* Manual */,
394
+ "None" /* None */
395
+ ]
396
+ },
397
+ contributionMonthlyAmount: {
398
+ type: "number"
399
+ },
400
+ contributionPeriod: {
401
+ type: "enum",
402
+ options: ["monthly" /* Monthly */, "annually" /* Annually */]
403
+ },
404
+ deliveryOptIn: {
405
+ type: "boolean"
406
+ },
407
+ newsletterStatus: {
408
+ type: "enum",
409
+ options: [
410
+ "subscribed" /* Subscribed */,
411
+ "unsubscribed" /* Unsubscribed */,
412
+ "cleaned" /* Cleaned */,
413
+ "pending" /* Pending */,
414
+ "none" /* None */
415
+ ]
416
+ },
417
+ activePermission: {
418
+ type: "enum",
419
+ options: RoleTypes
420
+ },
421
+ activeMembership: {
422
+ type: "boolean"
423
+ },
424
+ membershipStarts: {
425
+ type: "date"
426
+ },
427
+ membershipExpires: {
428
+ type: "date"
429
+ },
430
+ manualPaymentSource: {
431
+ type: "text",
432
+ nullable: true
433
+ },
434
+ tags: {
435
+ type: "array",
436
+ nullable: true
437
+ }
438
+ };
439
+ var contactCalloutFilters = {
440
+ hasAnswered: {
441
+ type: "boolean"
442
+ }
443
+ };
444
+
445
+ // src/search/notices.ts
446
+ var noticeFilters = {
447
+ id: {
448
+ type: "text"
449
+ },
450
+ createdAt: {
451
+ type: "date"
452
+ },
453
+ updatedAt: {
454
+ type: "date"
455
+ },
456
+ name: {
457
+ type: "text"
458
+ },
459
+ expires: {
460
+ type: "date",
461
+ nullable: true
462
+ },
463
+ enabled: {
464
+ type: "boolean"
465
+ },
466
+ text: {
467
+ type: "text"
468
+ },
469
+ status: {
470
+ type: "enum",
471
+ options: [
472
+ "draft" /* Draft */,
473
+ "scheduled" /* Scheduled */,
474
+ "open" /* Open */,
475
+ "ended" /* Ended */
476
+ ]
477
+ }
478
+ };
479
+
480
+ // src/search/operators.ts
481
+ var equalityOperators = {
482
+ equal: { args: 1 },
483
+ not_equal: { args: 1 }
484
+ };
485
+ var stringOperators = {
486
+ begins_with: { args: 1 },
487
+ ends_with: { args: 1 },
488
+ not_begins_with: { args: 1 },
489
+ not_ends_with: { args: 1 }
490
+ };
491
+ var numericOperators = {
492
+ ...equalityOperators,
493
+ between: { args: 2 },
494
+ not_between: { args: 2 },
495
+ less: { args: 1 },
496
+ greater: { args: 1 },
497
+ less_or_equal: { args: 1 },
498
+ greater_or_equal: { args: 1 }
499
+ };
500
+ var arrayOperators = {
501
+ contains: { args: 1 },
502
+ not_contains: { args: 1 }
503
+ };
504
+ var nullableOperators = {
505
+ is_empty: { args: 0 },
506
+ is_not_empty: { args: 0 }
507
+ };
508
+ var operatorsByType = {
509
+ text: { ...equalityOperators, ...arrayOperators, ...stringOperators },
510
+ blob: arrayOperators,
511
+ date: numericOperators,
512
+ number: numericOperators,
513
+ boolean: { equal: equalityOperators.equal },
514
+ array: arrayOperators,
515
+ enum: equalityOperators,
516
+ contact: equalityOperators
517
+ };
518
+ var operatorsByTypeMap = operatorsByType;
519
+ var ruleOperators = [
520
+ "equal",
521
+ "not_equal",
522
+ "less",
523
+ "less_or_equal",
524
+ "greater",
525
+ "greater_or_equal",
526
+ "between",
527
+ "not_between",
528
+ "begins_with",
529
+ "not_begins_with",
530
+ "contains",
531
+ "not_contains",
532
+ "ends_with",
533
+ "not_ends_with",
534
+ "is_empty",
535
+ "is_not_empty"
536
+ ];
537
+
538
+ // src/search/payments.ts
539
+ var paymentFilters = {
540
+ id: {
541
+ type: "text"
542
+ },
543
+ contact: {
544
+ type: "contact"
545
+ },
546
+ chargeDate: {
547
+ type: "date"
548
+ },
549
+ amount: {
550
+ type: "number"
551
+ },
552
+ status: {
553
+ type: "enum",
554
+ options: [
555
+ "successful" /* Successful */,
556
+ "pending" /* Pending */,
557
+ "failed" /* Failed */,
558
+ "cancelled" /* Cancelled */
559
+ ]
560
+ }
561
+ };
562
+
563
+ // src/search/segments.ts
564
+ var segmentFilters = {
565
+ id: {
566
+ type: "text"
567
+ },
568
+ name: {
569
+ type: "text"
570
+ },
571
+ description: {
572
+ type: "text"
573
+ }
574
+ };
575
+
576
+ // src/utils/callouts.ts
577
+ function convertValuesToOptions(values) {
578
+ return values.map(({ value }) => value);
579
+ }
580
+ function convertComponentToFilter(component) {
581
+ const baseItem = {
582
+ label: component.label || component.fullKey,
583
+ nullable: true
584
+ };
585
+ if (isCalloutComponentOfType(component, "checkbox" /* INPUT_CHECKBOX */)) {
586
+ return { ...baseItem, type: "boolean", nullable: false };
587
+ }
588
+ if (isCalloutComponentOfType(component, "number" /* INPUT_NUMBER */)) {
589
+ return { ...baseItem, type: "number" };
590
+ }
591
+ if (isCalloutComponentOfType(
592
+ component,
593
+ "select" /* INPUT_SELECT */
594
+ )) {
595
+ return {
596
+ ...baseItem,
597
+ type: "enum",
598
+ options: convertValuesToOptions(component.data.values)
599
+ };
600
+ }
601
+ if (isCalloutComponentOfType(component, "textarea" /* INPUT_TEXT_AREA */)) {
602
+ return { ...baseItem, type: "blob" };
603
+ }
604
+ return { ...baseItem, type: "text" };
605
+ }
606
+ function getSelectableLabelFromValue(component, value) {
607
+ if (isCalloutComponentOfBaseType(
608
+ component,
609
+ 3 /* INPUT_SELECTABLE */
610
+ )) {
611
+ return component.values.find((v) => v.value === value)?.label || value;
612
+ }
613
+ if (isCalloutComponentOfType(component, "select" /* INPUT_SELECT */)) {
614
+ return component.data.values.find((v) => v.value === value)?.label || value;
615
+ }
616
+ return value;
617
+ }
618
+ function isCalloutComponentOfType(component, type) {
619
+ return "type" in component && component.type === type;
620
+ }
621
+ function isCalloutComponentOfBaseType(component, type) {
622
+ if (!("type" in component)) {
623
+ return false;
624
+ }
625
+ if (type === 0 /* CONTENT */) {
626
+ return isCalloutComponentOfType(
627
+ component,
628
+ "content" /* CONTENT */
629
+ );
630
+ }
631
+ if (type === 1 /* INPUT */) {
632
+ return calloutComponentInputTypes.includes(
633
+ component.type
634
+ );
635
+ }
636
+ if (type === 2 /* INPUT_TEXT */) {
637
+ return calloutComponentInputTextTypes.includes(
638
+ component.type
639
+ );
640
+ }
641
+ if (type === 3 /* INPUT_SELECTABLE */) {
642
+ return calloutComponentInputSelectableTypes.includes(
643
+ component.type
644
+ );
645
+ }
646
+ if (type === 4 /* NESTABLE */) {
647
+ return calloutComponentNestableTypes.includes(
648
+ component.type
649
+ );
650
+ }
651
+ return false;
652
+ }
653
+ function flattenComponents(components) {
654
+ return components.flatMap(
655
+ (component) => isCalloutComponentOfBaseType(component, 4 /* NESTABLE */) ? [component, ...flattenComponents(component.components)] : [component]
656
+ );
657
+ }
658
+ function filterComponents(components, filterFn) {
659
+ return components.filter(filterFn).map((component) => {
660
+ return {
661
+ ...component,
662
+ ...isCalloutComponentOfBaseType(
663
+ component,
664
+ 4 /* NESTABLE */
665
+ ) && {
666
+ components: filterComponents(component.components, filterFn)
667
+ }
668
+ };
669
+ });
670
+ }
671
+ function getCalloutComponents(formSchema) {
672
+ return formSchema.slides.flatMap(
673
+ (slide) => flattenComponents(slide.components).map((component) => ({
674
+ ...component,
675
+ slideId: slide.id,
676
+ fullKey: `${slide.id}.${component.key}`
677
+ }))
678
+ );
679
+ }
680
+ function getCalloutFilters(formSchema) {
681
+ const items = getCalloutComponents(formSchema).filter((c) => c.input).map((c) => [`answers.${c.fullKey}`, convertComponentToFilter(c)]);
682
+ return Object.fromEntries(items);
683
+ }
684
+ function isAddressAnswer(answer) {
685
+ return !!answer && typeof answer === "object" && "geometry" in answer;
686
+ }
687
+ function isFileUploadAnswer(answer) {
688
+ return !!answer && typeof answer === "object" && "url" in answer;
689
+ }
690
+ function stringifyAnswer(component, answer) {
691
+ if (Array.isArray(answer)) {
692
+ return answer.map((a) => stringifyAnswer(component, a)).join(", ");
693
+ } else if (!answer) {
694
+ return "";
695
+ } else if (isAddressAnswer(answer)) {
696
+ return answer.geometry.location.lat + ", " + answer.geometry.location.lng;
697
+ } else if (isFileUploadAnswer(answer)) {
698
+ return answer.url;
699
+ } else if (typeof answer === "object") {
700
+ return Object.entries(answer).filter(([, selected]) => selected).map(([value]) => getSelectableLabelFromValue(component, value)).join(", ");
701
+ } else if (typeof answer === "string") {
702
+ return getSelectableLabelFromValue(component, answer);
703
+ } else {
704
+ return answer.toString();
705
+ }
706
+ }
707
+
708
+ // src/utils/slug.ts
709
+ function getWholeCharAndI(str, i) {
710
+ const code = str.charCodeAt(i);
711
+ if (isNaN(code)) {
712
+ throw new RangeError(
713
+ "Index " + i + ' out of range for string "' + str + '"; please open an issue at https://github.com/Trott/slug/issues/new'
714
+ );
715
+ }
716
+ if (code < 55296 || code > 57343) {
717
+ return [str.charAt(i), i];
718
+ }
719
+ if (code >= 55296 && code <= 56319) {
720
+ if (str.length <= i + 1) {
721
+ return [" ", i];
722
+ }
723
+ const next = str.charCodeAt(i + 1);
724
+ if (next < 56320 || next > 57343) {
725
+ return [" ", i];
726
+ }
727
+ return [str.charAt(i) + str.charAt(i + 1), i + 1];
728
+ }
729
+ if (i === 0) {
730
+ return [" ", i];
731
+ }
732
+ const prev = str.charCodeAt(i - 1);
733
+ if (prev < 55296 || prev > 56319) {
734
+ return [" ", i];
735
+ }
736
+ throw new Error(
737
+ 'String "' + str + '" reaches code believed to be unreachable; please open an issue at https://github.com/Trott/slug/issues/new'
738
+ );
739
+ }
740
+ function base64(input) {
741
+ return btoa(unescape(encodeURIComponent(input)));
742
+ }
743
+ function slug(s, opts) {
744
+ let result = slugify(s, opts);
745
+ const fallback = opts && opts.fallback !== void 0 ? opts.fallback : defaults.fallback;
746
+ if (fallback === true && result === "") {
747
+ let input = "";
748
+ for (let i = 0; i < s.length; i++) {
749
+ const charAndI = getWholeCharAndI(s, i);
750
+ i = charAndI[1];
751
+ input += charAndI[0];
752
+ }
753
+ result = slugify(base64(input), opts);
754
+ }
755
+ return result;
756
+ }
757
+ var locales = {
758
+ // http://www.eki.ee/wgrs/rom1_bg.pdf
759
+ bg: {
760
+ \u0419: "Y",
761
+ \u0439: "y",
762
+ X: "H",
763
+ x: "h",
764
+ \u0426: "Ts",
765
+ \u0446: "ts",
766
+ \u0429: "Sht",
767
+ \u0449: "sht",
768
+ \u042A: "A",
769
+ \u044A: "a",
770
+ \u042C: "Y",
771
+ \u044C: "y"
772
+ },
773
+ // Need a reference URL for German, although this is pretty well-known.
774
+ de: { \u00C4: "AE", \u00E4: "ae", \u00D6: "OE", \u00F6: "oe", \u00DC: "UE", \u00FC: "ue" },
775
+ // Need a reference URL for Serbian.
776
+ sr: { \u0111: "dj", \u0110: "DJ" },
777
+ // https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/864314/ROMANIZATION_OF_UKRAINIAN.pdf
778
+ uk: {
779
+ \u0418: "Y",
780
+ \u0438: "y",
781
+ \u0419: "Y",
782
+ \u0439: "y",
783
+ \u0426: "Ts",
784
+ \u0446: "ts",
785
+ \u0425: "Kh",
786
+ \u0445: "kh",
787
+ \u0429: "Shch",
788
+ \u0449: "shch",
789
+ \u0413: "H",
790
+ \u0433: "h"
791
+ }
792
+ };
793
+ function slugify(str, partialOpts) {
794
+ const mode = partialOpts?.mode || defaults.mode;
795
+ const opts = { ...defaults.modes[mode], ...partialOpts };
796
+ const localeMap = !!opts.locale && locales[opts.locale] || {};
797
+ let lengths = [];
798
+ for (const key in opts.multicharmap) {
799
+ if (!Object.prototype.hasOwnProperty.call(opts.multicharmap, key)) {
800
+ continue;
801
+ }
802
+ const len = key.length;
803
+ if (lengths.indexOf(len) === -1) {
804
+ lengths.push(len);
805
+ }
806
+ }
807
+ lengths = lengths.sort(function(a, b) {
808
+ return b - a;
809
+ });
810
+ const disallowedChars = opts.mode === "rfc3986" ? /[^\w\s\-.~]/ : /[^A-Za-z0-9\s]/;
811
+ let result = "";
812
+ for (let char, i = 0, l = str.length; i < l; i++) {
813
+ char = str[i];
814
+ let matchedMultichar = false;
815
+ for (let j = 0; j < lengths.length; j++) {
816
+ const len = lengths[j];
817
+ const substr = str.substr(i, len);
818
+ if (opts.multicharmap[substr]) {
819
+ i += len - 1;
820
+ char = opts.multicharmap[substr];
821
+ matchedMultichar = true;
822
+ break;
823
+ }
824
+ }
825
+ if (!matchedMultichar) {
826
+ if (localeMap[char]) {
827
+ char = localeMap[char];
828
+ } else if (opts.charmap[char]) {
829
+ char = opts.charmap[char].replace(opts.replacement, " ");
830
+ } else if (char.includes(opts.replacement)) {
831
+ char = char.replace(opts.replacement, " ");
832
+ } else {
833
+ char = char.replace(disallowedChars, "");
834
+ }
835
+ }
836
+ result += char;
837
+ }
838
+ if (opts.remove) {
839
+ result = result.replace(opts.remove, "");
840
+ }
841
+ if (opts.trim) {
842
+ result = result.trim();
843
+ }
844
+ result = result.replace(/\s+/g, opts.replacement);
845
+ if (opts.lower) {
846
+ result = result.toLowerCase();
847
+ }
848
+ return result;
849
+ }
850
+ var initialMulticharmap = {
851
+ // multibyte devanagari characters (hindi, sanskrit, etc.)
852
+ \u092B\u093C: "Fi",
853
+ \u0917\u093C: "Ghi",
854
+ \u0916\u093C: "Khi",
855
+ \u0915\u093C: "Qi",
856
+ \u0921\u093C: "ugDha",
857
+ \u0922\u093C: "ugDhha",
858
+ \u092F\u093C: "Yi",
859
+ \u091C\u093C: "Za",
860
+ // hebrew
861
+ // Refs: http://www.eki.ee/wgrs/rom1_he.pdf
862
+ // Refs: https://en.wikipedia.org/wiki/Niqqud
863
+ \u05D1\u05B4\u05D9: "i",
864
+ \u05D1\u05B5: "e",
865
+ \u05D1\u05B5\u05D9: "e",
866
+ \u05D1\u05B6: "e",
867
+ \u05D1\u05B7: "a",
868
+ \u05D1\u05B8: "a",
869
+ \u05D1\u05B9: "o",
870
+ \u05D5\u05B9: "o",
871
+ \u05D1\u05BB: "u",
872
+ \u05D5\u05BC: "u",
873
+ \u05D1\u05BC: "b",
874
+ \u05DB\u05BC: "k",
875
+ \u05DA\u05BC: "k",
876
+ \u05E4\u05BC: "p",
877
+ \u05E9\u05C1: "sh",
878
+ \u05E9\u05C2: "s",
879
+ \u05D1\u05B0: "e",
880
+ \u05D7\u05B1: "e",
881
+ \u05D7\u05B2: "a",
882
+ \u05D7\u05B3: "o",
883
+ \u05D1\u05B4: "i"
884
+ };
885
+ var initialCharmap = {
886
+ // latin
887
+ \u00C0: "A",
888
+ \u00C1: "A",
889
+ \u00C2: "A",
890
+ \u00C3: "A",
891
+ \u00C4: "A",
892
+ \u00C5: "A",
893
+ \u00C6: "AE",
894
+ \u00C7: "C",
895
+ \u00C8: "E",
896
+ \u00C9: "E",
897
+ \u00CA: "E",
898
+ \u00CB: "E",
899
+ \u00CC: "I",
900
+ \u00CD: "I",
901
+ \u00CE: "I",
902
+ \u00CF: "I",
903
+ \u00D0: "D",
904
+ \u00D1: "N",
905
+ \u00D2: "O",
906
+ \u00D3: "O",
907
+ \u00D4: "O",
908
+ \u00D5: "O",
909
+ \u00D6: "O",
910
+ \u0150: "O",
911
+ \u00D8: "O",
912
+ \u014C: "O",
913
+ \u00D9: "U",
914
+ \u00DA: "U",
915
+ \u00DB: "U",
916
+ \u00DC: "U",
917
+ \u0170: "U",
918
+ \u00DD: "Y",
919
+ \u00DE: "TH",
920
+ \u00DF: "ss",
921
+ \u00E0: "a",
922
+ \u00E1: "a",
923
+ \u00E2: "a",
924
+ \u00E3: "a",
925
+ \u00E4: "a",
926
+ \u00E5: "a",
927
+ \u00E6: "ae",
928
+ \u00E7: "c",
929
+ \u00E8: "e",
930
+ \u00E9: "e",
931
+ \u00EA: "e",
932
+ \u00EB: "e",
933
+ \u00EC: "i",
934
+ \u00ED: "i",
935
+ \u00EE: "i",
936
+ \u00EF: "i",
937
+ \u00F0: "d",
938
+ \u00F1: "n",
939
+ \u00F2: "o",
940
+ \u00F3: "o",
941
+ \u00F4: "o",
942
+ \u00F5: "o",
943
+ \u00F6: "o",
944
+ \u0151: "o",
945
+ \u00F8: "o",
946
+ \u014D: "o",
947
+ \u0152: "OE",
948
+ \u0153: "oe",
949
+ \u00F9: "u",
950
+ \u00FA: "u",
951
+ \u00FB: "u",
952
+ \u00FC: "u",
953
+ \u0171: "u",
954
+ \u00FD: "y",
955
+ \u00FE: "th",
956
+ \u00FF: "y",
957
+ "\u1E9E": "SS",
958
+ // greek
959
+ \u03B1: "a",
960
+ \u03B2: "b",
961
+ \u03B3: "g",
962
+ \u03B4: "d",
963
+ \u03B5: "e",
964
+ \u03B6: "z",
965
+ \u03B7: "h",
966
+ \u03B8: "th",
967
+ \u03B9: "i",
968
+ \u03BA: "k",
969
+ \u03BB: "l",
970
+ \u03BC: "m",
971
+ \u03BD: "n",
972
+ \u03BE: "3",
973
+ \u03BF: "o",
974
+ \u03C0: "p",
975
+ \u03C1: "r",
976
+ \u03C3: "s",
977
+ \u03C4: "t",
978
+ \u03C5: "y",
979
+ \u03C6: "f",
980
+ \u03C7: "x",
981
+ \u03C8: "ps",
982
+ \u03C9: "w",
983
+ \u03AC: "a",
984
+ \u03AD: "e",
985
+ \u03AF: "i",
986
+ \u03CC: "o",
987
+ \u03CD: "y",
988
+ \u03AE: "h",
989
+ \u03CE: "w",
990
+ \u03C2: "s",
991
+ \u03CA: "i",
992
+ \u03B0: "y",
993
+ \u03CB: "y",
994
+ \u0390: "i",
995
+ \u0391: "A",
996
+ \u0392: "B",
997
+ \u0393: "G",
998
+ \u0394: "D",
999
+ \u0395: "E",
1000
+ \u0396: "Z",
1001
+ \u0397: "H",
1002
+ \u0398: "Th",
1003
+ \u0399: "I",
1004
+ \u039A: "K",
1005
+ \u039B: "L",
1006
+ \u039C: "M",
1007
+ \u039D: "N",
1008
+ \u039E: "3",
1009
+ \u039F: "O",
1010
+ \u03A0: "P",
1011
+ \u03A1: "R",
1012
+ \u03A3: "S",
1013
+ \u03A4: "T",
1014
+ \u03A5: "Y",
1015
+ \u03A6: "F",
1016
+ \u03A7: "X",
1017
+ \u03A8: "PS",
1018
+ \u03A9: "W",
1019
+ \u0386: "A",
1020
+ \u0388: "E",
1021
+ \u038A: "I",
1022
+ \u038C: "O",
1023
+ \u038E: "Y",
1024
+ \u0389: "H",
1025
+ \u038F: "W",
1026
+ \u03AA: "I",
1027
+ \u03AB: "Y",
1028
+ // turkish
1029
+ \u015F: "s",
1030
+ \u015E: "S",
1031
+ \u0131: "i",
1032
+ \u0130: "I",
1033
+ \u011F: "g",
1034
+ \u011E: "G",
1035
+ // russian
1036
+ \u0430: "a",
1037
+ \u0431: "b",
1038
+ \u0432: "v",
1039
+ \u0433: "g",
1040
+ \u0434: "d",
1041
+ \u0435: "e",
1042
+ \u0451: "yo",
1043
+ \u0436: "zh",
1044
+ \u0437: "z",
1045
+ \u0438: "i",
1046
+ \u0439: "j",
1047
+ \u043A: "k",
1048
+ \u043B: "l",
1049
+ \u043C: "m",
1050
+ \u043D: "n",
1051
+ \u043E: "o",
1052
+ \u043F: "p",
1053
+ \u0440: "r",
1054
+ \u0441: "s",
1055
+ \u0442: "t",
1056
+ \u0443: "u",
1057
+ \u0444: "f",
1058
+ \u0445: "h",
1059
+ \u0446: "c",
1060
+ \u0447: "ch",
1061
+ \u0448: "sh",
1062
+ \u0449: "sh",
1063
+ \u044A: "u",
1064
+ \u044B: "y",
1065
+ \u044C: "",
1066
+ \u044D: "e",
1067
+ \u044E: "yu",
1068
+ \u044F: "ya",
1069
+ \u0410: "A",
1070
+ \u0411: "B",
1071
+ \u0412: "V",
1072
+ \u0413: "G",
1073
+ \u0414: "D",
1074
+ \u0415: "E",
1075
+ \u0401: "Yo",
1076
+ \u0416: "Zh",
1077
+ \u0417: "Z",
1078
+ \u0418: "I",
1079
+ \u0419: "J",
1080
+ \u041A: "K",
1081
+ \u041B: "L",
1082
+ \u041C: "M",
1083
+ \u041D: "N",
1084
+ \u041E: "O",
1085
+ \u041F: "P",
1086
+ \u0420: "R",
1087
+ \u0421: "S",
1088
+ \u0422: "T",
1089
+ \u0423: "U",
1090
+ \u0424: "F",
1091
+ \u0425: "H",
1092
+ \u0426: "C",
1093
+ \u0427: "Ch",
1094
+ \u0428: "Sh",
1095
+ \u0429: "Sh",
1096
+ \u042A: "U",
1097
+ \u042B: "Y",
1098
+ \u042C: "",
1099
+ \u042D: "E",
1100
+ \u042E: "Yu",
1101
+ \u042F: "Ya",
1102
+ // ukranian
1103
+ \u0404: "Ye",
1104
+ \u0406: "I",
1105
+ \u0407: "Yi",
1106
+ \u0490: "G",
1107
+ \u0454: "ye",
1108
+ \u0456: "i",
1109
+ \u0457: "yi",
1110
+ \u0491: "g",
1111
+ // czech
1112
+ \u010D: "c",
1113
+ \u010F: "d",
1114
+ \u011B: "e",
1115
+ \u0148: "n",
1116
+ \u0159: "r",
1117
+ \u0161: "s",
1118
+ \u0165: "t",
1119
+ \u016F: "u",
1120
+ \u017E: "z",
1121
+ \u010C: "C",
1122
+ \u010E: "D",
1123
+ \u011A: "E",
1124
+ \u0147: "N",
1125
+ \u0158: "R",
1126
+ \u0160: "S",
1127
+ \u0164: "T",
1128
+ \u016E: "U",
1129
+ \u017D: "Z",
1130
+ // slovak
1131
+ \u013E: "l",
1132
+ \u013A: "l",
1133
+ \u0155: "r",
1134
+ \u013D: "L",
1135
+ \u0139: "L",
1136
+ \u0154: "R",
1137
+ // polish
1138
+ \u0105: "a",
1139
+ \u0107: "c",
1140
+ \u0119: "e",
1141
+ \u0142: "l",
1142
+ \u0144: "n",
1143
+ \u015B: "s",
1144
+ \u017A: "z",
1145
+ \u017C: "z",
1146
+ \u0104: "A",
1147
+ \u0106: "C",
1148
+ \u0118: "E",
1149
+ \u0141: "L",
1150
+ \u0143: "N",
1151
+ \u015A: "S",
1152
+ \u0179: "Z",
1153
+ \u017B: "Z",
1154
+ // latvian
1155
+ \u0101: "a",
1156
+ \u0113: "e",
1157
+ \u0123: "g",
1158
+ \u012B: "i",
1159
+ \u0137: "k",
1160
+ \u013C: "l",
1161
+ \u0146: "n",
1162
+ \u016B: "u",
1163
+ \u0100: "A",
1164
+ \u0112: "E",
1165
+ \u0122: "G",
1166
+ \u012A: "I",
1167
+ \u0136: "K",
1168
+ \u013B: "L",
1169
+ \u0145: "N",
1170
+ \u016A: "U",
1171
+ // arabic
1172
+ \u0623: "a",
1173
+ \u0625: "i",
1174
+ \u0628: "b",
1175
+ \u062A: "t",
1176
+ \u062B: "th",
1177
+ \u062C: "g",
1178
+ \u062D: "h",
1179
+ \u062E: "kh",
1180
+ \u062F: "d",
1181
+ \u0630: "th",
1182
+ \u0631: "r",
1183
+ \u0632: "z",
1184
+ \u0633: "s",
1185
+ \u0634: "sh",
1186
+ \u0635: "s",
1187
+ \u0636: "d",
1188
+ \u0637: "t",
1189
+ \u0638: "th",
1190
+ \u0639: "aa",
1191
+ \u063A: "gh",
1192
+ \u0641: "f",
1193
+ \u0642: "k",
1194
+ \u0643: "k",
1195
+ \u0644: "l",
1196
+ \u0645: "m",
1197
+ \u0646: "n",
1198
+ \u0647: "h",
1199
+ \u0648: "o",
1200
+ \u064A: "y",
1201
+ \u0621: "aa",
1202
+ \u0629: "a",
1203
+ // farsi
1204
+ \u0622: "a",
1205
+ \u0627: "a",
1206
+ \u067E: "p",
1207
+ \u0698: "zh",
1208
+ \u06AF: "g",
1209
+ \u0686: "ch",
1210
+ \u06A9: "k",
1211
+ \u06CC: "i",
1212
+ // lithuanian
1213
+ \u0117: "e",
1214
+ \u012F: "i",
1215
+ \u0173: "u",
1216
+ \u0116: "E",
1217
+ \u012E: "I",
1218
+ \u0172: "U",
1219
+ // romanian
1220
+ \u021B: "t",
1221
+ \u021A: "T",
1222
+ \u0163: "t",
1223
+ \u0162: "T",
1224
+ \u0219: "s",
1225
+ \u0218: "S",
1226
+ \u0103: "a",
1227
+ \u0102: "A",
1228
+ // vietnamese
1229
+ \u1EA0: "A",
1230
+ \u1EA2: "A",
1231
+ \u1EA6: "A",
1232
+ \u1EA4: "A",
1233
+ \u1EAC: "A",
1234
+ \u1EA8: "A",
1235
+ \u1EAA: "A",
1236
+ \u1EB0: "A",
1237
+ \u1EAE: "A",
1238
+ \u1EB6: "A",
1239
+ \u1EB2: "A",
1240
+ \u1EB4: "A",
1241
+ \u1EB8: "E",
1242
+ \u1EBA: "E",
1243
+ \u1EBC: "E",
1244
+ \u1EC0: "E",
1245
+ \u1EBE: "E",
1246
+ \u1EC6: "E",
1247
+ \u1EC2: "E",
1248
+ \u1EC4: "E",
1249
+ \u1ECA: "I",
1250
+ \u1EC8: "I",
1251
+ \u0128: "I",
1252
+ \u1ECC: "O",
1253
+ \u1ECE: "O",
1254
+ \u1ED2: "O",
1255
+ \u1ED0: "O",
1256
+ \u1ED8: "O",
1257
+ \u1ED4: "O",
1258
+ \u1ED6: "O",
1259
+ \u01A0: "O",
1260
+ \u1EDC: "O",
1261
+ \u1EDA: "O",
1262
+ \u1EE2: "O",
1263
+ \u1EDE: "O",
1264
+ \u1EE0: "O",
1265
+ \u1EE4: "U",
1266
+ \u1EE6: "U",
1267
+ \u0168: "U",
1268
+ \u01AF: "U",
1269
+ \u1EEA: "U",
1270
+ \u1EE8: "U",
1271
+ \u1EF0: "U",
1272
+ \u1EEC: "U",
1273
+ \u1EEE: "U",
1274
+ \u1EF2: "Y",
1275
+ \u1EF4: "Y",
1276
+ \u1EF6: "Y",
1277
+ \u1EF8: "Y",
1278
+ \u0110: "D",
1279
+ \u1EA1: "a",
1280
+ \u1EA3: "a",
1281
+ \u1EA7: "a",
1282
+ \u1EA5: "a",
1283
+ \u1EAD: "a",
1284
+ \u1EA9: "a",
1285
+ \u1EAB: "a",
1286
+ \u1EB1: "a",
1287
+ \u1EAF: "a",
1288
+ \u1EB7: "a",
1289
+ \u1EB3: "a",
1290
+ \u1EB5: "a",
1291
+ \u1EB9: "e",
1292
+ \u1EBB: "e",
1293
+ \u1EBD: "e",
1294
+ \u1EC1: "e",
1295
+ \u1EBF: "e",
1296
+ \u1EC7: "e",
1297
+ \u1EC3: "e",
1298
+ \u1EC5: "e",
1299
+ \u1ECB: "i",
1300
+ \u1EC9: "i",
1301
+ \u0129: "i",
1302
+ \u1ECD: "o",
1303
+ \u1ECF: "o",
1304
+ \u1ED3: "o",
1305
+ \u1ED1: "o",
1306
+ \u1ED9: "o",
1307
+ \u1ED5: "o",
1308
+ \u1ED7: "o",
1309
+ \u01A1: "o",
1310
+ \u1EDD: "o",
1311
+ \u1EDB: "o",
1312
+ \u1EE3: "o",
1313
+ \u1EDF: "o",
1314
+ \u1EE1: "o",
1315
+ \u1EE5: "u",
1316
+ \u1EE7: "u",
1317
+ \u0169: "u",
1318
+ \u01B0: "u",
1319
+ \u1EEB: "u",
1320
+ \u1EE9: "u",
1321
+ \u1EF1: "u",
1322
+ \u1EED: "u",
1323
+ \u1EEF: "u",
1324
+ \u1EF3: "y",
1325
+ \u1EF5: "y",
1326
+ \u1EF7: "y",
1327
+ \u1EF9: "y",
1328
+ \u0111: "d",
1329
+ // kazakh
1330
+ \u04D8: "AE",
1331
+ \u04D9: "ae",
1332
+ \u0492: "GH",
1333
+ \u0493: "gh",
1334
+ \u049A: "KH",
1335
+ \u049B: "kh",
1336
+ \u04A2: "NG",
1337
+ \u04A3: "ng",
1338
+ \u04AE: "UE",
1339
+ \u04AF: "ue",
1340
+ \u04B0: "U",
1341
+ \u04B1: "u",
1342
+ \u04BA: "H",
1343
+ \u04BB: "h",
1344
+ \u04E8: "OE",
1345
+ \u04E9: "oe",
1346
+ // serbian
1347
+ \u0452: "dj",
1348
+ \u0458: "j",
1349
+ \u0459: "lj",
1350
+ \u045A: "nj",
1351
+ \u045B: "c",
1352
+ \u045F: "dz",
1353
+ \u0402: "Dj",
1354
+ \u0408: "j",
1355
+ \u0409: "Lj",
1356
+ \u040A: "Nj",
1357
+ \u040B: "C",
1358
+ \u040F: "Dz",
1359
+ \u01CC: "nj",
1360
+ \u01C9: "lj",
1361
+ \u01CB: "NJ",
1362
+ \u01C8: "LJ",
1363
+ // hindi
1364
+ \u0905: "a",
1365
+ \u0906: "aa",
1366
+ \u090F: "e",
1367
+ \u0908: "ii",
1368
+ \u090D: "ei",
1369
+ \u090E: "ae",
1370
+ \u0910: "ai",
1371
+ \u0907: "i",
1372
+ \u0913: "o",
1373
+ \u0911: "oi",
1374
+ \u0912: "oii",
1375
+ \u090A: "uu",
1376
+ \u0914: "ou",
1377
+ \u0909: "u",
1378
+ \u092C: "B",
1379
+ \u092D: "Bha",
1380
+ \u091A: "Ca",
1381
+ \u091B: "Chha",
1382
+ \u0921: "Da",
1383
+ \u0922: "Dha",
1384
+ \u092B: "Fa",
1385
+ \u0917: "Ga",
1386
+ \u0918: "Gha",
1387
+ \u0917\u093C: "Ghi",
1388
+ \u0939: "Ha",
1389
+ \u091C: "Ja",
1390
+ \u091D: "Jha",
1391
+ \u0915: "Ka",
1392
+ \u0916: "Kha",
1393
+ \u0916\u093C: "Khi",
1394
+ \u0932: "L",
1395
+ \u0933: "Li",
1396
+ \u090C: "Li",
1397
+ \u0934: "Lii",
1398
+ \u0961: "Lii",
1399
+ \u092E: "Ma",
1400
+ \u0928: "Na",
1401
+ \u0919: "Na",
1402
+ \u091E: "Nia",
1403
+ \u0923: "Nae",
1404
+ \u0929: "Ni",
1405
+ \u0950: "oms",
1406
+ \u092A: "Pa",
1407
+ \u0915\u093C: "Qi",
1408
+ \u0930: "Ra",
1409
+ \u090B: "Ri",
1410
+ \u0960: "Ri",
1411
+ \u0931: "Ri",
1412
+ \u0938: "Sa",
1413
+ \u0936: "Sha",
1414
+ \u0937: "Shha",
1415
+ \u091F: "Ta",
1416
+ \u0924: "Ta",
1417
+ \u0920: "Tha",
1418
+ \u0926: "Tha",
1419
+ \u0925: "Tha",
1420
+ \u0927: "Thha",
1421
+ \u0921\u093C: "ugDha",
1422
+ \u0922\u093C: "ugDhha",
1423
+ \u0935: "Va",
1424
+ \u092F: "Ya",
1425
+ \u092F\u093C: "Yi",
1426
+ \u091C\u093C: "Za",
1427
+ // azerbaijani
1428
+ \u0259: "e",
1429
+ \u018F: "E",
1430
+ // georgian
1431
+ \u10D0: "a",
1432
+ \u10D1: "b",
1433
+ \u10D2: "g",
1434
+ \u10D3: "d",
1435
+ \u10D4: "e",
1436
+ \u10D5: "v",
1437
+ \u10D6: "z",
1438
+ \u10D7: "t",
1439
+ \u10D8: "i",
1440
+ \u10D9: "k",
1441
+ \u10DA: "l",
1442
+ \u10DB: "m",
1443
+ \u10DC: "n",
1444
+ \u10DD: "o",
1445
+ \u10DE: "p",
1446
+ \u10DF: "zh",
1447
+ \u10E0: "r",
1448
+ \u10E1: "s",
1449
+ \u10E2: "t",
1450
+ \u10E3: "u",
1451
+ \u10E4: "p",
1452
+ \u10E5: "k",
1453
+ \u10E6: "gh",
1454
+ \u10E7: "q",
1455
+ \u10E8: "sh",
1456
+ \u10E9: "ch",
1457
+ \u10EA: "ts",
1458
+ \u10EB: "dz",
1459
+ \u10EC: "ts",
1460
+ \u10ED: "ch",
1461
+ \u10EE: "kh",
1462
+ \u10EF: "j",
1463
+ \u10F0: "h",
1464
+ // hebrew
1465
+ \u05D1: "v",
1466
+ \u05D2\u05BC: "g",
1467
+ \u05D2: "g",
1468
+ \u05D3: "d",
1469
+ \u05D3\u05BC: "d",
1470
+ \u05D4: "h",
1471
+ \u05D5: "v",
1472
+ \u05D6: "z",
1473
+ \u05D7: "h",
1474
+ \u05D8: "t",
1475
+ \u05D9: "y",
1476
+ \u05DB: "kh",
1477
+ \u05DA: "kh",
1478
+ \u05DC: "l",
1479
+ \u05DE: "m",
1480
+ \u05DD: "m",
1481
+ \u05E0: "n",
1482
+ \u05DF: "n",
1483
+ \u05E1: "s",
1484
+ \u05E4: "f",
1485
+ \u05E3: "f",
1486
+ \u05E5: "ts",
1487
+ \u05E6: "ts",
1488
+ \u05E7: "k",
1489
+ \u05E8: "r",
1490
+ \u05EA\u05BC: "t",
1491
+ \u05EA: "t"
1492
+ };
1493
+ var defaults = {
1494
+ locale: "",
1495
+ mode: "pretty",
1496
+ fallback: true,
1497
+ modes: {
1498
+ rfc3986: {
1499
+ replacement: "-",
1500
+ lower: true,
1501
+ charmap: initialCharmap,
1502
+ multicharmap: initialMulticharmap,
1503
+ remove: null,
1504
+ trim: true
1505
+ },
1506
+ pretty: {
1507
+ replacement: "-",
1508
+ lower: true,
1509
+ charmap: initialCharmap,
1510
+ multicharmap: initialMulticharmap,
1511
+ remove: null,
1512
+ trim: true
1513
+ }
1514
+ }
1515
+ };
1516
+
1517
+ // src/utils/validations.ts
1518
+ var isAngle = (value, span = 180) => {
1519
+ return typeof value === "number" && value >= span * -1 && value <= span;
1520
+ };
1521
+ var isEmail = (value) => {
1522
+ if (typeof value !== "string" || value.length === 0) {
1523
+ return false;
1524
+ }
1525
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
1526
+ return emailRegex.test(value);
1527
+ };
1528
+ var isLngLat = (value) => {
1529
+ if (!Array.isArray(value) || value.length !== 2) {
1530
+ return false;
1531
+ }
1532
+ const [longitude, latitude] = value;
1533
+ if (!isAngle(longitude, 180) || !isAngle(latitude, 90)) {
1534
+ return false;
1535
+ }
1536
+ return true;
1537
+ };
1538
+ var isMapBounds = (value) => {
1539
+ return Array.isArray(value) && value.length === 2 && value.every(isLngLat);
1540
+ };
1541
+ var isPassword = (value) => {
1542
+ return typeof value === "string" && value.length >= 8 && /[a-z]/.test(value) && /[A-Z]/.test(value) && /[0-9]/.test(value);
1543
+ };
1544
+ var isPeriod = (value) => {
1545
+ return value === "monthly" /* Monthly */ || value === "annually" /* Annually */;
1546
+ };
1547
+ var isSlug = (value) => {
1548
+ return typeof value === "string" && value === slug(value);
1549
+ };
1550
+ function isType(types, value) {
1551
+ return types.includes(typeof value);
1552
+ }
1553
+ var isURL = (value) => {
1554
+ if (typeof value !== "string" || !value.length) {
1555
+ return false;
1556
+ }
1557
+ const urlRegex = /^(https?:\/\/)([\da-z\-]+\.)+[a-z]{2,6}(:[0-9]{1,5})?([\/\w \.-]*)*\/?(\?[a-zA-Z0-9=&]*)?$/;
1558
+ return urlRegex.test(value);
1559
+ };
1560
+ var isNumber = (value) => {
1561
+ return typeof value === "number" && !isNaN(value);
1562
+ };
1563
+ var isAmountOfMoney = (value) => {
1564
+ if (!isNumber(value) || value < 0) {
1565
+ return false;
1566
+ }
1567
+ const decimalPart = value.toString().split(".")[1];
1568
+ if (decimalPart && decimalPart.length > 2) {
1569
+ return false;
1570
+ }
1571
+ return true;
1572
+ };
1573
+ var isPhoneNumber = (value) => {
1574
+ if (typeof value !== "string" || !value.length) {
1575
+ return false;
1576
+ }
1577
+ if (value.length > 15 || value.length < 5) {
1578
+ return false;
1579
+ }
1580
+ const phoneRegex = /^(\+?[0-9])\d*$/;
1581
+ return phoneRegex.test(value);
1582
+ };
1583
+ var isValidPayFee = (value, amount, period) => {
1584
+ if (typeof value !== "boolean" || typeof amount !== "number" || !isPeriod(period)) {
1585
+ return false;
1586
+ }
1587
+ if (value && period === "annually" /* Annually */) {
1588
+ return false;
1589
+ }
1590
+ if (!value && period === "monthly" /* Monthly */ && amount === 1) {
1591
+ return false;
1592
+ }
1593
+ return true;
1594
+ };
1595
+ var isNumberInRange = (value, min, max) => {
1596
+ if (!isNumber(value)) {
1597
+ return false;
1598
+ }
1599
+ if (typeof min === "number") {
1600
+ if (value < min) {
1601
+ return false;
1602
+ }
1603
+ }
1604
+ if (typeof max === "number") {
1605
+ if (value > max) {
1606
+ return false;
1607
+ }
1608
+ }
1609
+ return true;
1610
+ };
1611
+ var isTextInRange = (value, minLength = 0, maxLength) => {
1612
+ if (typeof value !== "string") {
1613
+ return false;
1614
+ }
1615
+ if (typeof minLength === "number" && value.length < minLength) {
1616
+ return false;
1617
+ }
1618
+ if (typeof maxLength === "number" && value.length > maxLength) {
1619
+ return false;
1620
+ }
1621
+ return true;
1622
+ };
1623
+ var isTextInWordRange = (value, minWordLength = 0, maxWordLength) => {
1624
+ if (typeof value !== "string") {
1625
+ return false;
1626
+ }
1627
+ const words = value.length > 0 ? value.split(" ") : [];
1628
+ if (typeof minWordLength === "number" && words.length < minWordLength) {
1629
+ return false;
1630
+ }
1631
+ if (typeof maxWordLength === "number" && words.length > maxWordLength) {
1632
+ return false;
1633
+ }
1634
+ return true;
1635
+ };
1636
+
1637
+ // src/utils/conversions.ts
1638
+ var toPhoneNumber = (value) => {
1639
+ if (typeof value !== "string" || !value.length) {
1640
+ return false;
1641
+ }
1642
+ const result = value.replace(/(?!^\+)\D/g, "");
1643
+ if (!isPhoneNumber(result)) {
1644
+ return false;
1645
+ }
1646
+ return result;
1647
+ };
1648
+ var toBytes = (value) => {
1649
+ if (typeof value !== "string" || !value.length) {
1650
+ return null;
1651
+ }
1652
+ const lowerCase = value.toLowerCase();
1653
+ const units = ["b", "kb", "mb", "gb", "tb", "pb", "eb", "zb", "yb"];
1654
+ const [, num, unit] = lowerCase.match(/(\d+)(\w+)/);
1655
+ const unitIndex = units.indexOf(unit.toLowerCase());
1656
+ if (unitIndex === -1) {
1657
+ return null;
1658
+ }
1659
+ return Number(num) * Math.pow(1024, unitIndex);
1660
+ };
1661
+
1662
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/toDate.mjs
1663
+ function toDate(argument) {
1664
+ const argStr = Object.prototype.toString.call(argument);
1665
+ if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
1666
+ return new argument.constructor(+argument);
1667
+ } else if (typeof argument === "number" || argStr === "[object Number]" || typeof argument === "string" || argStr === "[object String]") {
1668
+ return new Date(argument);
1669
+ } else {
1670
+ return /* @__PURE__ */ new Date(NaN);
1671
+ }
1672
+ }
1673
+
1674
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/constructFrom.mjs
1675
+ function constructFrom(date, value) {
1676
+ if (date instanceof Date) {
1677
+ return new date.constructor(value);
1678
+ } else {
1679
+ return new Date(value);
1680
+ }
1681
+ }
1682
+
1683
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/addDays.mjs
1684
+ function addDays(date, amount) {
1685
+ const _date = toDate(date);
1686
+ if (isNaN(amount))
1687
+ return constructFrom(date, NaN);
1688
+ if (!amount) {
1689
+ return _date;
1690
+ }
1691
+ _date.setDate(_date.getDate() + amount);
1692
+ return _date;
1693
+ }
1694
+
1695
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/addMonths.mjs
1696
+ function addMonths(date, amount) {
1697
+ const _date = toDate(date);
1698
+ if (isNaN(amount))
1699
+ return constructFrom(date, NaN);
1700
+ if (!amount) {
1701
+ return _date;
1702
+ }
1703
+ const dayOfMonth = _date.getDate();
1704
+ const endOfDesiredMonth = constructFrom(date, _date.getTime());
1705
+ endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
1706
+ const daysInMonth = endOfDesiredMonth.getDate();
1707
+ if (dayOfMonth >= daysInMonth) {
1708
+ return endOfDesiredMonth;
1709
+ } else {
1710
+ _date.setFullYear(
1711
+ endOfDesiredMonth.getFullYear(),
1712
+ endOfDesiredMonth.getMonth(),
1713
+ dayOfMonth
1714
+ );
1715
+ return _date;
1716
+ }
1717
+ }
1718
+
1719
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/add.mjs
1720
+ function add(date, duration) {
1721
+ const {
1722
+ years = 0,
1723
+ months = 0,
1724
+ weeks = 0,
1725
+ days = 0,
1726
+ hours = 0,
1727
+ minutes = 0,
1728
+ seconds = 0
1729
+ } = duration;
1730
+ const _date = toDate(date);
1731
+ const dateWithMonths = months || years ? addMonths(_date, months + years * 12) : _date;
1732
+ const dateWithDays = days || weeks ? addDays(dateWithMonths, days + weeks * 7) : dateWithMonths;
1733
+ const minutesToAdd = minutes + hours * 60;
1734
+ const secondsToAdd = seconds + minutesToAdd * 60;
1735
+ const msToAdd = secondsToAdd * 1e3;
1736
+ const finalDate = constructFrom(date, dateWithDays.getTime() + msToAdd);
1737
+ return finalDate;
1738
+ }
1739
+
1740
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/constants.mjs
1741
+ var daysInYear = 365.2425;
1742
+ var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3;
1743
+ var minTime = -maxTime;
1744
+ var millisecondsInMinute = 6e4;
1745
+ var millisecondsInHour = 36e5;
1746
+ var secondsInHour = 3600;
1747
+ var secondsInDay = secondsInHour * 24;
1748
+ var secondsInWeek = secondsInDay * 7;
1749
+ var secondsInYear = secondsInDay * daysInYear;
1750
+ var secondsInMonth = secondsInYear / 12;
1751
+ var secondsInQuarter = secondsInMonth * 3;
1752
+
1753
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfDay.mjs
1754
+ function startOfDay(date) {
1755
+ const _date = toDate(date);
1756
+ _date.setHours(0, 0, 0, 0);
1757
+ return _date;
1758
+ }
1759
+
1760
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/isDate.mjs
1761
+ function isDate(value) {
1762
+ return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]";
1763
+ }
1764
+
1765
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/isValid.mjs
1766
+ function isValid(date) {
1767
+ if (!isDate(date) && typeof date !== "number") {
1768
+ return false;
1769
+ }
1770
+ const _date = toDate(date);
1771
+ return !isNaN(Number(_date));
1772
+ }
1773
+
1774
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfMinute.mjs
1775
+ function startOfMinute(date) {
1776
+ const _date = toDate(date);
1777
+ _date.setSeconds(0, 0);
1778
+ return _date;
1779
+ }
1780
+
1781
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfMonth.mjs
1782
+ function startOfMonth(date) {
1783
+ const _date = toDate(date);
1784
+ _date.setDate(1);
1785
+ _date.setHours(0, 0, 0, 0);
1786
+ return _date;
1787
+ }
1788
+
1789
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfYear.mjs
1790
+ function startOfYear(date) {
1791
+ const cleanDate = toDate(date);
1792
+ const _date = constructFrom(date, 0);
1793
+ _date.setFullYear(cleanDate.getFullYear(), 0, 1);
1794
+ _date.setHours(0, 0, 0, 0);
1795
+ return _date;
1796
+ }
1797
+
1798
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfHour.mjs
1799
+ function startOfHour(date) {
1800
+ const _date = toDate(date);
1801
+ _date.setMinutes(0, 0, 0);
1802
+ return _date;
1803
+ }
1804
+
1805
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/startOfSecond.mjs
1806
+ function startOfSecond(date) {
1807
+ const _date = toDate(date);
1808
+ _date.setMilliseconds(0);
1809
+ return _date;
1810
+ }
1811
+
1812
+ // ../../../.cache/deno/deno_esbuild/date-fns@3.6.0/node_modules/date-fns/parseISO.mjs
1813
+ function parseISO(argument, options) {
1814
+ const additionalDigits = options?.additionalDigits ?? 2;
1815
+ const dateStrings = splitDateString(argument);
1816
+ let date;
1817
+ if (dateStrings.date) {
1818
+ const parseYearResult = parseYear(dateStrings.date, additionalDigits);
1819
+ date = parseDate(parseYearResult.restDateString, parseYearResult.year);
1820
+ }
1821
+ if (!date || isNaN(date.getTime())) {
1822
+ return /* @__PURE__ */ new Date(NaN);
1823
+ }
1824
+ const timestamp = date.getTime();
1825
+ let time = 0;
1826
+ let offset;
1827
+ if (dateStrings.time) {
1828
+ time = parseTime(dateStrings.time);
1829
+ if (isNaN(time)) {
1830
+ return /* @__PURE__ */ new Date(NaN);
1831
+ }
1832
+ }
1833
+ if (dateStrings.timezone) {
1834
+ offset = parseTimezone(dateStrings.timezone);
1835
+ if (isNaN(offset)) {
1836
+ return /* @__PURE__ */ new Date(NaN);
1837
+ }
1838
+ } else {
1839
+ const dirtyDate = new Date(timestamp + time);
1840
+ const result = /* @__PURE__ */ new Date(0);
1841
+ result.setFullYear(
1842
+ dirtyDate.getUTCFullYear(),
1843
+ dirtyDate.getUTCMonth(),
1844
+ dirtyDate.getUTCDate()
1845
+ );
1846
+ result.setHours(
1847
+ dirtyDate.getUTCHours(),
1848
+ dirtyDate.getUTCMinutes(),
1849
+ dirtyDate.getUTCSeconds(),
1850
+ dirtyDate.getUTCMilliseconds()
1851
+ );
1852
+ return result;
1853
+ }
1854
+ return new Date(timestamp + time + offset);
1855
+ }
1856
+ var patterns = {
1857
+ dateTimeDelimiter: /[T ]/,
1858
+ timeZoneDelimiter: /[Z ]/i,
1859
+ timezone: /([Z+-].*)$/
1860
+ };
1861
+ var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
1862
+ var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
1863
+ var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
1864
+ function splitDateString(dateString) {
1865
+ const dateStrings = {};
1866
+ const array = dateString.split(patterns.dateTimeDelimiter);
1867
+ let timeString;
1868
+ if (array.length > 2) {
1869
+ return dateStrings;
1870
+ }
1871
+ if (/:/.test(array[0])) {
1872
+ timeString = array[0];
1873
+ } else {
1874
+ dateStrings.date = array[0];
1875
+ timeString = array[1];
1876
+ if (patterns.timeZoneDelimiter.test(dateStrings.date)) {
1877
+ dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];
1878
+ timeString = dateString.substr(
1879
+ dateStrings.date.length,
1880
+ dateString.length
1881
+ );
1882
+ }
1883
+ }
1884
+ if (timeString) {
1885
+ const token = patterns.timezone.exec(timeString);
1886
+ if (token) {
1887
+ dateStrings.time = timeString.replace(token[1], "");
1888
+ dateStrings.timezone = token[1];
1889
+ } else {
1890
+ dateStrings.time = timeString;
1891
+ }
1892
+ }
1893
+ return dateStrings;
1894
+ }
1895
+ function parseYear(dateString, additionalDigits) {
1896
+ const regex = new RegExp(
1897
+ "^(?:(\\d{4}|[+-]\\d{" + (4 + additionalDigits) + "})|(\\d{2}|[+-]\\d{" + (2 + additionalDigits) + "})$)"
1898
+ );
1899
+ const captures = dateString.match(regex);
1900
+ if (!captures)
1901
+ return { year: NaN, restDateString: "" };
1902
+ const year = captures[1] ? parseInt(captures[1]) : null;
1903
+ const century = captures[2] ? parseInt(captures[2]) : null;
1904
+ return {
1905
+ year: century === null ? year : century * 100,
1906
+ restDateString: dateString.slice((captures[1] || captures[2]).length)
1907
+ };
1908
+ }
1909
+ function parseDate(dateString, year) {
1910
+ if (year === null)
1911
+ return /* @__PURE__ */ new Date(NaN);
1912
+ const captures = dateString.match(dateRegex);
1913
+ if (!captures)
1914
+ return /* @__PURE__ */ new Date(NaN);
1915
+ const isWeekDate = !!captures[4];
1916
+ const dayOfYear = parseDateUnit(captures[1]);
1917
+ const month = parseDateUnit(captures[2]) - 1;
1918
+ const day = parseDateUnit(captures[3]);
1919
+ const week = parseDateUnit(captures[4]);
1920
+ const dayOfWeek = parseDateUnit(captures[5]) - 1;
1921
+ if (isWeekDate) {
1922
+ if (!validateWeekDate(year, week, dayOfWeek)) {
1923
+ return /* @__PURE__ */ new Date(NaN);
1924
+ }
1925
+ return dayOfISOWeekYear(year, week, dayOfWeek);
1926
+ } else {
1927
+ const date = /* @__PURE__ */ new Date(0);
1928
+ if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {
1929
+ return /* @__PURE__ */ new Date(NaN);
1930
+ }
1931
+ date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
1932
+ return date;
1933
+ }
1934
+ }
1935
+ function parseDateUnit(value) {
1936
+ return value ? parseInt(value) : 1;
1937
+ }
1938
+ function parseTime(timeString) {
1939
+ const captures = timeString.match(timeRegex);
1940
+ if (!captures)
1941
+ return NaN;
1942
+ const hours = parseTimeUnit(captures[1]);
1943
+ const minutes = parseTimeUnit(captures[2]);
1944
+ const seconds = parseTimeUnit(captures[3]);
1945
+ if (!validateTime(hours, minutes, seconds)) {
1946
+ return NaN;
1947
+ }
1948
+ return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1e3;
1949
+ }
1950
+ function parseTimeUnit(value) {
1951
+ return value && parseFloat(value.replace(",", ".")) || 0;
1952
+ }
1953
+ function parseTimezone(timezoneString) {
1954
+ if (timezoneString === "Z")
1955
+ return 0;
1956
+ const captures = timezoneString.match(timezoneRegex);
1957
+ if (!captures)
1958
+ return 0;
1959
+ const sign = captures[1] === "+" ? -1 : 1;
1960
+ const hours = parseInt(captures[2]);
1961
+ const minutes = captures[3] && parseInt(captures[3]) || 0;
1962
+ if (!validateTimezone(hours, minutes)) {
1963
+ return NaN;
1964
+ }
1965
+ return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);
1966
+ }
1967
+ function dayOfISOWeekYear(isoWeekYear, week, day) {
1968
+ const date = /* @__PURE__ */ new Date(0);
1969
+ date.setUTCFullYear(isoWeekYear, 0, 4);
1970
+ const fourthOfJanuaryDay = date.getUTCDay() || 7;
1971
+ const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
1972
+ date.setUTCDate(date.getUTCDate() + diff);
1973
+ return date;
1974
+ }
1975
+ var daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
1976
+ function isLeapYearIndex(year) {
1977
+ return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
1978
+ }
1979
+ function validateDate(year, month, date) {
1980
+ return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
1981
+ }
1982
+ function validateDayOfYearDate(year, dayOfYear) {
1983
+ return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
1984
+ }
1985
+ function validateWeekDate(_year, week, day) {
1986
+ return week >= 1 && week <= 53 && day >= 0 && day <= 6;
1987
+ }
1988
+ function validateTime(hours, minutes, seconds) {
1989
+ if (hours === 24) {
1990
+ return minutes === 0 && seconds === 0;
1991
+ }
1992
+ return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
1993
+ }
1994
+ function validateTimezone(_hours, minutes) {
1995
+ return minutes >= 0 && minutes <= 59;
1996
+ }
1997
+
1998
+ // src/utils/date.ts
1999
+ var dateUnits = ["s", "m", "h", "d", "M", "y"];
2000
+ var dateUnitMap = {
2001
+ y: "years",
2002
+ M: "months",
2003
+ d: "days",
2004
+ h: "hours",
2005
+ m: "minutes",
2006
+ s: "seconds"
2007
+ };
2008
+ var startOf = {
2009
+ y: startOfYear,
2010
+ M: startOfMonth,
2011
+ d: startOfDay,
2012
+ h: startOfHour,
2013
+ m: startOfMinute,
2014
+ s: startOfSecond
2015
+ };
2016
+ var relativeDate = /^\$now(?<units>\(((y|M|d|h|m|s):(-?\d+),?)+\))?$/;
2017
+ var relativeUnit = /(y|M|d|h|m|s):(-?\d+)/g;
2018
+ var absoluteDate = /^(?<y>\d{4,})(-(?<M>\d\d)(-(?<d>\d\d)([T ](?<h>\d\d)(:(?<m>\d\d)(:(?<s>\d\d))?)?)?)?)?/;
2019
+ function parseDate2(value, now = /* @__PURE__ */ new Date()) {
2020
+ let date;
2021
+ let units;
2022
+ const relativeMatch = relativeDate.exec(value);
2023
+ if (relativeMatch) {
2024
+ date = now;
2025
+ const unitsGroup = relativeMatch.groups?.units;
2026
+ if (unitsGroup) {
2027
+ const unitMatches = unitsGroup.matchAll(
2028
+ relativeUnit
2029
+ );
2030
+ units = [];
2031
+ for (const [_, unit, delta] of unitMatches) {
2032
+ date = add(date, { [dateUnitMap[unit]]: Number(delta) });
2033
+ units.push(unit);
2034
+ }
2035
+ } else {
2036
+ units = ["d"];
2037
+ }
2038
+ } else {
2039
+ date = parseISO(value);
2040
+ units = Object.entries(absoluteDate.exec(value)?.groups || {}).filter(([_, n]) => !!n).map(([unit]) => unit);
2041
+ }
2042
+ const minUnit = getMinDateUnit(units) || "s";
2043
+ return [startOf[minUnit](date), minUnit];
2044
+ }
2045
+ function getMinDateUnit(units) {
2046
+ return dateUnits.find((unit) => units.includes(unit));
2047
+ }
2048
+ function isValidDate(s) {
2049
+ if (typeof s === "string") {
2050
+ return relativeDate.test(s) || isValid(parseISO(s));
2051
+ }
2052
+ return isValid(s);
2053
+ }
2054
+ function isDateBetween(date, start, end) {
2055
+ let valid = isValidDate(date);
2056
+ if (start) {
2057
+ start = typeof start === "string" ? parseISO(start) : start;
2058
+ valid = valid && date >= start;
2059
+ }
2060
+ if (end) {
2061
+ end = typeof end === "string" ? parseISO(end) : end;
2062
+ valid = valid && date <= end;
2063
+ }
2064
+ return valid;
2065
+ }
2066
+
2067
+ // src/utils/payments.ts
2068
+ var stripeFees = {
2069
+ gb: {
2070
+ ["s_card" /* StripeCard */]: (amount) => 0.2 + 0.015 * amount,
2071
+ ["s_sepa" /* StripeSEPA */]: () => 0.3,
2072
+ ["s_bacs" /* StripeBACS */]: (amount) => Math.min(2, Math.max(0.2, 0.01 * amount)),
2073
+ ["s_paypal" /* StripePayPal */]: (amount) => 0.1 + 0.02 * amount
2074
+ },
2075
+ eu: {
2076
+ ["s_card" /* StripeCard */]: (amount) => 0.25 + 0.015 * amount,
2077
+ ["s_sepa" /* StripeSEPA */]: () => 0.35,
2078
+ ["s_bacs" /* StripeBACS */]: () => 0,
2079
+ // Not available
2080
+ ["s_paypal" /* StripePayPal */]: (amount) => 0.1 + 0.02 * amount
2081
+ },
2082
+ ca: {
2083
+ ["s_card" /* StripeCard */]: (amount) => 0.3 + 0.029 * amount,
2084
+ ["s_sepa" /* StripeSEPA */]: () => 0,
2085
+ // Not available
2086
+ ["s_bacs" /* StripeBACS */]: () => 0,
2087
+ // Not available
2088
+ ["s_paypal" /* StripePayPal */]: () => 0
2089
+ // Not available
2090
+ }
2091
+ };
2092
+ var gcFee = (amount) => 0.2 + amount * 0.01;
2093
+ function calcPaymentFee(feeable, country) {
2094
+ const feeFn = feeable.paymentMethod === "gc_direct-debit" /* GoCardlessDirectDebit */ ? gcFee : stripeFees[country][feeable.paymentMethod];
2095
+ return feeable.period === "annually" /* Annually */ ? 0 : feeFn(feeable.amount);
2096
+ }
2097
+
2098
+ // src/utils/rules.ts
2099
+ function isRuleGroup(ruleOrGroup) {
2100
+ return "condition" in ruleOrGroup;
2101
+ }
2102
+ function validateRule(filters, rule) {
2103
+ const filter = filters[rule.field];
2104
+ if (!filter) {
2105
+ throw new InvalidRule(rule, `Invalid field: ${rule.field}`);
2106
+ }
2107
+ let expectedArgs = 0;
2108
+ if (rule.operator in nullableOperators) {
2109
+ if (!filter.nullable && filter.type !== "text") {
2110
+ throw new InvalidRule(
2111
+ rule,
2112
+ `Invalid nullable operator: field is not nullable`
2113
+ );
2114
+ }
2115
+ } else {
2116
+ const operator = operatorsByTypeMap[filter.type][rule.operator];
2117
+ if (!operator) {
2118
+ throw new InvalidRule(
2119
+ rule,
2120
+ `Invalid operator for type: ${filter.type} type doesn't define ${rule.operator}`
2121
+ );
2122
+ }
2123
+ expectedArgs = operator.args;
2124
+ }
2125
+ if (expectedArgs !== rule.value.length) {
2126
+ throw new InvalidRule(
2127
+ rule,
2128
+ `Invalid operator argument count: ${rule.operator} needs ${expectedArgs}, ${rule.value.length} given`
2129
+ );
2130
+ }
2131
+ const expectedType = filter.type === "boolean" || filter.type === "number" ? filter.type : "string";
2132
+ if (rule.value.some((v) => typeof v !== expectedType)) {
2133
+ throw new InvalidRule(
2134
+ rule,
2135
+ `Invalid operator argument type: ${rule.operator} needs ${expectedType}, ${rule.value.map(
2136
+ (v) => typeof v
2137
+ )} given`
2138
+ );
2139
+ }
2140
+ if (filter.type === "date" && rule.value.some((v) => !isValidDate(v))) {
2141
+ throw new InvalidRule(
2142
+ rule,
2143
+ `Invalid operator argument: date type needs valid absolute or relative date, ${rule.value} given`
2144
+ );
2145
+ }
2146
+ if ((filter.type === "enum" || filter.type === "array") && rule.value.some((v) => filter.options?.indexOf(v) === -1)) {
2147
+ throw new InvalidRule(
2148
+ rule,
2149
+ `Invalid operator argument: ${filter.type} type expected ${filter.options}, ${rule.value} given`
2150
+ );
2151
+ }
2152
+ return {
2153
+ field: rule.field,
2154
+ type: filter.type,
2155
+ nullable: !!filter.nullable,
2156
+ operator: rule.operator,
2157
+ value: rule.value
2158
+ };
2159
+ }
2160
+ function validateRuleGroup(filters, ruleGroup) {
2161
+ const validatedRuleGroup = {
2162
+ condition: ruleGroup.condition,
2163
+ rules: []
2164
+ };
2165
+ for (const rule of ruleGroup.rules) {
2166
+ const valid = isRuleGroup(rule) ? validateRuleGroup(filters, rule) : validateRule(filters, rule);
2167
+ validatedRuleGroup.rules.push(valid);
2168
+ }
2169
+ return validatedRuleGroup;
2170
+ }
2171
+
2172
+ // src/validators/callout-component-content.validator.ts
2173
+ var calloutComponentContentValidator = (_, answer) => {
2174
+ return !answer;
2175
+ };
2176
+
2177
+ // src/validators/callout-component-input-address.validator.ts
2178
+ var calloutComponentInputAddressValidator = (_schema, _answer) => {
2179
+ throw new Error(
2180
+ `[calloutComponentInputAddressValidator] Not implemented yet`
2181
+ );
2182
+ };
2183
+
2184
+ // src/validators/callout-component-input-checkbox.validator.ts
2185
+ var calloutComponentInputCheckboxValidator = (_schema, answer) => {
2186
+ return typeof answer === "boolean";
2187
+ };
2188
+
2189
+ // src/validators/callout-component-input-currency.validator.ts
2190
+ var calloutComponentInputCurrencyValidator = (_schema, answer) => {
2191
+ return isAmountOfMoney(answer);
2192
+ };
2193
+
2194
+ // src/validators/callout-component-input-date-time.validator.ts
2195
+ var calloutComponentInputDateTimeValidator = (schema, answer) => {
2196
+ if (typeof answer !== "string") {
2197
+ return false;
2198
+ }
2199
+ return isDateBetween(answer, schema.widget.minDate, schema.widget.maxDate);
2200
+ };
2201
+
2202
+ // src/validators/callout-component-input-email.validator.ts
2203
+ var calloutComponentInputEmailValidator = (_schema, answer) => {
2204
+ return isEmail(answer);
2205
+ };
2206
+
2207
+ // src/validators/callout-component-input-file.validator.ts
2208
+ var calloutComponentInputFileValidator = (_schema, answer) => {
2209
+ if (isFileUploadAnswer(answer)) {
2210
+ return isURL(answer.url);
2211
+ }
2212
+ return false;
2213
+ };
2214
+
2215
+ // src/validators/callout-component-input-number.validator.ts
2216
+ var calloutComponentInputNumberValidator = (schema, answer) => {
2217
+ if (schema.validate && !isNumberInRange(answer, schema.validate.min, schema.validate.max)) {
2218
+ return false;
2219
+ }
2220
+ return isNumber(answer);
2221
+ };
2222
+
2223
+ // src/validators/callout-component-input-phone-number.validator.ts
2224
+ var calloutComponentInputPhoneNumberValidator = (_schema, answer) => {
2225
+ return isPhoneNumber(answer);
2226
+ };
2227
+
2228
+ // src/validators/callout-component-input-select.validator.ts
2229
+ var calloutComponentInputSelectValidator = (schema, answer) => {
2230
+ const optionValue = schema.data.values.find((v) => v.value === answer);
2231
+ return !!optionValue;
2232
+ };
2233
+
2234
+ // src/validators/callout-component-input-selectable.validator.ts
2235
+ var calloutComponentInputSelectableValidator = (schema, answer) => {
2236
+ const optionValue = schema.values.find((v) => v.value === answer);
2237
+ return !!optionValue;
2238
+ };
2239
+
2240
+ // src/validators/callout-component-input-signature.validator.ts
2241
+ var calloutComponentInputSignatureValidator = (_, _answer) => {
2242
+ throw new Error(
2243
+ `[calloutComponentInputSignatureValidator] Not implemented yet`
2244
+ );
2245
+ };
2246
+
2247
+ // src/validators/callout-component-input-text.validator.ts
2248
+ var validateRules = (rules, answer) => {
2249
+ if (!rules) {
2250
+ return true;
2251
+ }
2252
+ if (!answer && rules.required) {
2253
+ return false;
2254
+ }
2255
+ if (typeof rules.pattern === "string" && rules.pattern.length && !new RegExp(rules.pattern).test(answer || "")) {
2256
+ return false;
2257
+ }
2258
+ if (!isTextInWordRange(answer, rules.minWords, rules.maxWords)) {
2259
+ return false;
2260
+ }
2261
+ if (!isTextInRange(answer, rules.minLength, rules.maxLength)) {
2262
+ return false;
2263
+ }
2264
+ return true;
2265
+ };
2266
+ var calloutComponentInputTextValidator = (schema, answer) => {
2267
+ if (typeof answer !== "string") {
2268
+ return false;
2269
+ }
2270
+ return validateRules(schema?.validate, answer);
2271
+ };
2272
+
2273
+ // src/validators/callout-component-input-time.validator.ts
2274
+ var calloutComponentInputTimeValidator = (_schema, _answer) => {
2275
+ throw new Error(
2276
+ `[calloutComponentInputTimeValidator] Not implemented yet`
2277
+ );
2278
+ };
2279
+
2280
+ // src/validators/callout-component-input-url.validator.ts
2281
+ var calloutComponentInputUrlValidator = (_schema, answer) => {
2282
+ return isURL(answer);
2283
+ };
2284
+
2285
+ // src/validators/callout-component.validator.ts
2286
+ var calloutComponentNestableValidator = (schema, answers) => {
2287
+ for (const component of schema.components) {
2288
+ const valid = calloutComponentValidator(
2289
+ component,
2290
+ answers[component.key]
2291
+ );
2292
+ if (!valid) {
2293
+ return false;
2294
+ }
2295
+ }
2296
+ return true;
2297
+ };
2298
+ var calloutInputValidatorsMap = {
2299
+ // Input
2300
+ ["email" /* INPUT_EMAIL */]: calloutComponentInputEmailValidator,
2301
+ ["address" /* INPUT_ADDRESS */]: calloutComponentInputAddressValidator,
2302
+ ["checkbox" /* INPUT_CHECKBOX */]: calloutComponentInputCheckboxValidator,
2303
+ ["currency" /* INPUT_CURRENCY */]: calloutComponentInputCurrencyValidator,
2304
+ ["datetime" /* INPUT_DATE_TIME */]: calloutComponentInputDateTimeValidator,
2305
+ ["number" /* INPUT_NUMBER */]: calloutComponentInputNumberValidator,
2306
+ ["phoneNumber" /* INPUT_PHONE_NUMBER */]: calloutComponentInputPhoneNumberValidator,
2307
+ ["signature" /* INPUT_SIGNATURE */]: calloutComponentInputSignatureValidator,
2308
+ ["time" /* INPUT_TIME */]: calloutComponentInputTimeValidator,
2309
+ ["url" /* INPUT_URL */]: calloutComponentInputUrlValidator,
2310
+ ["file" /* INPUT_FILE */]: calloutComponentInputFileValidator,
2311
+ ["select" /* INPUT_SELECT */]: calloutComponentInputSelectValidator,
2312
+ // Text
2313
+ ["textfield" /* INPUT_TEXT_FIELD */]: calloutComponentInputTextValidator,
2314
+ ["textarea" /* INPUT_TEXT_AREA */]: calloutComponentInputTextValidator,
2315
+ // Selectable
2316
+ ["radio" /* INPUT_SELECTABLE_RADIO */]: calloutComponentInputSelectableValidator,
2317
+ ["selectboxes" /* INPUT_SELECTABLE_SELECTBOXES */]: calloutComponentInputSelectableValidator
2318
+ };
2319
+ function calloutComponentInputValidator(schema, answer) {
2320
+ const validator = calloutInputValidatorsMap[schema.type];
2321
+ if (!validator) {
2322
+ console.error(`No validator found for ${schema.type}`);
2323
+ return false;
2324
+ }
2325
+ if (answer === void 0) {
2326
+ return schema.validate?.required ? false : true;
2327
+ }
2328
+ const values = Array.isArray(answer) ? answer : [answer];
2329
+ for (const value of values) {
2330
+ const valid = validator(schema, value);
2331
+ if (!valid) {
2332
+ return false;
2333
+ }
2334
+ }
2335
+ return true;
2336
+ }
2337
+ function calloutComponentValidator(schema, answer) {
2338
+ if (isCalloutComponentOfBaseType(schema, 4 /* NESTABLE */)) {
2339
+ return calloutComponentNestableValidator(
2340
+ schema,
2341
+ answer
2342
+ );
2343
+ }
2344
+ if (isCalloutComponentOfBaseType(schema, 1 /* INPUT */)) {
2345
+ return calloutComponentInputValidator(
2346
+ schema,
2347
+ answer
2348
+ );
2349
+ }
2350
+ if (isCalloutComponentOfBaseType(schema, 0 /* CONTENT */)) {
2351
+ return calloutComponentContentValidator(schema, answer);
2352
+ }
2353
+ throw new Error("Invalid schema type");
2354
+ }
2355
+
2356
+ // src/index.browser.ts
2357
+ globalThis.Beabee ||= {};
2358
+ globalThis.Beabee.Common = src_exports;
2359
+ })();
2360
+ //# sourceMappingURL=beabee-common.js.map