@beabee/beabee-common 0.20.3 → 0.20.4

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