@sixtyninecommerce/admin 0.10.0 → 0.12.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 (302) hide show
  1. package/README.md +5772 -118
  2. package/dist/auth/index.d.ts +7 -1
  3. package/dist/auth/index.js +8 -1
  4. package/dist/catalog/assets.d.ts +120 -8
  5. package/dist/catalog/assets.js +98 -12
  6. package/dist/catalog/collections.d.ts +279 -14
  7. package/dist/catalog/collections.js +246 -15
  8. package/dist/catalog/documents.d.ts +142 -0
  9. package/dist/catalog/documents.js +114 -0
  10. package/dist/catalog/index.d.ts +54 -6
  11. package/dist/catalog/index.js +10 -1
  12. package/dist/catalog/metadata.d.ts +244 -0
  13. package/dist/catalog/metadata.js +220 -0
  14. package/dist/catalog/products.d.ts +159 -19
  15. package/dist/catalog/products.js +88 -13
  16. package/dist/catalog/properties.d.ts +140 -14
  17. package/dist/catalog/properties.js +65 -1
  18. package/dist/catalog/recommendations.d.ts +288 -0
  19. package/dist/catalog/recommendations.js +237 -0
  20. package/dist/catalog/reviews.d.ts +381 -0
  21. package/dist/catalog/reviews.js +325 -0
  22. package/dist/catalog/types.d.ts +17 -1
  23. package/dist/catalog/types.js +10 -0
  24. package/dist/catalog/variant-find.d.ts +136 -0
  25. package/dist/catalog/variant-find.js +239 -0
  26. package/dist/catalog/variants.d.ts +293 -26
  27. package/dist/catalog/variants.js +164 -7
  28. package/dist/catalog/visibility.d.ts +38 -7
  29. package/dist/catalog/visibility.js +19 -1
  30. package/dist/client.d.ts +121 -9
  31. package/dist/client.js +53 -14
  32. package/dist/content/assets.d.ts +285 -0
  33. package/dist/content/assets.js +181 -0
  34. package/dist/content/forms.d.ts +332 -1
  35. package/dist/content/forms.js +140 -4
  36. package/dist/content/items.d.ts +292 -0
  37. package/dist/content/items.js +170 -0
  38. package/dist/content/menus.d.ts +254 -0
  39. package/dist/content/menus.js +70 -0
  40. package/dist/content/strings.d.ts +137 -0
  41. package/dist/content/strings.js +82 -0
  42. package/dist/content/types.d.ts +282 -0
  43. package/dist/content/types.js +100 -0
  44. package/dist/customers/age-verification.d.ts +66 -0
  45. package/dist/customers/age-verification.js +79 -0
  46. package/dist/customers/credit.d.ts +263 -0
  47. package/dist/customers/credit.js +244 -0
  48. package/dist/customers/delivery-preferences.d.ts +120 -0
  49. package/dist/customers/delivery-preferences.js +97 -0
  50. package/dist/customers/delivery-terms.d.ts +44 -0
  51. package/dist/customers/delivery-terms.js +32 -0
  52. package/dist/customers/groups.d.ts +207 -0
  53. package/dist/customers/groups.js +438 -0
  54. package/dist/customers/index.d.ts +462 -37
  55. package/dist/customers/index.js +317 -40
  56. package/dist/customers/invitation-status.d.ts +57 -0
  57. package/dist/customers/invitation-status.js +21 -0
  58. package/dist/customers/notes.d.ts +67 -0
  59. package/dist/customers/notes.js +51 -0
  60. package/dist/customers/notification-recipients.d.ts +97 -0
  61. package/dist/customers/notification-recipients.js +84 -0
  62. package/dist/customers/saved-lists.d.ts +42 -0
  63. package/dist/customers/saved-lists.js +61 -0
  64. package/dist/customers/vat.d.ts +83 -0
  65. package/dist/customers/vat.js +46 -0
  66. package/dist/customers/wire.d.ts +20 -0
  67. package/dist/customers/wire.js +35 -0
  68. package/dist/documents/ar.d.ts +307 -0
  69. package/dist/documents/ar.js +254 -0
  70. package/dist/documents/emails.d.ts +150 -0
  71. package/dist/documents/emails.js +220 -0
  72. package/dist/documents/index.d.ts +744 -21
  73. package/dist/documents/index.js +438 -24
  74. package/dist/documents/pdf.d.ts +2 -0
  75. package/dist/documents/pdf.js +11 -0
  76. package/dist/fulfillments/create.d.ts +167 -0
  77. package/dist/fulfillments/create.js +216 -0
  78. package/dist/fulfillments/index.d.ts +163 -11
  79. package/dist/fulfillments/index.js +135 -6
  80. package/dist/fulfillments/payment-policy.d.ts +64 -0
  81. package/dist/fulfillments/payment-policy.js +140 -0
  82. package/dist/fulfillments/warehouse.d.ts +724 -0
  83. package/dist/fulfillments/warehouse.js +914 -0
  84. package/dist/geo/index.d.ts +119 -0
  85. package/dist/geo/index.js +107 -0
  86. package/dist/index.d.ts +147 -39
  87. package/dist/index.js +51 -12
  88. package/dist/integrations/afas-actions.d.ts +234 -0
  89. package/dist/integrations/afas-actions.js +310 -0
  90. package/dist/integrations/afas-types.d.ts +483 -0
  91. package/dist/integrations/afas-types.js +5 -0
  92. package/dist/integrations/afas.d.ts +234 -0
  93. package/dist/integrations/afas.js +290 -0
  94. package/dist/integrations/connections.d.ts +103 -0
  95. package/dist/integrations/connections.js +55 -0
  96. package/dist/integrations/esp.d.ts +313 -0
  97. package/dist/integrations/esp.js +169 -0
  98. package/dist/integrations/exact-online-types.d.ts +965 -0
  99. package/dist/integrations/exact-online-types.js +6 -0
  100. package/dist/integrations/exact-online.d.ts +784 -0
  101. package/dist/integrations/exact-online.js +1089 -0
  102. package/dist/integrations/index.d.ts +44 -3
  103. package/dist/integrations/index.js +23 -3
  104. package/dist/integrations/pipeline-discoveries.d.ts +65 -0
  105. package/dist/integrations/pipeline-discoveries.js +65 -0
  106. package/dist/integrations/pipeline-keys.d.ts +13 -0
  107. package/dist/integrations/pipeline-keys.js +22 -0
  108. package/dist/integrations/pipeline-runs.d.ts +119 -0
  109. package/dist/integrations/pipeline-runs.js +87 -0
  110. package/dist/integrations/pipelines.d.ts +87 -15
  111. package/dist/integrations/pipelines.js +41 -22
  112. package/dist/integrations/price-import.d.ts +223 -0
  113. package/dist/integrations/price-import.js +124 -0
  114. package/dist/integrations/types.d.ts +367 -3
  115. package/dist/integrations/types.js +4 -3
  116. package/dist/locations/index.d.ts +66 -0
  117. package/dist/locations/index.js +31 -0
  118. package/dist/meta/index.d.ts +172 -0
  119. package/dist/metafields/index.d.ts +8 -1
  120. package/dist/metafields/index.js +10 -0
  121. package/dist/orders/cancel-with-money.d.ts +237 -0
  122. package/dist/orders/cancel-with-money.js +155 -0
  123. package/dist/orders/commit-edit.d.ts +23 -1
  124. package/dist/orders/commit-edit.js +19 -2
  125. package/dist/orders/deposit-policy.d.ts +3 -1
  126. package/dist/orders/drafts.d.ts +800 -0
  127. package/dist/orders/drafts.js +771 -0
  128. package/dist/orders/fields.d.ts +245 -0
  129. package/dist/orders/fields.js +188 -0
  130. package/dist/orders/get.d.ts +29 -19
  131. package/dist/orders/get.js +17 -8
  132. package/dist/orders/index.d.ts +66 -15
  133. package/dist/orders/index.js +25 -2
  134. package/dist/orders/lifecycle.d.ts +128 -0
  135. package/dist/orders/lifecycle.js +158 -0
  136. package/dist/orders/line-price-preview.d.ts +7 -2
  137. package/dist/orders/list.d.ts +243 -0
  138. package/dist/orders/list.js +487 -0
  139. package/dist/orders/manual-discounts.d.ts +13 -5
  140. package/dist/orders/manual-pricing.d.ts +5 -0
  141. package/dist/orders/money-view.d.ts +149 -0
  142. package/dist/orders/money-view.js +99 -0
  143. package/dist/orders/order-entry.d.ts +20 -7
  144. package/dist/orders/plan-edit.d.ts +34 -2
  145. package/dist/orders/plan-edit.js +112 -11
  146. package/dist/orders/settings.d.ts +201 -0
  147. package/dist/orders/settings.js +325 -0
  148. package/dist/orders/status.d.ts +159 -13
  149. package/dist/orders/status.js +21 -0
  150. package/dist/orders/surcharges.d.ts +20 -1
  151. package/dist/orders/surcharges.js +37 -11
  152. package/dist/payments/account-credit.d.ts +46 -0
  153. package/dist/payments/account-credit.js +42 -0
  154. package/dist/payments/ar.d.ts +292 -0
  155. package/dist/payments/ar.js +223 -0
  156. package/dist/payments/connected-account.d.ts +47 -0
  157. package/dist/payments/connected-account.js +61 -0
  158. package/dist/payments/credit-noted-fields.d.ts +19 -0
  159. package/dist/payments/credit-noted-fields.js +69 -0
  160. package/dist/payments/customer-consent.d.ts +30 -0
  161. package/dist/payments/customer-consent.js +49 -0
  162. package/dist/payments/index.d.ts +340 -19
  163. package/dist/payments/index.js +151 -1
  164. package/dist/payments/methods.d.ts +303 -8
  165. package/dist/payments/methods.js +337 -7
  166. package/dist/payments/mollie-methods.d.ts +159 -0
  167. package/dist/payments/mollie-methods.js +141 -0
  168. package/dist/payments/payment-links.d.ts +180 -0
  169. package/dist/payments/payment-links.js +97 -0
  170. package/dist/payments/provider-keys.d.ts +150 -0
  171. package/dist/payments/provider-keys.js +118 -0
  172. package/dist/payments/providers.d.ts +86 -11
  173. package/dist/payments/providers.js +29 -0
  174. package/dist/payments/requests.d.ts +147 -0
  175. package/dist/payments/requests.js +93 -0
  176. package/dist/payments/store-credit-fields.d.ts +15 -0
  177. package/dist/payments/store-credit-fields.js +51 -0
  178. package/dist/pickups/index.d.ts +106 -0
  179. package/dist/pickups/index.js +108 -0
  180. package/dist/platform/channels.d.ts +132 -0
  181. package/dist/platform/channels.js +128 -0
  182. package/dist/platform/email-gateways.d.ts +165 -0
  183. package/dist/platform/email-gateways.js +78 -0
  184. package/dist/platform/geo.d.ts +123 -0
  185. package/dist/platform/geo.js +144 -0
  186. package/dist/platform/tax.d.ts +162 -0
  187. package/dist/platform/tax.js +169 -0
  188. package/dist/pos/anomalies.d.ts +158 -0
  189. package/dist/pos/anomalies.js +64 -0
  190. package/dist/pos/assisted-selling.d.ts +79 -0
  191. package/dist/pos/assisted-selling.js +38 -0
  192. package/dist/pos/exchanges.d.ts +108 -0
  193. package/dist/pos/exchanges.js +22 -0
  194. package/dist/pos/gift-cards.d.ts +135 -0
  195. package/dist/pos/gift-cards.js +47 -0
  196. package/dist/pos/index.d.ts +2370 -58
  197. package/dist/pos/index.js +854 -7
  198. package/dist/pos/no-receipt.d.ts +94 -0
  199. package/dist/pos/no-receipt.js +25 -0
  200. package/dist/pos/offline-sales.d.ts +228 -0
  201. package/dist/pos/offline-sales.js +170 -0
  202. package/dist/pos/pay-by-link.d.ts +143 -0
  203. package/dist/pos/pay-by-link.js +57 -0
  204. package/dist/pos/quick-keys.d.ts +103 -0
  205. package/dist/pos/quick-keys.js +45 -0
  206. package/dist/pos/reports.d.ts +360 -0
  207. package/dist/pos/reports.js +62 -0
  208. package/dist/pos/returns.d.ts +244 -0
  209. package/dist/pos/returns.js +83 -0
  210. package/dist/pricing/bulk-coupons.d.ts +139 -0
  211. package/dist/pricing/bulk-coupons.js +112 -0
  212. package/dist/pricing/index.d.ts +174 -4
  213. package/dist/pricing/index.js +174 -1
  214. package/dist/pricing/price-lists.d.ts +606 -0
  215. package/dist/pricing/price-lists.js +600 -0
  216. package/dist/purchasing/alerts.d.ts +104 -0
  217. package/dist/purchasing/alerts.js +88 -0
  218. package/dist/purchasing/backorders.d.ts +61 -0
  219. package/dist/purchasing/backorders.js +92 -0
  220. package/dist/purchasing/cost.d.ts +110 -0
  221. package/dist/purchasing/cost.js +86 -0
  222. package/dist/purchasing/index.d.ts +54 -0
  223. package/dist/purchasing/index.js +24 -0
  224. package/dist/purchasing/links.d.ts +263 -0
  225. package/dist/purchasing/links.js +192 -0
  226. package/dist/purchasing/purchase-orders.d.ts +551 -0
  227. package/dist/purchasing/purchase-orders.js +491 -0
  228. package/dist/purchasing/receipts.d.ts +396 -0
  229. package/dist/purchasing/receipts.js +287 -0
  230. package/dist/purchasing/replenishment.d.ts +281 -0
  231. package/dist/purchasing/replenishment.js +240 -0
  232. package/dist/purchasing/returns.d.ts +273 -0
  233. package/dist/purchasing/returns.js +229 -0
  234. package/dist/purchasing/settings.d.ts +152 -0
  235. package/dist/purchasing/settings.js +181 -0
  236. package/dist/purchasing/suppliers.d.ts +476 -0
  237. package/dist/purchasing/suppliers.js +438 -0
  238. package/dist/quotes/index.d.ts +518 -0
  239. package/dist/quotes/index.js +439 -0
  240. package/dist/reports/index.d.ts +71 -8
  241. package/dist/reports/index.js +74 -11
  242. package/dist/returns/index.d.ts +675 -21
  243. package/dist/returns/index.js +756 -11
  244. package/dist/search/index.d.ts +76 -1
  245. package/dist/search/index.js +63 -0
  246. package/dist/seo/config.d.ts +128 -0
  247. package/dist/seo/config.js +95 -0
  248. package/dist/seo/redirects.d.ts +125 -0
  249. package/dist/seo/redirects.js +60 -1
  250. package/dist/seo/settings.d.ts +147 -0
  251. package/dist/seo/settings.js +209 -0
  252. package/dist/shipping/definitions.d.ts +29 -0
  253. package/dist/shipping/definitions.js +47 -0
  254. package/dist/shipping/fulfillment-profiles.d.ts +174 -0
  255. package/dist/shipping/fulfillment-profiles.js +104 -0
  256. package/dist/shipping/hendriks.d.ts +97 -0
  257. package/dist/shipping/hendriks.js +50 -0
  258. package/dist/shipping/index.d.ts +54 -0
  259. package/dist/shipping/index.js +27 -0
  260. package/dist/shipping/methods.d.ts +205 -0
  261. package/dist/shipping/methods.js +240 -0
  262. package/dist/shipping/myparcel.d.ts +668 -0
  263. package/dist/shipping/myparcel.js +466 -0
  264. package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
  265. package/dist/shipping/parcel-rule.d.ts +6 -5
  266. package/dist/shipping/parcel-rule.js +21 -23
  267. package/dist/shipping/rate-tables.d.ts +324 -0
  268. package/dist/shipping/rate-tables.js +390 -0
  269. package/dist/shipping/ship-to-countries.d.ts +75 -0
  270. package/dist/shipping/ship-to-countries.js +47 -0
  271. package/dist/stock/by-location.d.ts +86 -0
  272. package/dist/stock/by-location.js +94 -0
  273. package/dist/stock/index.d.ts +18 -4
  274. package/dist/stock/index.js +7 -0
  275. package/dist/stock/locations.d.ts +144 -0
  276. package/dist/stock/locations.js +168 -0
  277. package/dist/stock/settings.d.ts +106 -0
  278. package/dist/stock/settings.js +103 -0
  279. package/dist/stock/transfers.d.ts +386 -52
  280. package/dist/stock/transfers.js +222 -17
  281. package/dist/stored-value/index.d.ts +312 -11
  282. package/dist/stored-value/index.js +223 -4
  283. package/dist/subscriptions/index.d.ts +682 -0
  284. package/dist/subscriptions/index.js +815 -0
  285. package/dist/tax/display-policy.d.ts +105 -0
  286. package/dist/tax/display-policy.js +84 -0
  287. package/dist/tax/index.d.ts +79 -1
  288. package/dist/tax/index.js +52 -0
  289. package/dist/tenant/email-style.d.ts +102 -0
  290. package/dist/tenant/email-style.js +72 -0
  291. package/dist/tenant/email-templates.d.ts +287 -0
  292. package/dist/tenant/email-templates.js +271 -0
  293. package/dist/tenant/notifications.d.ts +23 -17
  294. package/dist/tenant/settings-sources.d.ts +1 -1
  295. package/dist/tenant/time-zone.d.ts +17 -0
  296. package/dist/tenant/time-zone.js +11 -0
  297. package/dist/types.d.ts +50 -3
  298. package/dist/users/index.d.ts +3 -0
  299. package/dist/users/index.js +2 -0
  300. package/dist/users/warehouses.d.ts +50 -0
  301. package/dist/users/warehouses.js +51 -0
  302. package/package.json +2 -2
@@ -0,0 +1,466 @@
1
+ import { errorForStatus, errorFromErrorResult, isErrorResult, ValidationError, } from '@sixtyninecommerce/core';
2
+ import { decodeBase64, MYPARCEL_LABEL_TIMEOUT_MS, } from '../fulfillments/index.js';
3
+ const CONFIG_FIELDS = /* GraphQL */ `
4
+ id
5
+ channelId
6
+ hasApiKey
7
+ maskedApiKey
8
+ maskedWebhookSecret
9
+ defaultLabelFormat
10
+ enabled
11
+ `;
12
+ /** The union answer of every config write: the set-up, or a refusal. */
13
+ const CONFIG_RESULT = /* GraphQL */ `
14
+ __typename
15
+ ... on MyparcelConfig { ${CONFIG_FIELDS} }
16
+ ... on ErrorResult { errorCode message }
17
+ `;
18
+ export const MYPARCEL_CONFIG_QUERY = /* GraphQL */ `
19
+ query MyparcelConfig {
20
+ myparcelConfig { ${CONFIG_FIELDS} }
21
+ }
22
+ `;
23
+ export const UPDATE_MYPARCEL_CONFIG_MUTATION = /* GraphQL */ `
24
+ mutation UpdateMyparcelConfig($input: MyparcelConfigInput!) {
25
+ updateMyparcelConfig(input: $input) {
26
+ ${CONFIG_RESULT}
27
+ ... on MyparcelValidationError { errors }
28
+ }
29
+ }
30
+ `;
31
+ export const UPDATE_MYPARCEL_LABEL_FORMAT_MUTATION = /* GraphQL */ `
32
+ mutation UpdateMyparcelLabelFormat($input: MyparcelLabelFormatInput!) {
33
+ updateMyparcelLabelFormat(input: $input) { ${CONFIG_RESULT} }
34
+ }
35
+ `;
36
+ export const SET_MYPARCEL_ENABLED_MUTATION = /* GraphQL */ `
37
+ mutation SetMyparcelEnabled($enabled: Boolean!) {
38
+ setMyparcelEnabled(enabled: $enabled) {
39
+ ${CONFIG_RESULT}
40
+ ... on MyparcelValidationError { errors }
41
+ }
42
+ }
43
+ `;
44
+ export const REGENERATE_MYPARCEL_WEBHOOK_SECRET_MUTATION = /* GraphQL */ `
45
+ mutation RegenerateMyparcelWebhookSecret {
46
+ regenerateMyparcelWebhookSecret { ${CONFIG_RESULT} }
47
+ }
48
+ `;
49
+ export const MYPARCEL_CARRIERS_QUERY = /* GraphQL */ `
50
+ query MyparcelCarriers {
51
+ myparcelCarriers {
52
+ id
53
+ name
54
+ human
55
+ meta { logoSvg logoPng }
56
+ }
57
+ }
58
+ `;
59
+ const SENDER_FIELDS = /* GraphQL */ `
60
+ id
61
+ name
62
+ address {
63
+ streetLine1
64
+ streetLine2
65
+ city
66
+ postalCode
67
+ province
68
+ countryCode
69
+ phoneNumber
70
+ contactName
71
+ company
72
+ }
73
+ isDefaultSender
74
+ isResolvable
75
+ `;
76
+ export const MYPARCEL_SENDERS_QUERY = /* GraphQL */ `
77
+ query MyparcelSenderStockLocations {
78
+ myparcelSenderStockLocations { ${SENDER_FIELDS} }
79
+ }
80
+ `;
81
+ export const SET_MYPARCEL_SENDER_MUTATION = /* GraphQL */ `
82
+ mutation SetStockLocationSender($input: MyparcelSetStockLocationSenderInput!) {
83
+ setStockLocationSender(input: $input) {
84
+ __typename
85
+ ... on MyparcelSenderStockLocationSummary { ${SENDER_FIELDS} }
86
+ ... on ErrorResult { errorCode message }
87
+ ... on MyparcelInvalidSenderError { fields }
88
+ }
89
+ }
90
+ `;
91
+ export const MYPARCEL_SHIPMENT_QUERY = /* GraphQL */ `
92
+ query MyparcelShipment($shipmentId: Int!) {
93
+ myparcelShipment(shipmentId: $shipmentId) {
94
+ id
95
+ referenceIdentifier
96
+ barcode
97
+ status
98
+ carrierId
99
+ created
100
+ modified
101
+ linkConsumerPortal
102
+ }
103
+ }
104
+ `;
105
+ /** Readiness only: the engine answers no link (it would outlive every check made on it). */
106
+ export const MYPARCEL_LABEL_STATUS_QUERY = /* GraphQL */ `
107
+ query MyparcelLabelStatus($shipmentIds: [Int!]!, $format: MyparcelLabelFormatEnum!) {
108
+ myparcelShipmentLabelUrl(shipmentIds: $shipmentIds, format: $format) {
109
+ status
110
+ }
111
+ }
112
+ `;
113
+ export const MYPARCEL_SHIPMENT_LABEL_MUTATION = /* GraphQL */ `
114
+ mutation MyparcelShipmentLabel($shipmentId: Int!, $format: MyparcelLabelFormatEnum!) {
115
+ getMyparcelLabel(shipmentId: $shipmentId, format: $format) {
116
+ format
117
+ base64
118
+ contentType
119
+ filename
120
+ }
121
+ }
122
+ `;
123
+ export const REQUEST_MYPARCEL_LABEL_MUTATION = /* GraphQL */ `
124
+ mutation RequestMyparcelLabel($input: MyparcelRequestLabelInput!) {
125
+ requestMyparcelLabel(input: $input) {
126
+ __typename
127
+ ... on MyparcelLabelResult { status }
128
+ ... on ErrorResult { errorCode message }
129
+ ... on MyparcelValidationError { errors }
130
+ }
131
+ }
132
+ `;
133
+ export const MYPARCEL_CARRIER_CAPABILITIES_QUERY = /* GraphQL */ `
134
+ query MyparcelCarrierCapabilities {
135
+ myparcelCarrierCapabilities {
136
+ carrierId
137
+ name
138
+ packageTypes
139
+ deliveryTypes
140
+ countries
141
+ supportedOptions
142
+ supportsPickup
143
+ constraints
144
+ }
145
+ }
146
+ `;
147
+ export const MYPARCEL_DELIVERY_OPTIONS_QUERY = /* GraphQL */ `
148
+ query MyparcelAdminDeliveryOptions($input: MyparcelAdminDeliveryOptionsInput!) {
149
+ myparcelAdminDeliveryOptions(input: $input) {
150
+ __typename
151
+ ... on MyparcelAdminDeliveryOptions {
152
+ deliveryOptions {
153
+ deliveryType
154
+ date
155
+ startTime
156
+ endTime
157
+ price { amount currency }
158
+ }
159
+ pickupOptions {
160
+ locationCode
161
+ locationName
162
+ street
163
+ number
164
+ numberSuffix
165
+ postalCode
166
+ city
167
+ countryCode
168
+ carrierId
169
+ distance
170
+ }
171
+ }
172
+ ... on ErrorResult { errorCode message }
173
+ ... on MyparcelValidationError { errors }
174
+ }
175
+ }
176
+ `;
177
+ /**
178
+ * Every member that names fields carries them here, so `myparcelRefusal` can put each in
179
+ * `details[]`. Two members share the `fields` name with one type, which GraphQL allows.
180
+ */
181
+ const SHIPMENT_REFUSAL_FIELDS = /* GraphQL */ `
182
+ ... on ErrorResult { errorCode message }
183
+ ... on MyparcelValidationError { errors }
184
+ ... on MyparcelInvalidRecipientError { missingFields }
185
+ ... on MyparcelInvalidSenderError { fields }
186
+ ... on MyparcelPickupLocationInvalidError { fields }
187
+ `;
188
+ export const RECREATE_MYPARCEL_SHIPMENT_MUTATION = /* GraphQL */ `
189
+ mutation RecreateMyparcelShipment($input: MyparcelRecreateShipmentInput!) {
190
+ recreateMyparcelShipment(input: $input) {
191
+ __typename
192
+ ... on MyparcelShipmentMutationResult { shipmentId labelFormat }
193
+ ${SHIPMENT_REFUSAL_FIELDS}
194
+ }
195
+ }
196
+ `;
197
+ export const IMPORT_MYPARCEL_SHIPMENT_MUTATION = /* GraphQL */ `
198
+ mutation ImportMyparcelShipment($input: MyparcelImportShipmentInput!) {
199
+ importMyparcelShipment(input: $input) {
200
+ __typename
201
+ ... on MyparcelShipmentMutationResult { shipmentId labelFormat }
202
+ ... on ErrorResult { errorCode message }
203
+ ... on MyparcelValidationError { errors }
204
+ }
205
+ }
206
+ `;
207
+ export const CREATE_MYPARCEL_RETURN_MUTATION = /* GraphQL */ `
208
+ mutation CreateMyparcelReturnShipment($input: MyparcelReturnShipmentInput!) {
209
+ createMyparcelReturnShipment(input: $input) {
210
+ __typename
211
+ ... on MyparcelReturnShipmentResult { shipmentId }
212
+ ... on ErrorResult { errorCode message }
213
+ ... on MyparcelValidationError { errors }
214
+ }
215
+ }
216
+ `;
217
+ /** `updateMyparcelConfig` with an empty key answers this member: the set-up is gone. */
218
+ const NOT_CONFIGURED = 'MYPARCEL_NOT_CONFIGURED_ERROR';
219
+ /**
220
+ * A refusal member as its error class, by core's `errorFromErrorResult`. The field names a member
221
+ * carries (`MyparcelInvalidSenderError.fields`, `MyparcelPickupLocationInvalidError.fields`,
222
+ * `MyparcelValidationError.errors`, `MyparcelInvalidRecipientError.missingFields`) ride
223
+ * `details[]`, one per field, so a form can mark each without matching the sentence.
224
+ */
225
+ export function myparcelRefusal(result) {
226
+ const base = errorFromErrorResult(result);
227
+ const named = Array.isArray(result.fields)
228
+ ? result.fields
229
+ : Array.isArray(result.errors)
230
+ ? result.errors
231
+ : Array.isArray(result.missingFields)
232
+ ? result.missingFields
233
+ : [];
234
+ const details = named
235
+ .filter((field) => typeof field === 'string' && field.trim() !== '')
236
+ .map((field) => ({ field, code: base.code, message: base.message }));
237
+ if (details.length === 0)
238
+ return base;
239
+ return errorForStatus(base.status, {
240
+ code: base.code,
241
+ message: base.message,
242
+ service: 'vendure',
243
+ details,
244
+ });
245
+ }
246
+ function settled(answer) {
247
+ if (isErrorResult(answer))
248
+ throw myparcelRefusal(answer);
249
+ const { __typename: _typename, ...rest } = answer;
250
+ return rest;
251
+ }
252
+ const LABEL_FORMATS = new Set(['A4', 'A6']);
253
+ function invalidInput(code, field, message) {
254
+ return new ValidationError({
255
+ code,
256
+ message,
257
+ status: 400,
258
+ service: 'vendure',
259
+ details: [{ field, code, message }],
260
+ });
261
+ }
262
+ const LABEL_INPUT_INVALID = 'MYPARCEL_LABEL_INPUT_INVALID';
263
+ /** MyParcel's ids are GraphQL `Int`s: anything else would fail the document, uncoded. */
264
+ function isShipmentId(value) {
265
+ return typeof value === 'number' && Number.isInteger(value) && value > 0 && value <= 2 ** 31 - 1;
266
+ }
267
+ function assertShipmentId(id, field, code) {
268
+ if (!isShipmentId(id)) {
269
+ throw invalidInput(code, field, `A MyParcel shipment id is a positive whole number; got ${JSON.stringify(id)}.`);
270
+ }
271
+ }
272
+ /** Refused before any request: the engine's enum would refuse it, uncoded. */
273
+ function assertLabelFormat(format) {
274
+ if (!LABEL_FORMATS.has(format)) {
275
+ throw invalidInput(LABEL_INPUT_INVALID, 'format', `format must be 'A4' or 'A6'; got ${JSON.stringify(format)}.`);
276
+ }
277
+ }
278
+ const INVALID_INPUT = 'INVALID_INPUT';
279
+ function assertFulfillmentId(id) {
280
+ if (typeof id !== 'string' || id.trim() === '') {
281
+ throw invalidInput(INVALID_INPUT, 'fulfillmentId', 'A fulfillment id is required.');
282
+ }
283
+ }
284
+ /** A non-blank string, trimmed; refused before any request otherwise. */
285
+ function requiredText(value, field) {
286
+ const text = typeof value === 'string' ? value.trim() : '';
287
+ if (text === '')
288
+ throw invalidInput(INVALID_INPUT, field, `${field} is required.`);
289
+ return text;
290
+ }
291
+ /** The handler arguments as the wire takes them; anything else would fail the document uncoded. */
292
+ function handlerArgumentsOf(raw) {
293
+ if (!Array.isArray(raw)) {
294
+ throw invalidInput(INVALID_INPUT, 'handlerArguments', 'handlerArguments must be a list of { name, value } strings.');
295
+ }
296
+ return raw.map((entry, index) => {
297
+ const { name, value } = (entry ?? {});
298
+ if (typeof name !== 'string' || name.trim() === '' || typeof value !== 'string') {
299
+ throw invalidInput(INVALID_INPUT, `handlerArguments[${String(index)}]`, 'Each handler argument is a { name, value } pair of strings, with a name.');
300
+ }
301
+ return { name, value };
302
+ });
303
+ }
304
+ /** `ready` only when the engine says so: any other answer is a label still being made. */
305
+ function readiness(status) {
306
+ return { status: status === 'ready' ? 'ready' : 'pending' };
307
+ }
308
+ export function createMyparcelModule(transport) {
309
+ const gql = (query, variables, options) => transport.graphql({ api: 'admin', query, variables }, options);
310
+ return {
311
+ config: {
312
+ async get(options) {
313
+ const data = await gql(MYPARCEL_CONFIG_QUERY, {}, options);
314
+ return data.myparcelConfig ?? null;
315
+ },
316
+ async update(input, options) {
317
+ const apiKey = typeof input?.apiKey === 'string' ? input.apiKey.trim() : '';
318
+ if (apiKey === '') {
319
+ // Never quotes the argument: a key padded with whitespace must not reach a log.
320
+ throw new TypeError('config.update needs a MyParcel API key; remove the stored one with config.remove().');
321
+ }
322
+ const data = await gql(UPDATE_MYPARCEL_CONFIG_MUTATION, { input: { apiKey } }, options);
323
+ return settled(data.updateMyparcelConfig);
324
+ },
325
+ async remove(options) {
326
+ // The wire's removal is an empty key, answered by the not-configured member.
327
+ const data = await gql(UPDATE_MYPARCEL_CONFIG_MUTATION, { input: { apiKey: '' } }, options);
328
+ const answer = data.updateMyparcelConfig;
329
+ if (isErrorResult(answer) && answer.errorCode === NOT_CONFIGURED)
330
+ return;
331
+ if (isErrorResult(answer))
332
+ throw myparcelRefusal(answer);
333
+ // An engine that answered a set-up kept it: never report that as removed.
334
+ throw new Error('MyParcel answered the set-up instead of removing it; nothing was removed.');
335
+ },
336
+ async setLabelFormat(format, options) {
337
+ const data = await gql(UPDATE_MYPARCEL_LABEL_FORMAT_MUTATION, { input: { format } }, options);
338
+ return settled(data.updateMyparcelLabelFormat);
339
+ },
340
+ async setEnabled(enabled, options) {
341
+ const data = await gql(SET_MYPARCEL_ENABLED_MUTATION, { enabled }, options);
342
+ return settled(data.setMyparcelEnabled);
343
+ },
344
+ async regenerateWebhookSecret(options) {
345
+ const data = await gql(REGENERATE_MYPARCEL_WEBHOOK_SECRET_MUTATION, {}, options);
346
+ return settled(data.regenerateMyparcelWebhookSecret);
347
+ },
348
+ },
349
+ async carriers(options) {
350
+ const data = await gql(MYPARCEL_CARRIERS_QUERY, {}, options);
351
+ return data.myparcelCarriers;
352
+ },
353
+ async carrierCapabilities(options) {
354
+ const data = await gql(MYPARCEL_CARRIER_CAPABILITIES_QUERY, {}, options);
355
+ return data.myparcelCarrierCapabilities;
356
+ },
357
+ async deliveryOptions(input, options) {
358
+ const postalCode = requiredText(input?.postalCode, 'postalCode');
359
+ const data = await gql(MYPARCEL_DELIVERY_OPTIONS_QUERY, { input: { ...input, postalCode } }, options);
360
+ const { deliveryOptions, pickupOptions } = settled(data.myparcelAdminDeliveryOptions);
361
+ return { deliveryOptions, pickupOptions };
362
+ },
363
+ senders: {
364
+ async list(options) {
365
+ const data = await gql(MYPARCEL_SENDERS_QUERY, {}, options);
366
+ return data.myparcelSenderStockLocations;
367
+ },
368
+ async set(input, options) {
369
+ const data = await gql(SET_MYPARCEL_SENDER_MUTATION, { input }, options);
370
+ return settled(data.setStockLocationSender);
371
+ },
372
+ },
373
+ shipments: {
374
+ async get(shipmentId, options) {
375
+ assertShipmentId(shipmentId, 'shipmentId', 'INVALID_INPUT');
376
+ const data = await gql(MYPARCEL_SHIPMENT_QUERY, { shipmentId }, options);
377
+ const shipment = data.myparcelShipment;
378
+ if (!shipment)
379
+ return null;
380
+ return {
381
+ id: shipment.id,
382
+ referenceIdentifier: shipment.referenceIdentifier ?? null,
383
+ barcode: shipment.barcode ?? null,
384
+ status: shipment.status,
385
+ carrierId: shipment.carrierId,
386
+ created: shipment.created,
387
+ modified: shipment.modified,
388
+ linkConsumerPortal: shipment.linkConsumerPortal ?? null,
389
+ };
390
+ },
391
+ async recreate(input, options) {
392
+ assertFulfillmentId(input?.fulfillmentId);
393
+ const handlerArguments = handlerArgumentsOf(input.handlerArguments);
394
+ const data = await gql(RECREATE_MYPARCEL_SHIPMENT_MUTATION, { input: { fulfillmentId: input.fulfillmentId, handlerArguments } }, options);
395
+ const { shipmentId, labelFormat } = settled(data.recreateMyparcelShipment);
396
+ return { shipmentId, labelFormat };
397
+ },
398
+ async import(input, options) {
399
+ assertFulfillmentId(input?.fulfillmentId);
400
+ assertShipmentId(input.shipmentId, 'shipmentId', INVALID_INPUT);
401
+ const data = await gql(IMPORT_MYPARCEL_SHIPMENT_MUTATION, { input: { fulfillmentId: input.fulfillmentId, shipmentId: input.shipmentId } }, options);
402
+ const { shipmentId, labelFormat } = settled(data.importMyparcelShipment);
403
+ return { shipmentId, labelFormat };
404
+ },
405
+ },
406
+ returns: {
407
+ async create(input, options) {
408
+ assertShipmentId(input?.parentShipmentId, 'parentShipmentId', INVALID_INPUT);
409
+ if (!isShipmentId(input.carrier)) {
410
+ throw invalidInput(INVALID_INPUT, 'carrier', `A MyParcel carrier id is a positive whole number; got ${JSON.stringify(input.carrier)}.`);
411
+ }
412
+ const name = requiredText(input.name, 'name');
413
+ const email = requiredText(input.email, 'email');
414
+ const data = await gql(CREATE_MYPARCEL_RETURN_MUTATION, {
415
+ input: {
416
+ parentShipmentId: input.parentShipmentId,
417
+ carrier: input.carrier,
418
+ name,
419
+ email,
420
+ },
421
+ }, options);
422
+ return { shipmentId: settled(data.createMyparcelReturnShipment).shipmentId };
423
+ },
424
+ },
425
+ labels: {
426
+ async status(shipmentIds, format, options) {
427
+ const ids = Array.isArray(shipmentIds) ? [...shipmentIds] : [];
428
+ if (ids.length === 0) {
429
+ throw invalidInput(LABEL_INPUT_INVALID, 'shipmentIds', 'Name at least one shipment.');
430
+ }
431
+ for (const [index, id] of ids.entries()) {
432
+ assertShipmentId(id, `shipmentIds[${String(index)}]`, LABEL_INPUT_INVALID);
433
+ }
434
+ assertLabelFormat(format);
435
+ const data = await gql(MYPARCEL_LABEL_STATUS_QUERY, { shipmentIds: ids, format },
436
+ // The engine retries a slow MyParcel on this read as on the download.
437
+ { timeoutMs: MYPARCEL_LABEL_TIMEOUT_MS, ...options });
438
+ return readiness(data.myparcelShipmentLabelUrl?.status);
439
+ },
440
+ async download(shipmentId, format, options) {
441
+ assertShipmentId(shipmentId, 'shipmentId', LABEL_INPUT_INVALID);
442
+ assertLabelFormat(format);
443
+ const data = await gql(MYPARCEL_SHIPMENT_LABEL_MUTATION, { shipmentId, format }, { timeoutMs: MYPARCEL_LABEL_TIMEOUT_MS, ...options });
444
+ const { base64, ...document } = data.getMyparcelLabel;
445
+ return {
446
+ format: document.format,
447
+ contentType: document.contentType,
448
+ filename: document.filename,
449
+ bytes: decodeBase64(base64),
450
+ };
451
+ },
452
+ async request(input, options) {
453
+ const fulfillmentId = input?.fulfillmentId;
454
+ if (typeof fulfillmentId !== 'string' || fulfillmentId.trim() === '') {
455
+ throw invalidInput(LABEL_INPUT_INVALID, 'fulfillmentId', 'A fulfillment id is required.');
456
+ }
457
+ assertShipmentId(input.shipmentId, 'shipmentId', LABEL_INPUT_INVALID);
458
+ assertLabelFormat(input.format);
459
+ const data = await gql(REQUEST_MYPARCEL_LABEL_MUTATION, {
460
+ input: { fulfillmentId, shipmentId: input.shipmentId, format: input.format },
461
+ }, options);
462
+ return readiness(settled(data.requestMyparcelLabel).status);
463
+ },
464
+ },
465
+ };
466
+ }
@@ -46,6 +46,8 @@ export interface ParcelCountSuggestion {
46
46
  * or `ReadFulfillment`. A malformed input is refused before any request with
47
47
  * `PARCEL_COUNT_INPUT_INVALID` ({@link ValidationError}); an unknown variant,
48
48
  * or another store's, is `PARCEL_COUNT_VARIANT_NOT_FOUND` (`NotFoundError`).
49
+ *
50
+ * @effect read
49
51
  */
50
52
  export type ParcelCountSuggestionMethod = (input: ParcelCountSuggestionInput, options?: Call) => Promise<ParcelCountSuggestion>;
51
53
  export declare const PARCEL_COUNT_SUGGESTION_QUERY = "\n query ParcelCountSuggestion($input: ParcelCountSuggestionInput!) {\n parcelCountSuggestion(input: $input) {\n count\n raw\n resolvable\n exact\n capped\n capacity\n maxWeightGrams\n unratedLines\n unweighedLines\n reason\n warnings\n destinationRequiresCustoms\n }\n }\n";
@@ -36,13 +36,14 @@ export interface SetParcelRuleInput {
36
36
  * change reaches another process after that cache refreshes.
37
37
  */
38
38
  export interface ParcelRuleModule {
39
+ /** @effect read */
39
40
  get(options?: Call): Promise<ParcelRule>;
41
+ /**
42
+ * @effect write
43
+ * @permission UpdateChannel
44
+ */
40
45
  set(input: SetParcelRuleInput, options?: Call): Promise<ParcelRule>;
41
46
  }
42
- /** `admin.shipping` (spec §9.2 `shipping`). */
43
- export interface ShippingModule {
44
- parcelRule: ParcelRuleModule;
45
- }
46
47
  export declare const PARCEL_RULE_QUERY = "\n query ParcelRule {\n activeChannel { \n id\n customFields {\n defaultParcelCapacity\n maxParcelWeightGrams\n }\n }\n }\n";
47
48
  export declare const SET_PARCEL_RULE_MUTATION = "\n mutation SetParcelRule($input: UpdateChannelInput!) {\n updateChannel(input: $input) {\n ... on Channel { \n id\n customFields {\n defaultParcelCapacity\n maxParcelWeightGrams\n }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
48
- export declare function createShippingModule(transport: Transport): ShippingModule;
49
+ export declare function createParcelRuleModule(transport: Transport): ParcelRuleModule;
@@ -58,34 +58,32 @@ function customFieldsOf(input) {
58
58
  }
59
59
  return fields;
60
60
  }
61
- export function createShippingModule(transport) {
61
+ export function createParcelRuleModule(transport) {
62
62
  const get = async (options) => {
63
63
  const data = await transport.graphql({ api: 'admin', query: PARCEL_RULE_QUERY }, options);
64
64
  return toRule(data.activeChannel);
65
65
  };
66
66
  return {
67
- parcelRule: {
68
- get,
69
- async set(input, options) {
70
- assertBound('defaultParcelCapacity', input?.defaultParcelCapacity, PARCEL_CAPACITY_MAX, 'items');
71
- assertBound('maxParcelWeightGrams', input?.maxParcelWeightGrams, PARCEL_WEIGHT_GRAMS_MAX, 'grams');
72
- const customFields = customFieldsOf(input ?? {});
73
- if (Object.keys(customFields).length === 0) {
74
- throw invalid('input', 'Pass defaultParcelCapacity and/or maxParcelWeightGrams; an empty input changes nothing.');
75
- }
76
- // `updateChannel` needs the id, and the active channel is the one the
77
- // client is scoped to — read it with the SAME call options, so a
78
- // per-call tenant writes its own channel rather than the client's.
79
- const { channelId } = await get(options);
80
- const data = await transport.graphql({
81
- api: 'admin',
82
- query: SET_PARCEL_RULE_MUTATION,
83
- variables: { input: { id: channelId, customFields } },
84
- }, options);
85
- if (isErrorResult(data.updateChannel))
86
- throw errorFromErrorResult(data.updateChannel);
87
- return toRule(data.updateChannel);
88
- },
67
+ get,
68
+ async set(input, options) {
69
+ assertBound('defaultParcelCapacity', input?.defaultParcelCapacity, PARCEL_CAPACITY_MAX, 'items');
70
+ assertBound('maxParcelWeightGrams', input?.maxParcelWeightGrams, PARCEL_WEIGHT_GRAMS_MAX, 'grams');
71
+ const customFields = customFieldsOf(input ?? {});
72
+ if (Object.keys(customFields).length === 0) {
73
+ throw invalid('input', 'Pass defaultParcelCapacity and/or maxParcelWeightGrams; an empty input changes nothing.');
74
+ }
75
+ // `updateChannel` needs the id, and the active channel is the one the
76
+ // client is scoped to — read it with the SAME call options, so a
77
+ // per-call tenant writes its own channel rather than the client's.
78
+ const { channelId } = await get(options);
79
+ const data = await transport.graphql({
80
+ api: 'admin',
81
+ query: SET_PARCEL_RULE_MUTATION,
82
+ variables: { input: { id: channelId, customFields } },
83
+ }, options);
84
+ if (isErrorResult(data.updateChannel))
85
+ throw errorFromErrorResult(data.updateChannel);
86
+ return toRule(data.updateChannel);
89
87
  },
90
88
  };
91
89
  }