@hartl-services/medusa-base 2.8.0 → 2.10.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.
Files changed (50) hide show
  1. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -5
  2. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.d.ts +0 -5
  3. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.js +0 -5
  4. package/.medusa/server/src/admin/admin-components/i18n/texts.d.ts +1 -2
  5. package/.medusa/server/src/admin/admin-components/i18n/texts.js +1 -2
  6. package/.medusa/server/src/admin/index.js +106 -69
  7. package/.medusa/server/src/admin/index.mjs +107 -70
  8. package/.medusa/server/src/api/admin/email/templates/[kind]/send-test/route.js +7 -1
  9. package/.medusa/server/src/documents/templates/financial-document.js +23 -4
  10. package/.medusa/server/src/email/application/warn-credential-expiry.js +77 -0
  11. package/.medusa/server/src/email/config/index.js +8 -2
  12. package/.medusa/server/src/email/config/notification-module.js +28 -2
  13. package/.medusa/server/src/email/domain/business-keys.js +5 -2
  14. package/.medusa/server/src/email/domain/failure-classification.js +9 -1
  15. package/.medusa/server/src/email/plugin-features.js +123 -1
  16. package/.medusa/server/src/email/rendering/default-templates.js +16 -1
  17. package/.medusa/server/src/email/rendering/render-email.js +2 -1
  18. package/.medusa/server/src/email/types/email-kinds.js +2 -1
  19. package/.medusa/server/src/email/types/template-data.js +8 -1
  20. package/.medusa/server/src/jobs/email-credential-expiry.js +27 -0
  21. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +4 -1
  22. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +103 -29
  23. package/.medusa/server/src/modules/email/domain/message-state.js +3 -1
  24. package/.medusa/server/src/modules/email/migrations/Migration20261011120000.js +20 -0
  25. package/.medusa/server/src/providers/smtp/delivery-settings.js +75 -0
  26. package/.medusa/server/src/providers/smtp/graph-transport.js +150 -0
  27. package/.medusa/server/src/providers/smtp/service.js +105 -37
  28. package/.medusa/server/src/providers/smtp/types.js +7 -1
  29. package/.medusa/server/src/shared/lib/index.js +2 -1
  30. package/.medusa/server/src/shared/lib/shipping-tax.js +12 -0
  31. package/.medusa/server/src/shop-config/build-food-shop-config.js +3 -5
  32. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +44 -33
  33. package/README.md +118 -69
  34. package/dist/documents/templates/financial-document.js +22 -3
  35. package/dist/documents/types/documents.d.ts +13 -0
  36. package/dist/email/config/index.d.ts +6 -1
  37. package/dist/email/config/index.js +7 -1
  38. package/dist/email/config/notification-module.d.ts +25 -0
  39. package/dist/email/config/notification-module.js +27 -1
  40. package/dist/email/types/email-kinds.d.ts +2 -1
  41. package/dist/email/types/email-kinds.js +1 -0
  42. package/dist/email/types/template-data.d.ts +10 -0
  43. package/dist/email/types/template-data.js +7 -0
  44. package/dist/shared/lib/index.d.ts +1 -0
  45. package/dist/shared/lib/index.js +1 -0
  46. package/dist/shared/lib/shipping-tax.d.ts +8 -0
  47. package/dist/shared/lib/shipping-tax.js +11 -0
  48. package/dist/shop-config/build-food-shop-config.d.ts +1 -1
  49. package/dist/shop-config/build-food-shop-config.js +2 -4
  50. package/package.json +2 -2
@@ -3,33 +3,99 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.roundTaxBreakdown = exports.groupTaxLines = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const lib_1 = require("../../../shared/lib");
6
+ const groupKey = (line) => JSON.stringify([line.name, line.code, line.rate]);
7
+ /**
8
+ * Splits an apportioned shipping tax line (Tax Compliance's "Anteilige
9
+ * Versandsteuer") back onto the item tax groups by their items' net amount
10
+ * after discounts, the key Tax Compliance weights the rate by: each group
11
+ * gets its share of the shipping net amount and the tax of that share at
12
+ * its own rate. Returns false when the items have no net amount to split by.
13
+ */
14
+ const splitApportionedShipping = (line, itemGroups) => {
15
+ const totalWeight = utils_1.MathBN.sum(0, ...itemGroups.map((group) => group.itemTaxable));
16
+ const totalWeightedRate = utils_1.MathBN.sum(0, ...itemGroups.map((group) => utils_1.MathBN.mult(group.itemTaxable, group.rate)));
17
+ if (!utils_1.MathBN.gt(totalWeight, 0) ||
18
+ (!utils_1.MathBN.gt(totalWeightedRate, 0) && !utils_1.MathBN.eq(line.amount, 0))) {
19
+ return false;
20
+ }
21
+ for (const group of itemGroups) {
22
+ group.taxable = utils_1.MathBN.add(group.taxable, utils_1.MathBN.div(utils_1.MathBN.mult(line.taxable_amount, group.itemTaxable), totalWeight));
23
+ if (utils_1.MathBN.gt(totalWeightedRate, 0)) {
24
+ group.tax = utils_1.MathBN.add(group.tax, utils_1.MathBN.div(utils_1.MathBN.mult(line.amount, utils_1.MathBN.mult(group.itemTaxable, group.rate)), totalWeightedRate));
25
+ }
26
+ }
27
+ return true;
28
+ };
6
29
  /**
7
30
  * Sums item and shipping tax lines per configured tax rate. Lines with the
8
31
  * same name and percentage form one entry; first occurrence defines order.
32
+ * Shipping follows the items' rates: an apportioned shipping line is split
33
+ * onto the item rates, and shipping taxed at the rate of a cart with one
34
+ * item tax group joins that group. Any other shipping tax keeps its own row.
9
35
  */
10
- const groupTaxLines = (lines, currencyCode) => {
36
+ const groupTaxLines = (itemLines, shippingLines, currencyCode) => {
11
37
  const groups = new Map();
12
- for (const line of lines) {
13
- const key = JSON.stringify([line.name, line.code, line.rate]);
14
- const group = groups.get(key);
15
- groups.set(key, {
38
+ const groupFor = (line) => {
39
+ const key = groupKey(line);
40
+ const existing = groups.get(key);
41
+ if (existing) {
42
+ return existing;
43
+ }
44
+ const group = {
16
45
  name: line.name,
17
46
  code: line.code,
18
47
  rate: line.rate,
19
- tax_total: {
20
- amount: utils_1.MathBN.add(group?.tax_total.amount ?? 0, line.amount).toFixed(),
21
- currency_code: currencyCode,
22
- },
23
- });
48
+ tax: utils_1.MathBN.convert(0),
49
+ taxable: utils_1.MathBN.convert(0),
50
+ itemTaxable: utils_1.MathBN.convert(0),
51
+ };
52
+ groups.set(key, group);
53
+ return group;
54
+ };
55
+ for (const line of itemLines) {
56
+ const group = groupFor(line);
57
+ group.tax = utils_1.MathBN.add(group.tax, line.amount);
58
+ group.taxable = utils_1.MathBN.add(group.taxable, line.taxable_amount);
59
+ group.itemTaxable = utils_1.MathBN.add(group.itemTaxable, line.taxable_amount);
24
60
  }
25
- return [...groups.values()];
61
+ const itemGroups = [...groups.values()];
62
+ for (const line of shippingLines) {
63
+ if (line.code === lib_1.APPORTIONED_SHIPPING_TAX_CODE &&
64
+ splitApportionedShipping(line, itemGroups)) {
65
+ continue;
66
+ }
67
+ const group = itemGroups.length === 1 && itemGroups[0].rate === line.rate
68
+ ? itemGroups[0]
69
+ : groupFor(line);
70
+ group.tax = utils_1.MathBN.add(group.tax, line.amount);
71
+ group.taxable = utils_1.MathBN.add(group.taxable, line.taxable_amount);
72
+ }
73
+ return [...groups.values()].map((group) => ({
74
+ name: group.name,
75
+ code: group.code,
76
+ rate: group.rate,
77
+ tax_total: { amount: group.tax.toFixed(), currency_code: currencyCode },
78
+ taxable_amount: {
79
+ amount: group.taxable.toFixed(),
80
+ currency_code: currencyCode,
81
+ },
82
+ }));
26
83
  };
27
84
  exports.groupTaxLines = groupTaxLines;
85
+ /** Rounds every amount and adds the residue to `target` to the largest one. */
86
+ const roundToTarget = (amounts, target, decimalPlaces) => {
87
+ const rounded = amounts.map((amount) => amount.decimalPlaces(decimalPlaces));
88
+ const residue = utils_1.MathBN.sub(target, utils_1.MathBN.sum(...rounded));
89
+ const largestIndex = rounded.reduce((largest, amount, index) => utils_1.MathBN.gt(amount.abs(), rounded[largest].abs()) ? index : largest, 0);
90
+ rounded[largestIndex] = utils_1.MathBN.add(rounded[largestIndex], residue);
91
+ return { rounded, residue };
92
+ };
28
93
  /**
29
94
  * Rounds every entry to the currency's minor unit and assigns the rounding
30
95
  * residue to the largest entry, so the printed rows add up exactly to the
31
96
  * printed tax total. A residue larger than the accumulated rounding error
32
- * means the entries do not describe the total and is rejected.
97
+ * means the entries do not describe the total and is rejected. Net amounts
98
+ * are rounded the same way to their own rounded sum.
33
99
  */
34
100
  const roundTaxBreakdown = (entries, taxTotal) => {
35
101
  if (entries.length === 0) {
@@ -37,27 +103,35 @@ const roundTaxBreakdown = (entries, taxTotal) => {
37
103
  }
38
104
  const currencyCode = taxTotal.currency_code;
39
105
  const decimalPlaces = (0, lib_1.getCurrencyDecimalPlaces)(currencyCode);
40
- const target = utils_1.MathBN.convert(taxTotal.amount).decimalPlaces(decimalPlaces);
41
- const rounded = entries.map((entry) => {
42
- if (entry.tax_total.currency_code !== currencyCode) {
106
+ const money = (amount) => ({
107
+ amount: amount.toFixed(decimalPlaces),
108
+ currency_code: currencyCode,
109
+ });
110
+ for (const entry of entries) {
111
+ if (entry.tax_total.currency_code !== currencyCode ||
112
+ (entry.taxable_amount &&
113
+ entry.taxable_amount.currency_code !== currencyCode)) {
43
114
  throw new Error("The tax breakdown contains mixed currencies.");
44
115
  }
45
- return utils_1.MathBN.convert(entry.tax_total.amount).decimalPlaces(decimalPlaces);
46
- });
47
- const residue = utils_1.MathBN.sub(target, utils_1.MathBN.sum(...rounded));
116
+ }
117
+ const tax = roundToTarget(entries.map((entry) => utils_1.MathBN.convert(entry.tax_total.amount)), utils_1.MathBN.convert(taxTotal.amount).decimalPlaces(decimalPlaces), decimalPlaces);
48
118
  const minorUnit = utils_1.MathBN.convert(10).pow(-decimalPlaces);
49
- if (utils_1.MathBN.gt(residue.abs(), utils_1.MathBN.mult(minorUnit, entries.length))) {
119
+ if (utils_1.MathBN.gt(tax.residue.abs(), utils_1.MathBN.mult(minorUnit, entries.length))) {
50
120
  throw new Error("The tax breakdown does not match the tax total.");
51
121
  }
52
- const largestIndex = rounded.reduce((largest, amount, index) => utils_1.MathBN.gt(amount.abs(), rounded[largest].abs()) ? index : largest, 0);
53
- rounded[largestIndex] = utils_1.MathBN.add(rounded[largestIndex], residue);
54
- return entries.map((entry, index) => ({
55
- ...entry,
56
- tax_total: {
57
- amount: rounded[index].toFixed(decimalPlaces),
58
- currency_code: currencyCode,
59
- },
60
- }));
122
+ const taxableAmounts = entries.map((entry) => entry.taxable_amount ? utils_1.MathBN.convert(entry.taxable_amount.amount) : null);
123
+ const knownTaxableAmounts = taxableAmounts.filter((amount) => amount !== null);
124
+ const taxable = knownTaxableAmounts.length === entries.length
125
+ ? roundToTarget(knownTaxableAmounts, utils_1.MathBN.sum(...knownTaxableAmounts).decimalPlaces(decimalPlaces), decimalPlaces).rounded
126
+ : null;
127
+ return entries.map((entry, index) => {
128
+ const { taxable_amount: _taxableAmount, ...rest } = entry;
129
+ return {
130
+ ...rest,
131
+ tax_total: money(tax.rounded[index]),
132
+ ...(taxable ? { taxable_amount: money(taxable[index]) } : {}),
133
+ };
134
+ });
61
135
  };
62
136
  exports.roundTaxBreakdown = roundTaxBreakdown;
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWJyZWFrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vdGF4LWJyZWFrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBa0Q7QUFFbEQsNkNBQThEO0FBYTlEOzs7R0FHRztBQUNJLE1BQU0sYUFBYSxHQUFHLENBQzNCLEtBQXNCLEVBQ3RCLFlBQW9CLEVBQ1MsRUFBRTtJQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQTtJQUMzRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRTtnQkFDVCxNQUFNLEVBQUUsY0FBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDdkUsYUFBYSxFQUFFLFlBQVk7YUFDNUI7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7QUFDN0IsQ0FBQyxDQUFBO0FBcEJZLFFBQUEsYUFBYSxpQkFvQnpCO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLENBQy9CLE9BQW9DLEVBQ3BDLFFBQXVCLEVBQ00sRUFBRTtJQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQTtJQUMzQyxNQUFNLGFBQWEsR0FBRyxJQUFBLDhCQUF3QixFQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzVELE1BQU0sTUFBTSxHQUFHLGNBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMzRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDcEMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUNELE9BQU8sY0FBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM1RSxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sT0FBTyxHQUFHLGNBQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFELE1BQU0sU0FBUyxHQUFHLGNBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDeEQsSUFBSSxjQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDakMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3pCLGNBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFDbkUsQ0FBQyxDQUNGLENBQUE7SUFDRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsY0FBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFbEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxHQUFHLEtBQUs7UUFDUixTQUFTLEVBQUU7WUFDVCxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDN0MsYUFBYSxFQUFFLFlBQVk7U0FDNUI7S0FDRixDQUFDLENBQUMsQ0FBQTtBQUNMLENBQUMsQ0FBQTtBQXRDWSxRQUFBLGlCQUFpQixxQkFzQzdCIn0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGF4LWJyZWFrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9kb21haW4vdGF4LWJyZWFrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBa0Q7QUFFbEQsNkNBRzRCO0FBNEI1QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQW1ELEVBQUUsRUFBRSxDQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsQ0FDL0IsSUFBbUIsRUFDbkIsVUFBbUIsRUFDVixFQUFFO0lBQ1gsTUFBTSxXQUFXLEdBQUcsY0FBTSxDQUFDLEdBQUcsQ0FDNUIsQ0FBQyxFQUNELEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUNoRCxDQUFBO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxjQUFNLENBQUMsR0FBRyxDQUNsQyxDQUFDLEVBQ0QsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxjQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3pFLENBQUE7SUFDRCxJQUNFLENBQUMsY0FBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxjQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ2hFLENBQUM7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
@@ -21,9 +21,11 @@ exports.EMAIL_SAFE_STATUS_CODES = [
21
21
  "attachment_invalid",
22
22
  "attachment_unavailable",
23
23
  "attempt_lease_lost",
24
+ "auth_failed",
24
25
  "connection_failed",
25
26
  "invalid_content",
26
27
  "lease_expired",
28
+ "not_configured",
27
29
  "notifications_disabled",
28
30
  "outcome_unknown",
29
31
  "payload_expired",
@@ -66,4 +68,4 @@ const statusAfterPredecessor = (predecessorStatus) => {
66
68
  return { status: "pending", terminal_code: null };
67
69
  };
68
70
  exports.statusAfterPredecessor = statusAfterPredecessor;
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2VtYWlsL2RvbWFpbi9tZXNzYWdlLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsc0JBQXNCLEdBQUc7SUFDcEMsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsZUFBZTtJQUNmLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFlBQVk7Q0FDSixDQUFDO0FBRUUsUUFBQSxzQkFBc0IsR0FBRztJQUNwQyxZQUFZO0lBQ1osTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0NBQ0QsQ0FBQztBQUtFLFFBQUEsdUJBQXVCLEdBQUc7SUFDckMsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMkNBQTJDO0lBQzNDLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIscUJBQXFCO0NBQ2IsQ0FBQztBQUlKLE1BQU0scUJBQXFCLEdBQUcsQ0FDbkMsS0FBYyxFQUNnQixFQUFFLENBQ2hDLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFDeEIsK0JBQTZDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBSnBELFFBQUEscUJBQXFCLHlCQUkrQjtBQUUxRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBd0IsRUFBWSxFQUFFLENBQ3RFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUMzQyxDQUFDO0FBSFMsUUFBQSxpQkFBaUIscUJBRzFCO0FBRUcsTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixhQUFnQyxFQUNoQyxhQUFnQyxFQUN2QixFQUFFO0lBQ1gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEMsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyxDQUFDO0FBTlcsUUFBQSxnQkFBZ0Isb0JBTTNCO0FBRUssTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQTBCLEVBQVcsRUFBRSxDQUM3RSxNQUFNLEtBQUssTUFBTTtJQUNqQixNQUFNLEtBQUssUUFBUTtJQUNuQixNQUFNLEtBQUssU0FBUztJQUNwQixNQUFNLEtBQUssWUFBWSxDQUFDO0FBSmIsUUFBQSx1QkFBdUIsMkJBSVY7QUFFbkIsTUFBTSxzQkFBc0IsR0FBRyxDQUNwQyxpQkFBNEMsRUFJM0MsRUFBRTtJQUNILElBQUksaUJBQWlCLEtBQUssSUFBSSxJQUFJLGlCQUFpQixLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxpQkFBaUIsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsSUFBSSxpQkFBaUIsS0FBSyxRQUFRLElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNwRCxDQUFDLENBQUM7QUFoQlcsUUFBQSxzQkFBc0IsMEJBZ0JqQyJ9
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2VtYWlsL2RvbWFpbi9tZXNzYWdlLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsc0JBQXNCLEdBQUc7SUFDcEMsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsZUFBZTtJQUNmLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFlBQVk7Q0FDSixDQUFDO0FBRUUsUUFBQSxzQkFBc0IsR0FBRztJQUNwQyxZQUFZO0lBQ1osTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0NBQ0QsQ0FBQztBQUtFLFFBQUEsdUJBQXVCLEdBQUc7SUFDckMsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixvQkFBb0I7SUFDcEIsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQiwyQ0FBMkM7SUFDM0MscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQix3QkFBd0I7SUFDeEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixxQkFBcUI7Q0FDYixDQUFDO0FBSUosTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxLQUFjLEVBQ2dCLEVBQUUsQ0FDaEMsT0FBTyxLQUFLLEtBQUssUUFBUTtJQUN4QiwrQkFBNkMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFKcEQsUUFBQSxxQkFBcUIseUJBSStCO0FBRTFELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUF3QixFQUFZLEVBQUUsQ0FDdEUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7QUFIUyxRQUFBLGlCQUFpQixxQkFHMUI7QUFFRyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLGFBQWdDLEVBQ2hDLGFBQWdDLEVBQ3ZCLEVBQUU7SUFDWCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDLENBQUM7QUFOVyxRQUFBLGdCQUFnQixvQkFNM0I7QUFFSyxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBMEIsRUFBVyxFQUFFLENBQzdFLE1BQU0sS0FBSyxNQUFNO0lBQ2pCLE1BQU0sS0FBSyxRQUFRO0lBQ25CLE1BQU0sS0FBSyxTQUFTO0lBQ3BCLE1BQU0sS0FBSyxZQUFZLENBQUM7QUFKYixRQUFBLHVCQUF1QiwyQkFJVjtBQUVuQixNQUFNLHNCQUFzQixHQUFHLENBQ3BDLGlCQUE0QyxFQUkzQyxFQUFFO0lBQ0gsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLGlCQUFpQixLQUFLLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLGlCQUFpQixLQUFLLFFBQVEsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3BELENBQUMsQ0FBQztBQWhCVyxRQUFBLHNCQUFzQiwwQkFnQmpDIn0=
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20261011120000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20261011120000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "email_message" drop constraint if exists "email_message_kind_check";`);
8
+ this.addSql(`alter table if exists "email_message" add constraint "email_message_kind_check" check("kind" in ('order.received', 'order.received.admin', 'order.shipped', 'order.canceled', 'order.return_requested', 'order.return_received', 'order.refunded', 'auth.password_reset', 'affiliate.consignment_report_due', 'affiliate.application_submitted.admin', 'user.invite', 'auth.verification', 'auth.login_code', 'system.credential_expiry.admin'));`);
9
+ }
10
+ async down() {
11
+ // The old check constraint rejects the kind, so its rows go first (their
12
+ // attempts reference them).
13
+ this.addSql(`delete from "email_attempt" where "message_id" in (select "id" from "email_message" where "kind" = 'system.credential_expiry.admin');`);
14
+ this.addSql(`delete from "email_message" where "kind" = 'system.credential_expiry.admin';`);
15
+ this.addSql(`alter table if exists "email_message" drop constraint if exists "email_message_kind_check";`);
16
+ this.addSql(`alter table if exists "email_message" add constraint "email_message_kind_check" check("kind" in ('order.received', 'order.received.admin', 'order.shipped', 'order.canceled', 'order.return_requested', 'order.return_received', 'order.refunded', 'auth.password_reset', 'affiliate.consignment_report_due', 'affiliate.application_submitted.admin', 'user.invite', 'auth.verification', 'auth.login_code'));`);
17
+ }
18
+ }
19
+ exports.Migration20261011120000 = Migration20261011120000;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjEwMTExMjAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYxMDExMTIwMDAwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyw2RkFBNkYsQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxNQUFNLENBQUMsbWJBQW1iLENBQUMsQ0FBQztJQUNuYyxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIseUVBQXlFO1FBQ3pFLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLHVJQUF1SSxDQUFDLENBQUM7UUFFckosSUFBSSxDQUFDLE1BQU0sQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxNQUFNLENBQUMsNkZBQTZGLENBQUMsQ0FBQztRQUUzRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlaQUFpWixDQUFDLENBQUM7SUFDamEsQ0FBQztDQUVGO0FBcEJELDBEQW9CQyJ9
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.smtpSettingsFallback = exports.toDeliverySettings = void 0;
4
+ const sender_1 = require("../../email/domain/sender");
5
+ const text = (values, key) => {
6
+ const value = values[key];
7
+ return typeof value === "string" ? value.trim() : "";
8
+ };
9
+ const notConfigured = (reason) => ({
10
+ kind: "not_configured",
11
+ reason,
12
+ });
13
+ /**
14
+ * Turns the resolved settings into a transport configuration. `allowInsecure`
15
+ * (development and tests) permits SMTP without encryption.
16
+ */
17
+ const toDeliverySettings = ({ configured, missing, values }, allowInsecure) => {
18
+ if (!configured) {
19
+ return notConfigured(`missing ${missing.join(", ")}`);
20
+ }
21
+ if (values.provider === "microsoft365") {
22
+ const mailbox = (0, sender_1.parseEmailSender)(text(values, "microsoft_mailbox"));
23
+ if (!mailbox || mailbox.name) {
24
+ return notConfigured("microsoft_mailbox is no e-mail address");
25
+ }
26
+ return {
27
+ kind: "microsoft365",
28
+ graph: {
29
+ clientId: text(values, "microsoft_client_id"),
30
+ clientSecret: String(values.microsoft_client_secret),
31
+ mailbox: mailbox.address,
32
+ tenantId: text(values, "microsoft_tenant_id"),
33
+ },
34
+ };
35
+ }
36
+ const sender = (0, sender_1.parseEmailSender)(text(values, "smtp_from"));
37
+ if (!sender) {
38
+ return notConfigured("smtp_from is no sender address");
39
+ }
40
+ const security = values.smtp_security;
41
+ if (security === "none" && !allowInsecure) {
42
+ return notConfigured("unencrypted SMTP is only allowed locally");
43
+ }
44
+ const user = text(values, "smtp_user");
45
+ const password = typeof values.smtp_password === "string" ? values.smtp_password : "";
46
+ return {
47
+ kind: "smtp",
48
+ smtp: {
49
+ from: (0, sender_1.formatEmailSender)(sender),
50
+ host: text(values, "smtp_host"),
51
+ password,
52
+ port: Number(values.smtp_port),
53
+ requireTls: security === "starttls",
54
+ secure: security === "tls",
55
+ user,
56
+ },
57
+ };
58
+ };
59
+ exports.toDeliverySettings = toDeliverySettings;
60
+ /**
61
+ * Settings fallback from a deprecated `smtp` provider option (a shop that
62
+ * still resolves its SMTP values in medusa-config): used for keys not stored
63
+ * in the Admin.
64
+ */
65
+ const smtpSettingsFallback = (smtp) => smtp && {
66
+ provider: "smtp",
67
+ smtp_from: smtp.from,
68
+ smtp_host: smtp.host,
69
+ smtp_password: smtp.password,
70
+ smtp_port: smtp.port,
71
+ smtp_security: smtp.secure ? "tls" : smtp.requireTls ? "starttls" : "none",
72
+ smtp_user: smtp.user,
73
+ };
74
+ exports.smtpSettingsFallback = smtpSettingsFallback;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcnktc2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3NtdHAvZGVsaXZlcnktc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWdGO0FBb0JoRixNQUFNLElBQUksR0FBRyxDQUFDLE1BQWMsRUFBRSxHQUFvQixFQUFVLEVBQUU7SUFDNUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLE1BQWMsRUFBb0IsRUFBRSxDQUFDLENBQUM7SUFDM0QsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUEyQyxFQUN4RSxhQUFzQixFQUNKLEVBQUU7SUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sYUFBYSxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFnQixFQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU8sYUFBYSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsY0FBYztZQUNwQixLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUM7Z0JBQzdDLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO2dCQUNwRCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDO2FBQzlDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHlCQUFnQixFQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ3RDLElBQUksUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sYUFBYSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQ1osT0FBTyxNQUFNLENBQUMsYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRTtZQUNKLElBQUksRUFBRSxJQUFBLDBCQUFpQixFQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7WUFDL0IsUUFBUTtZQUNSLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUM5QixVQUFVLEVBQUUsUUFBUSxLQUFLLFVBQVU7WUFDbkMsTUFBTSxFQUFFLFFBQVEsS0FBSyxLQUFLO1lBQzFCLElBQUk7U0FDTDtLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUEvQ1csUUFBQSxrQkFBa0Isc0JBK0M3QjtBQUVGOzs7O0dBSUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLElBQTJDLEVBQ1UsRUFBRSxDQUN2RCxJQUFJLElBQUk7SUFDTixRQUFRLEVBQUUsTUFBTTtJQUNoQixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUk7SUFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ3BCLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUTtJQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUk7SUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNO0lBQzFFLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtDQUNyQixDQUFDO0FBWFMsUUFBQSxvQkFBb0Isd0JBVzdCIn0=
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphTransport = exports.graphSendMailBody = exports.GraphDeliveryError = exports.GRAPH_MAX_REQUEST_BYTES = exports.GRAPH_TIMEOUTS = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const types_1 = require("./types");
6
+ exports.GRAPH_TIMEOUTS = {
7
+ send: 30_000,
8
+ token: 10_000,
9
+ };
10
+ /** Graph rejects a `sendMail` request body above 4 MB. */
11
+ exports.GRAPH_MAX_REQUEST_BYTES = 4 * 1024 * 1024;
12
+ /** A token is renewed this long before Microsoft's expiry. */
13
+ const TOKEN_RENEWAL_MARGIN_MS = 5 * 60_000;
14
+ /** A Graph failure reduced to the provider's safe sentinel. */
15
+ class GraphDeliveryError extends Error {
16
+ constructor(sentinel) {
17
+ super(sentinel);
18
+ this.sentinel = sentinel;
19
+ }
20
+ }
21
+ exports.GraphDeliveryError = GraphDeliveryError;
22
+ /** The request never left: the host could not be resolved or connected. */
23
+ const isConnectionFailure = (error) => {
24
+ const code = error?.cause?.code;
25
+ return (code === "ENOTFOUND" ||
26
+ code === "ECONNREFUSED" ||
27
+ code === "EAI_AGAIN" ||
28
+ code === "UND_ERR_CONNECT_TIMEOUT");
29
+ };
30
+ const sendFailure = (status) => {
31
+ if (status === 401 || status === 403) {
32
+ return types_1.SMTP_FAILURE_SENTINELS.authFailed;
33
+ }
34
+ if (status === 408 || status === 429 || status >= 500) {
35
+ return types_1.SMTP_FAILURE_SENTINELS.transientRejection;
36
+ }
37
+ return types_1.SMTP_FAILURE_SENTINELS.permanentRejection;
38
+ };
39
+ const recipient = (address) => ({ emailAddress: { address } });
40
+ /** The `sendMail` body: HTML only (Graph has one body), attachments base64. */
41
+ const graphSendMailBody = (message) => JSON.stringify({
42
+ message: {
43
+ attachments: (message.attachments ?? []).map((attachment) => ({
44
+ "@odata.type": "#microsoft.graph.fileAttachment",
45
+ contentBytes: attachment.content.toString("base64"),
46
+ contentType: attachment.contentType,
47
+ isInline: attachment.contentDisposition === "inline",
48
+ name: attachment.filename,
49
+ ...(attachment.cid ? { contentId: attachment.cid } : {}),
50
+ })),
51
+ body: { content: message.html, contentType: "HTML" },
52
+ subject: message.subject,
53
+ toRecipients: [recipient(message.to)],
54
+ },
55
+ saveToSentItems: true,
56
+ });
57
+ exports.graphSendMailBody = graphSendMailBody;
58
+ /**
59
+ * Sends through Microsoft Graph `POST /users/{mailbox}/sendMail` with an
60
+ * app-only token (client credentials). Tokens are cached per tenant, client
61
+ * and secret, so a changed secret never reuses an old token.
62
+ */
63
+ class GraphTransport {
64
+ constructor(fetch_, now = Date.now) {
65
+ this.fetch_ = fetch_;
66
+ this.now = now;
67
+ this.tokens = new Map();
68
+ }
69
+ async send(configuration, message) {
70
+ const body = (0, exports.graphSendMailBody)(message);
71
+ if (Buffer.byteLength(body) > exports.GRAPH_MAX_REQUEST_BYTES) {
72
+ throw new GraphDeliveryError(types_1.SMTP_FAILURE_SENTINELS.invalidContent);
73
+ }
74
+ const token = await this.token(configuration);
75
+ let response;
76
+ try {
77
+ response = await this.fetch_(`https://graph.microsoft.com/v1.0/users/${encodeURIComponent(configuration.mailbox)}/sendMail`, {
78
+ body,
79
+ headers: {
80
+ authorization: `Bearer ${token}`,
81
+ "content-type": "application/json",
82
+ },
83
+ method: "POST",
84
+ signal: AbortSignal.timeout(exports.GRAPH_TIMEOUTS.send),
85
+ });
86
+ }
87
+ catch (error) {
88
+ throw new GraphDeliveryError(isConnectionFailure(error)
89
+ ? types_1.SMTP_FAILURE_SENTINELS.connectionFailed
90
+ : types_1.SMTP_FAILURE_SENTINELS.outcomeUnknown);
91
+ }
92
+ if (response.status === 401) {
93
+ // A revoked or rotated secret: the next send fetches a new token.
94
+ this.tokens.delete(this.cacheKey(configuration));
95
+ }
96
+ if (!response.ok) {
97
+ throw new GraphDeliveryError(sendFailure(response.status));
98
+ }
99
+ }
100
+ async prepare(configuration) {
101
+ await this.token(configuration);
102
+ }
103
+ cacheKey({ clientId, clientSecret, tenantId }) {
104
+ return (0, node_crypto_1.createHash)("sha256")
105
+ .update(`${tenantId}\u0000${clientId}\u0000${clientSecret}`)
106
+ .digest("hex");
107
+ }
108
+ async token(configuration) {
109
+ const key = this.cacheKey(configuration);
110
+ const cached = this.tokens.get(key);
111
+ if (cached && cached.expiresAt > this.now()) {
112
+ return cached.value;
113
+ }
114
+ let response;
115
+ try {
116
+ response = await this.fetch_(`https://login.microsoftonline.com/${encodeURIComponent(configuration.tenantId)}/oauth2/v2.0/token`, {
117
+ body: new URLSearchParams({
118
+ client_id: configuration.clientId,
119
+ client_secret: configuration.clientSecret,
120
+ grant_type: "client_credentials",
121
+ scope: "https://graph.microsoft.com/.default",
122
+ }).toString(),
123
+ headers: { "content-type": "application/x-www-form-urlencoded" },
124
+ method: "POST",
125
+ signal: AbortSignal.timeout(exports.GRAPH_TIMEOUTS.token),
126
+ });
127
+ }
128
+ catch {
129
+ // Nothing was sent yet, so a failed token request is always safe to retry.
130
+ throw new GraphDeliveryError(types_1.SMTP_FAILURE_SENTINELS.connectionFailed);
131
+ }
132
+ if (!response.ok) {
133
+ throw new GraphDeliveryError(response.status === 429 || response.status >= 500
134
+ ? types_1.SMTP_FAILURE_SENTINELS.transientRejection
135
+ : types_1.SMTP_FAILURE_SENTINELS.authFailed);
136
+ }
137
+ const payload = (await response.json().catch(() => null));
138
+ const expiresIn = Number(payload?.expires_in);
139
+ if (typeof payload?.access_token !== "string" || !Number.isFinite(expiresIn)) {
140
+ throw new GraphDeliveryError(types_1.SMTP_FAILURE_SENTINELS.authFailed);
141
+ }
142
+ this.tokens.set(key, {
143
+ expiresAt: this.now() + expiresIn * 1000 - TOKEN_RENEWAL_MARGIN_MS,
144
+ value: payload.access_token,
145
+ });
146
+ return payload.access_token;
147
+ }
148
+ }
149
+ exports.GraphTransport = GraphTransport;
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtdHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zbXRwL2dyYXBoLXRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUM7QUFHekMsbUNBSWlCO0FBRUosUUFBQSxjQUFjLEdBQUc7SUFDNUIsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsTUFBTTtDQUNMLENBQUM7QUFFWCwwREFBMEQ7QUFDN0MsUUFBQSx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUV2RCw4REFBOEQ7QUFDOUQsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBYzNDLCtEQUErRDtBQUMvRCxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsWUFBcUIsUUFBNkI7UUFDaEQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBREcsYUFBUSxHQUFSLFFBQVEsQ0FBcUI7SUFFbEQsQ0FBQztDQUNGO0FBSkQsZ0RBSUM7QUFJRCwyRUFBMkU7QUFDM0UsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFO0lBQ3RELE1BQU0sSUFBSSxHQUFJLEtBQXdDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztJQUNwRSxPQUFPLENBQ0wsSUFBSSxLQUFLLFdBQVc7UUFDcEIsSUFBSSxLQUFLLGNBQWM7UUFDdkIsSUFBSSxLQUFLLFdBQVc7UUFDcEIsSUFBSSxLQUFLLHlCQUF5QixDQUNuQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFjLEVBQXVCLEVBQUU7SUFDMUQsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxPQUFPLDhCQUFzQixDQUFDLFVBQVUsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxNQUFNLEtBQUss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