@marlinjai/mail-contract 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -144,6 +144,7 @@ __export(index_exports, {
144
144
  DOCUMENT_SCHEMA_VERSIONS: () => DOCUMENT_SCHEMA_VERSIONS,
145
145
  DOMAIN_BUYING_BLOCKS: () => DOMAIN_BUYING_BLOCKS,
146
146
  DOMAIN_BUYING_NOT_CONFIGURED_REASON: () => DOMAIN_BUYING_NOT_CONFIGURED_REASON,
147
+ DOMAIN_ORDER_KINDS: () => DOMAIN_ORDER_KINDS,
147
148
  DOMAIN_ORDER_STATES: () => DOMAIN_ORDER_STATES,
148
149
  DOMAIN_PRICE_CHANGED_REASON: () => DOMAIN_PRICE_CHANGED_REASON,
149
150
  DOMAIN_UNAVAILABLE_REASONS: () => DOMAIN_UNAVAILABLE_REASONS,
@@ -155,6 +156,7 @@ __export(index_exports, {
155
156
  DomainOffer: () => DomainOffer,
156
157
  DomainOrder: () => DomainOrder,
157
158
  DomainOrderCreate: () => DomainOrderCreate,
159
+ DomainOrderKind: () => DomainOrderKind,
158
160
  DomainOrderState: () => DomainOrderState,
159
161
  DomainRegistrant: () => DomainRegistrant,
160
162
  DomainSearchQuery: () => DomainSearchQuery,
@@ -368,6 +370,7 @@ __export(index_exports, {
368
370
  QuietHours: () => QuietHours,
369
371
  RECIPIENT_REJECTIONS: () => RECIPIENT_REJECTIONS,
370
372
  RECIPIENT_STATUSES: () => RECIPIENT_STATUSES,
373
+ REGISTRY_PHONE: () => REGISTRY_PHONE,
371
374
  REQUEST_ID_HEADER: () => REQUEST_ID_HEADER,
372
375
  RESEND_EVENT_TYPES: () => RESEND_EVENT_TYPES,
373
376
  RESERVED_MERGE_FIELDS: () => RESERVED_MERGE_FIELDS,
@@ -605,6 +608,7 @@ __export(index_exports, {
605
608
  missingInsertionTexts: () => missingInsertionTexts,
606
609
  missingRequiredMergeFields: () => missingRequiredMergeFields,
607
610
  normalizeChoiceKey: () => normalizeChoiceKey,
611
+ normalizePhone: () => normalizePhone,
608
612
  nowSeconds: () => nowSeconds,
609
613
  operationsWithAccess: () => operationsWithAccess,
610
614
  ownEntry: () => ownEntry,
@@ -3721,6 +3725,7 @@ var AUDIT_ACTIONS = [
3721
3725
  "domain_order.registered",
3722
3726
  "domain_order.ready",
3723
3727
  "domain_order.needs_attention",
3728
+ "domain_order.kind_changed",
3724
3729
  "domain_order.refunded",
3725
3730
  "domain_order.cancelled",
3726
3731
  // A1: automations
@@ -4648,6 +4653,292 @@ var SendingDomainUpdate = import_zod15.z.object({ from_name: SenderFields.from_n
4648
4653
 
4649
4654
  // src/domains.ts
4650
4655
  var import_zod16 = require("zod");
4656
+
4657
+ // src/phone.ts
4658
+ var REGISTRY_PHONE = /^\+\d{1,3}\.\d{4,14}$/;
4659
+ var CALLING_CODE_OF_COUNTRY = {
4660
+ DE: "49",
4661
+ AT: "43",
4662
+ CH: "41",
4663
+ LI: "423",
4664
+ LU: "352",
4665
+ NL: "31",
4666
+ BE: "32",
4667
+ FR: "33",
4668
+ IT: "39",
4669
+ ES: "34",
4670
+ PT: "351",
4671
+ IE: "353",
4672
+ GB: "44",
4673
+ DK: "45",
4674
+ SE: "46",
4675
+ NO: "47",
4676
+ FI: "358",
4677
+ IS: "354",
4678
+ PL: "48",
4679
+ CZ: "420",
4680
+ SK: "421",
4681
+ HU: "36",
4682
+ SI: "386",
4683
+ HR: "385",
4684
+ RO: "40",
4685
+ BG: "359",
4686
+ GR: "30",
4687
+ CY: "357",
4688
+ MT: "356",
4689
+ EE: "372",
4690
+ LV: "371",
4691
+ LT: "370",
4692
+ US: "1",
4693
+ CA: "1",
4694
+ AU: "61",
4695
+ NZ: "64",
4696
+ TR: "90",
4697
+ IL: "972",
4698
+ AE: "971",
4699
+ IN: "91",
4700
+ JP: "81",
4701
+ CN: "86",
4702
+ SG: "65",
4703
+ ZA: "27",
4704
+ BR: "55",
4705
+ MX: "52",
4706
+ UA: "380",
4707
+ RS: "381"
4708
+ };
4709
+ var CALLING_CODES = /* @__PURE__ */ new Set([
4710
+ "1",
4711
+ "7",
4712
+ "20",
4713
+ "27",
4714
+ "30",
4715
+ "31",
4716
+ "32",
4717
+ "33",
4718
+ "34",
4719
+ "36",
4720
+ "39",
4721
+ "40",
4722
+ "41",
4723
+ "43",
4724
+ "44",
4725
+ "45",
4726
+ "46",
4727
+ "47",
4728
+ "48",
4729
+ "49",
4730
+ "51",
4731
+ "52",
4732
+ "53",
4733
+ "54",
4734
+ "55",
4735
+ "56",
4736
+ "57",
4737
+ "58",
4738
+ "60",
4739
+ "61",
4740
+ "62",
4741
+ "63",
4742
+ "64",
4743
+ "65",
4744
+ "66",
4745
+ "81",
4746
+ "82",
4747
+ "84",
4748
+ "86",
4749
+ "90",
4750
+ "91",
4751
+ "92",
4752
+ "93",
4753
+ "94",
4754
+ "95",
4755
+ "98",
4756
+ "211",
4757
+ "212",
4758
+ "213",
4759
+ "216",
4760
+ "218",
4761
+ "220",
4762
+ "221",
4763
+ "222",
4764
+ "223",
4765
+ "224",
4766
+ "225",
4767
+ "226",
4768
+ "227",
4769
+ "228",
4770
+ "229",
4771
+ "230",
4772
+ "231",
4773
+ "232",
4774
+ "233",
4775
+ "234",
4776
+ "235",
4777
+ "236",
4778
+ "237",
4779
+ "238",
4780
+ "239",
4781
+ "240",
4782
+ "241",
4783
+ "242",
4784
+ "243",
4785
+ "244",
4786
+ "245",
4787
+ "246",
4788
+ "247",
4789
+ "248",
4790
+ "249",
4791
+ "250",
4792
+ "251",
4793
+ "252",
4794
+ "253",
4795
+ "254",
4796
+ "255",
4797
+ "256",
4798
+ "257",
4799
+ "258",
4800
+ "260",
4801
+ "261",
4802
+ "262",
4803
+ "263",
4804
+ "264",
4805
+ "265",
4806
+ "266",
4807
+ "267",
4808
+ "268",
4809
+ "269",
4810
+ "290",
4811
+ "291",
4812
+ "297",
4813
+ "298",
4814
+ "299",
4815
+ "350",
4816
+ "351",
4817
+ "352",
4818
+ "353",
4819
+ "354",
4820
+ "355",
4821
+ "356",
4822
+ "357",
4823
+ "358",
4824
+ "359",
4825
+ "370",
4826
+ "371",
4827
+ "372",
4828
+ "373",
4829
+ "374",
4830
+ "375",
4831
+ "376",
4832
+ "377",
4833
+ "378",
4834
+ "379",
4835
+ "380",
4836
+ "381",
4837
+ "382",
4838
+ "383",
4839
+ "385",
4840
+ "386",
4841
+ "387",
4842
+ "389",
4843
+ "420",
4844
+ "421",
4845
+ "423",
4846
+ "500",
4847
+ "501",
4848
+ "502",
4849
+ "503",
4850
+ "504",
4851
+ "505",
4852
+ "506",
4853
+ "507",
4854
+ "508",
4855
+ "509",
4856
+ "590",
4857
+ "591",
4858
+ "592",
4859
+ "593",
4860
+ "594",
4861
+ "595",
4862
+ "596",
4863
+ "597",
4864
+ "598",
4865
+ "599",
4866
+ "670",
4867
+ "672",
4868
+ "673",
4869
+ "674",
4870
+ "675",
4871
+ "676",
4872
+ "677",
4873
+ "678",
4874
+ "679",
4875
+ "680",
4876
+ "681",
4877
+ "682",
4878
+ "683",
4879
+ "685",
4880
+ "686",
4881
+ "687",
4882
+ "688",
4883
+ "689",
4884
+ "690",
4885
+ "691",
4886
+ "692",
4887
+ "850",
4888
+ "852",
4889
+ "853",
4890
+ "855",
4891
+ "856",
4892
+ "880",
4893
+ "886",
4894
+ "960",
4895
+ "961",
4896
+ "962",
4897
+ "963",
4898
+ "964",
4899
+ "965",
4900
+ "966",
4901
+ "967",
4902
+ "968",
4903
+ "970",
4904
+ "971",
4905
+ "972",
4906
+ "973",
4907
+ "974",
4908
+ "975",
4909
+ "976",
4910
+ "977",
4911
+ "992",
4912
+ "993",
4913
+ "994",
4914
+ "995",
4915
+ "996",
4916
+ "998"
4917
+ ]);
4918
+ var KEEPS_LEADING_ZERO = /* @__PURE__ */ new Set(["39", "378", "379"]);
4919
+ function normalizePhone(raw, country) {
4920
+ const text = raw.trim();
4921
+ if (REGISTRY_PHONE.test(text)) return text;
4922
+ const compact = text.replace(/\(0\)/g, "").replace(/[\s\-./()]/g, "");
4923
+ let international;
4924
+ if (/^\+\d+$/.test(compact)) international = compact.slice(1);
4925
+ else if (/^00\d+$/.test(compact)) international = compact.slice(2);
4926
+ else if (/^0\d+$/.test(compact)) {
4927
+ const code = country ? CALLING_CODE_OF_COUNTRY[country.trim().toUpperCase()] : void 0;
4928
+ if (!code) return raw;
4929
+ return `+${code}.${KEEPS_LEADING_ZERO.has(code) ? compact : compact.slice(1)}`;
4930
+ } else return raw;
4931
+ for (const length of [1, 2, 3]) {
4932
+ const code = international.slice(0, length);
4933
+ if (CALLING_CODES.has(code)) {
4934
+ const rest = international.slice(length);
4935
+ return `+${code}.${KEEPS_LEADING_ZERO.has(code) ? rest : rest.replace(/^0/, "")}`;
4936
+ }
4937
+ }
4938
+ return raw;
4939
+ }
4940
+
4941
+ // src/domains.ts
4651
4942
  var DomainSearchQuery = import_zod16.z.object({ q: import_zod16.z.string().trim().min(1).max(63) });
4652
4943
  var DOMAIN_UNAVAILABLE_REASONS = ["taken", "extension_not_supported", "premium", "not_registrable"];
4653
4944
  var DomainUnavailableReason = import_zod16.z.enum(DOMAIN_UNAVAILABLE_REASONS);
@@ -4669,20 +4960,27 @@ var DomainRegistrant = import_zod16.z.object({
4669
4960
  name: import_zod16.z.string().trim().min(3).max(120).regex(/\S+\s+\S+/, "must be a first and a last name"),
4670
4961
  organization: import_zod16.z.string().trim().min(1).max(120).nullable().optional(),
4671
4962
  email: Email,
4672
- phone: import_zod16.z.string().trim().regex(/^\+\d{1,3}\.\d{4,14}$/, "must be +<country code>.<number>, such as +49.3012345678"),
4963
+ phone: import_zod16.z.string().trim().min(1).max(40),
4673
4964
  street: import_zod16.z.string().trim().min(3).max(200),
4674
4965
  city: import_zod16.z.string().trim().min(1).max(100),
4675
4966
  state: import_zod16.z.string().trim().min(1).max(100),
4676
4967
  postal_code: import_zod16.z.string().trim().min(2).max(20),
4677
4968
  country_code: import_zod16.z.string().trim().toUpperCase().regex(/^[A-Z]{2}$/, "must be a two-letter country code such as DE")
4678
- });
4969
+ }).superRefine((holder, ctx) => {
4970
+ if (typeof holder.phone === "string" && !REGISTRY_PHONE.test(normalizePhone(holder.phone, holder.country_code))) {
4971
+ ctx.addIssue({ code: import_zod16.z.ZodIssueCode.custom, path: ["phone"], message: "must be a phone number with its country code, such as +49 30 1234 5678" });
4972
+ }
4973
+ }).transform((holder) => ({ ...holder, phone: normalizePhone(holder.phone, holder.country_code) }));
4679
4974
  var MAX_DOMAIN_ORDERS_PER_DAY = 2;
4975
+ var DOMAIN_ORDER_KINDS = ["sending", "domain_only"];
4976
+ var DomainOrderKind = import_zod16.z.enum(DOMAIN_ORDER_KINDS);
4680
4977
  var DomainOrderCreate = import_zod16.z.object({
4681
4978
  domain: SendingDomainName,
4682
4979
  price_cents: import_zod16.z.number().int().min(0),
4683
4980
  registrant: DomainRegistrant,
4684
- from_name: import_zod16.z.string().trim().min(1).max(120),
4685
- from_local_part: import_zod16.z.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello"),
4981
+ kind: DomainOrderKind.default("sending"),
4982
+ from_name: import_zod16.z.string().trim().min(1).max(120).optional(),
4983
+ from_local_part: import_zod16.z.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello").optional(),
4686
4984
  /**
4687
4985
  * Where Stripe returns to after paying, and after leaving the payment. The
4688
4986
  * service adds `domain_order=<order id>` to both, so the page coming back
@@ -4693,6 +4991,10 @@ var DomainOrderCreate = import_zod16.z.object({
4693
4991
  cancel_url: import_zod16.z.string().url(),
4694
4992
  /** The buyer accepted the terms of service (which cover bought domains) of this version. */
4695
4993
  accept_terms: AcceptTerms
4994
+ }).superRefine((order, ctx) => {
4995
+ if (order.kind !== "sending") return;
4996
+ if (!order.from_name) ctx.addIssue({ code: import_zod16.z.ZodIssueCode.custom, path: ["from_name"], message: "is needed for a domain mail is sent from" });
4997
+ if (!order.from_local_part) ctx.addIssue({ code: import_zod16.z.ZodIssueCode.custom, path: ["from_local_part"], message: "is needed for a domain mail is sent from" });
4696
4998
  });
4697
4999
  var DOMAIN_ORDER_STATES = [
4698
5000
  "awaiting_payment",
@@ -4715,8 +5017,10 @@ var DomainOrder = import_zod16.z.object({
4715
5017
  /** Stripe's payment page while `awaiting_payment`; null otherwise. */
4716
5018
  checkout_url: import_zod16.z.string().url().nullable(),
4717
5019
  registrant_name: import_zod16.z.string(),
4718
- from_name: import_zod16.z.string(),
4719
- from_email: Email,
5020
+ kind: DomainOrderKind,
5021
+ /** The sender, for a `sending` order; null for `domain_only`. */
5022
+ from_name: import_zod16.z.string().nullable(),
5023
+ from_email: Email.nullable(),
4720
5024
  /** The sending domain once `ready`. */
4721
5025
  sending_domain_id: Id.nullable(),
4722
5026
  /** When the paid year ends, once registered. */
@@ -7005,6 +7309,7 @@ function matchRoute(method, pathname) {
7005
7309
  DOCUMENT_SCHEMA_VERSIONS,
7006
7310
  DOMAIN_BUYING_BLOCKS,
7007
7311
  DOMAIN_BUYING_NOT_CONFIGURED_REASON,
7312
+ DOMAIN_ORDER_KINDS,
7008
7313
  DOMAIN_ORDER_STATES,
7009
7314
  DOMAIN_PRICE_CHANGED_REASON,
7010
7315
  DOMAIN_UNAVAILABLE_REASONS,
@@ -7016,6 +7321,7 @@ function matchRoute(method, pathname) {
7016
7321
  DomainOffer,
7017
7322
  DomainOrder,
7018
7323
  DomainOrderCreate,
7324
+ DomainOrderKind,
7019
7325
  DomainOrderState,
7020
7326
  DomainRegistrant,
7021
7327
  DomainSearchQuery,
@@ -7229,6 +7535,7 @@ function matchRoute(method, pathname) {
7229
7535
  QuietHours,
7230
7536
  RECIPIENT_REJECTIONS,
7231
7537
  RECIPIENT_STATUSES,
7538
+ REGISTRY_PHONE,
7232
7539
  REQUEST_ID_HEADER,
7233
7540
  RESEND_EVENT_TYPES,
7234
7541
  RESERVED_MERGE_FIELDS,
@@ -7466,6 +7773,7 @@ function matchRoute(method, pathname) {
7466
7773
  missingInsertionTexts,
7467
7774
  missingRequiredMergeFields,
7468
7775
  normalizeChoiceKey,
7776
+ normalizePhone,
7469
7777
  nowSeconds,
7470
7778
  operationsWithAccess,
7471
7779
  ownEntry,