@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,147 @@
1
+ import { type Transport } from '@sixtyninecommerce/core';
2
+ import type { SettingsSourceKind } from '../tenant/settings-sources.js';
3
+ import type { Call } from '../types.js';
4
+ /**
5
+ * How a language shows in storefront URLs. Mirrors the meta catalog's `URL_LOCALE_STRATEGIES`
6
+ * (`packages/shared/src/meta-catalog/plugin-config-schemas.ts`), which the engine enforces,
7
+ * pinned by `__tests__/seo-settings.spec.ts`.
8
+ */
9
+ export declare const URL_LOCALE_STRATEGIES: readonly ["path-prefix", "subdomain", "none"];
10
+ export type UrlLocaleStrategy = (typeof URL_LOCALE_STRATEGIES)[number];
11
+ /** What an AI crawler may do with the store's pages. */
12
+ export type AiBotDirective = 'allow' | 'deny';
13
+ /**
14
+ * The store's SEO defaults: the `settings.seo` group's channel half, which a member store may take
15
+ * from its organization.
16
+ */
17
+ export interface SeoDefaults {
18
+ /** Without the `@`; storefronts emit it as `twitter:site`. Null for none. */
19
+ twitterHandle: string | null;
20
+ /** The asset shared as the OpenGraph image when a product has none; null for none. */
21
+ defaultOgImageId: string | null;
22
+ /** AI crawler → `allow` or `deny`. A crawler left out follows the storefront's own default. */
23
+ aiBotDefaults: Record<string, AiBotDirective>;
24
+ /** The storefront advertises its AI-friendly endpoints at `/llms.txt`. */
25
+ llmsTxtEnabled: boolean;
26
+ /** Plain text merged into the store's `robots.txt`; null for none. */
27
+ robotsTxtCustom: string | null;
28
+ }
29
+ /** Where the SEO defaults storefronts get come from (`settings.seo`). */
30
+ export interface SeoDefaultsSource {
31
+ /** `channel`: the store's own defaults apply; `organization`: its organization's. */
32
+ source: SettingsSourceKind | (string & {});
33
+ /**
34
+ * The organization locks the group: {@link SeoSettingsModule.set} refuses a changed default with
35
+ * `MANAGED_BY_ORGANIZATION`, SuperAdmins included.
36
+ */
37
+ locked: boolean;
38
+ /** The organization shares the group without locking it, so the store may override it. */
39
+ inheritable: boolean;
40
+ /** The store keeps its own defaults although the organization shares the group. */
41
+ overridden: boolean;
42
+ /** The store's organization; null for a store outside any organization. */
43
+ organizationName: string | null;
44
+ /** The defaults storefronts get: the store's own while `source` is `channel`, else the organization's. */
45
+ effective: SeoDefaults;
46
+ }
47
+ /**
48
+ * The ACTIVE store's SEO settings as its channel stores them. The top-level defaults are the
49
+ * store's OWN values, which {@link SeoSettingsModule.set} writes; while the store takes
50
+ * `settings.seo` from its organization, storefronts get `defaultsSource.effective` instead.
51
+ */
52
+ export interface SeoSettings extends SeoDefaults {
53
+ /** The store these are the settings of (its channel id). */
54
+ channelId: string;
55
+ defaultLanguageCode: string;
56
+ /** The store's languages, its default included. */
57
+ availableLanguageCodes: string[];
58
+ /**
59
+ * The storefront's address, the base of canonical, hreflang and sitemap URLs; null when none.
60
+ * Always the store's own. While the store has a default web head, the head's address is copied
61
+ * over it on every head change.
62
+ */
63
+ storefrontUrl: string | null;
64
+ /**
65
+ * How a language shows in storefront URLs; `path-prefix` when the store never chose. A string
66
+ * the engine accepts that this SDK does not name yet passes through. Always the store's own.
67
+ */
68
+ urlLocaleStrategy: UrlLocaleStrategy | (string & {});
69
+ /** The default language carries a prefix too. Always the store's own. */
70
+ urlLocalePrefixDefault: boolean;
71
+ defaultsSource: SeoDefaultsSource;
72
+ }
73
+ /**
74
+ * A patch of {@link SeoSettings}: a key left out is unchanged, `null` clears it. At least one key.
75
+ * The read-only keys `get` answers (`channelId`, the languages, `defaultsSource`) are ignored, so
76
+ * `set({ ...settings, urlLocaleStrategy: 'subdomain' })` works.
77
+ */
78
+ export interface SeoSettingsPatch {
79
+ /** At most 255 characters; not checked to be a URL. */
80
+ storefrontUrl?: string | null;
81
+ /**
82
+ * One of {@link URL_LOCALE_STRATEGIES}, or null for the default (`path-prefix`). Typed as any
83
+ * string so a strategy `get` answered (one this SDK may not name yet) can be sent back; the
84
+ * engine refuses one it does not know (`USER_INPUT_ERROR`).
85
+ */
86
+ urlLocaleStrategy?: UrlLocaleStrategy | (string & {}) | null;
87
+ urlLocalePrefixDefault?: boolean | null;
88
+ /** At most 50 characters, without the `@`. */
89
+ twitterHandle?: string | null;
90
+ defaultOgImageId?: string | null;
91
+ /** The whole map (it replaces the stored one), as an object: the SDK encodes it. */
92
+ aiBotDefaults?: Record<string, AiBotDirective> | null;
93
+ llmsTxtEnabled?: boolean | null;
94
+ robotsTxtCustom?: string | null;
95
+ }
96
+ /**
97
+ * `admin.seo.settings`: the ACTIVE store's SEO channel settings (Settings → SEO): the storefront
98
+ * URL and how languages show in its URLs, and the SEO defaults (share card, AI crawlers,
99
+ * `llms.txt`, `robots.txt`). Stored as Channel custom fields; written through core `updateChannel`
100
+ * (typed per domain, ruling G80).
101
+ *
102
+ * The other half of the page, the SEO automation (automatic redirects, IndexNow, the audit
103
+ * schedule), lives on the plugins service: `admin.seo.config`.
104
+ */
105
+ export interface SeoSettingsModule {
106
+ /**
107
+ * The settings, and where the defaults storefronts get come from. Reading needs an
108
+ * administrator of the store with any permission beyond `Authenticated`.
109
+ *
110
+ * @effect read
111
+ */
112
+ get(options?: Call): Promise<SeoSettings>;
113
+ /**
114
+ * Change the settings `patch` names, and answer them all as the engine now stores them. The
115
+ * storefront picks the change up on its next read of the store's settings.
116
+ *
117
+ * **Coded refusals:**
118
+ * - `SEO_SETTINGS_INVALID` → `ValidationError` (400), before any request: an empty patch, a
119
+ * key that is not an SEO setting, or an `aiBotDefaults` that is not an object (or null). One
120
+ * `details[]` entry per key, `field` naming it.
121
+ * - `CHANNEL_SETTINGS_INVALID` → `ValidationError` (400), from the engine: an `aiBotDefaults`
122
+ * the platform's schema refuses (a directive other than `allow` or `deny`).
123
+ * `details[].field` is `customFields.aiBotDefaults`.
124
+ * - `USER_INPUT_ERROR` → `ValidationError` (400): a `urlLocaleStrategy` outside
125
+ * {@link URL_LOCALE_STRATEGIES}.
126
+ * - `MANAGED_BY_ORGANIZATION` → `BusinessRuleError` (422): a changed default while the
127
+ * organization locks `settings.seo`.
128
+ * - `ORGANIZATION_SETTINGS_INHERITED` → `BusinessRuleError` (422): a changed default while the
129
+ * store inherits the group; `tenant.settingsSources.override('settings.seo')` it first.
130
+ * Sending the stored value back unchanged is accepted and changes nothing.
131
+ * - `ORGANIZATION_WORKSPACE_NOT_A_STORE` → `BusinessRuleError` (422): a storefront URL for an
132
+ * organization's workspace, which has no storefront.
133
+ * - `FORBIDDEN` → `PermissionDeniedError` (403): the credential lacks `UpdateChannel`.
134
+ *
135
+ * @effect write
136
+ * @permission UpdateChannel
137
+ */
138
+ set(patch: SeoSettingsPatch, options?: Call): Promise<SeoSettings>;
139
+ }
140
+ export declare const SEO_SETTINGS_QUERY = "\n query SeoSettings {\n activeChannel { \n id\n defaultLanguageCode\n availableLanguageCodes\n customFields {\n storefrontUrl\n urlLocaleStrategy\n urlLocalePrefixDefault\n twitterHandle\n defaultOgImageId\n aiBotDefaults\n llmsTxtEnabled\n robotsTxtCustom\n }\n }\n channelSettingsSources { group source locked overridden inheritable organizationName values }\n }\n";
141
+ export declare const UPDATE_SEO_SETTINGS_MUTATION = "\n mutation UpdateSeoSettings($input: UpdateChannelInput!) {\n updateChannel(input: $input) {\n ... on Channel { \n id\n defaultLanguageCode\n availableLanguageCodes\n customFields {\n storefrontUrl\n urlLocaleStrategy\n urlLocalePrefixDefault\n twitterHandle\n defaultOgImageId\n aiBotDefaults\n llmsTxtEnabled\n robotsTxtCustom\n }\n }\n ... on ErrorResult { errorCode message }\n }\n }\n";
142
+ /**
143
+ * `aiBotDefaults` as the column stores it (JSON text) or already decoded (an organization's
144
+ * `values`); a directive other than `allow` or `deny` is left out, an unreadable value is none.
145
+ */
146
+ export declare function readAiBotDefaults(raw: unknown): Record<string, AiBotDirective>;
147
+ export declare function createSeoSettingsModule(transport: Transport): SeoSettingsModule;
@@ -0,0 +1,209 @@
1
+ import { errorFromErrorResult, isErrorResult, NotFoundError, ValidationError, } from '@sixtyninecommerce/core';
2
+ /**
3
+ * How a language shows in storefront URLs. Mirrors the meta catalog's `URL_LOCALE_STRATEGIES`
4
+ * (`packages/shared/src/meta-catalog/plugin-config-schemas.ts`), which the engine enforces,
5
+ * pinned by `__tests__/seo-settings.spec.ts`.
6
+ */
7
+ export const URL_LOCALE_STRATEGIES = ['path-prefix', 'subdomain', 'none'];
8
+ /** The settings group the defaults belong to (multi-region spec §5.3). */
9
+ const SEO_GROUP = 'settings.seo';
10
+ const CHANNEL_FIELDS = /* GraphQL */ `
11
+ id
12
+ defaultLanguageCode
13
+ availableLanguageCodes
14
+ customFields {
15
+ storefrontUrl
16
+ urlLocaleStrategy
17
+ urlLocalePrefixDefault
18
+ twitterHandle
19
+ defaultOgImageId
20
+ aiBotDefaults
21
+ llmsTxtEnabled
22
+ robotsTxtCustom
23
+ }
24
+ `;
25
+ export const SEO_SETTINGS_QUERY = /* GraphQL */ `
26
+ query SeoSettings {
27
+ activeChannel { ${CHANNEL_FIELDS} }
28
+ channelSettingsSources { group source locked overridden inheritable organizationName values }
29
+ }
30
+ `;
31
+ export const UPDATE_SEO_SETTINGS_MUTATION = /* GraphQL */ `
32
+ mutation UpdateSeoSettings($input: UpdateChannelInput!) {
33
+ updateChannel(input: $input) {
34
+ ... on Channel { ${CHANNEL_FIELDS} }
35
+ ... on ErrorResult { errorCode message }
36
+ }
37
+ }
38
+ `;
39
+ const INVALID = 'SEO_SETTINGS_INVALID';
40
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
41
+ const stringOrNull = (value) => (typeof value === 'string' ? value : null);
42
+ /**
43
+ * `aiBotDefaults` as the column stores it (JSON text) or already decoded (an organization's
44
+ * `values`); a directive other than `allow` or `deny` is left out, an unreadable value is none.
45
+ */
46
+ export function readAiBotDefaults(raw) {
47
+ let parsed = raw;
48
+ if (typeof raw === 'string') {
49
+ if (raw === '')
50
+ return {};
51
+ try {
52
+ parsed = JSON.parse(raw);
53
+ }
54
+ catch {
55
+ return {};
56
+ }
57
+ }
58
+ if (!isRecord(parsed))
59
+ return {};
60
+ const out = {};
61
+ for (const [bot, directive] of Object.entries(parsed)) {
62
+ if (directive === 'allow' || directive === 'deny')
63
+ out[bot] = directive;
64
+ }
65
+ return out;
66
+ }
67
+ function defaultsOf(fields) {
68
+ return {
69
+ twitterHandle: stringOrNull(fields.twitterHandle),
70
+ defaultOgImageId: stringOrNull(fields.defaultOgImageId),
71
+ aiBotDefaults: readAiBotDefaults(fields.aiBotDefaults),
72
+ llmsTxtEnabled: fields.llmsTxtEnabled === true,
73
+ robotsTxtCustom: stringOrNull(fields.robotsTxtCustom),
74
+ };
75
+ }
76
+ function sourceOf(sources, own) {
77
+ const group = sources.find((item) => item.group === SEO_GROUP);
78
+ if (!group) {
79
+ return {
80
+ source: 'channel',
81
+ locked: false,
82
+ inheritable: false,
83
+ overridden: false,
84
+ organizationName: null,
85
+ effective: own,
86
+ };
87
+ }
88
+ // The store's own defaults when its own apply: after `set` the sources are the ones read BEFORE
89
+ // the write, so their values would answer the old defaults. The organization's otherwise.
90
+ return {
91
+ source: group.source,
92
+ locked: group.locked,
93
+ inheritable: group.inheritable,
94
+ overridden: group.overridden,
95
+ organizationName: group.organizationName ?? null,
96
+ effective: group.source !== 'channel' && group.values ? defaultsOf(group.values) : own,
97
+ };
98
+ }
99
+ function settingsOf(channel, sources) {
100
+ const fields = channel.customFields ?? {};
101
+ const own = defaultsOf(fields);
102
+ return {
103
+ channelId: channel.id,
104
+ defaultLanguageCode: channel.defaultLanguageCode,
105
+ availableLanguageCodes: channel.availableLanguageCodes ?? [channel.defaultLanguageCode],
106
+ storefrontUrl: stringOrNull(fields.storefrontUrl),
107
+ urlLocaleStrategy: stringOrNull(fields.urlLocaleStrategy) ?? 'path-prefix',
108
+ urlLocalePrefixDefault: fields.urlLocalePrefixDefault === true,
109
+ ...own,
110
+ defaultsSource: sourceOf(sources, own),
111
+ };
112
+ }
113
+ const PATCH_KEYS = [
114
+ 'storefrontUrl',
115
+ 'urlLocaleStrategy',
116
+ 'urlLocalePrefixDefault',
117
+ 'twitterHandle',
118
+ 'defaultOgImageId',
119
+ 'aiBotDefaults',
120
+ 'llmsTxtEnabled',
121
+ 'robotsTxtCustom',
122
+ ];
123
+ const KNOWN_KEYS = new Set(PATCH_KEYS);
124
+ /** What `get` answers beside the settings: sent back in a spread, never written. */
125
+ const READ_ONLY_KEYS = new Set([
126
+ 'channelId',
127
+ 'defaultLanguageCode',
128
+ 'availableLanguageCodes',
129
+ 'defaultsSource',
130
+ ]);
131
+ function problemsOf(patch) {
132
+ const problems = [];
133
+ const add = (field, message) => problems.push({ field, code: INVALID, message });
134
+ if (!isRecord(patch)) {
135
+ add('patch', "Pass the settings to change as an object, e.g. { urlLocaleStrategy: 'none' }.");
136
+ return problems;
137
+ }
138
+ const named = Object.keys(patch).filter((key) => patch[key] !== undefined && !READ_ONLY_KEYS.has(key));
139
+ if (named.length === 0) {
140
+ add('patch', `Name at least one setting to change: ${PATCH_KEYS.join(', ')}.`);
141
+ }
142
+ for (const key of named) {
143
+ if (!KNOWN_KEYS.has(key)) {
144
+ add(key, `${key} is not an SEO setting; the settings are ${PATCH_KEYS.join(', ')}.`);
145
+ }
146
+ }
147
+ const bots = patch.aiBotDefaults;
148
+ if (bots !== undefined && bots !== null && !isRecord(bots)) {
149
+ // A string would be encoded a second time and stored as a JSON string, not a map.
150
+ add('aiBotDefaults', "aiBotDefaults must be an object of crawler → 'allow' | 'deny' (the SDK encodes it), or null to clear it.");
151
+ }
152
+ return problems;
153
+ }
154
+ /** The custom fields `patch` writes: only the keys it names, the bot map as the column's JSON. */
155
+ function customFieldsOf(patch) {
156
+ const fields = {};
157
+ for (const key of PATCH_KEYS) {
158
+ const value = patch[key];
159
+ if (value === undefined)
160
+ continue;
161
+ fields[key] = key === 'aiBotDefaults' && value !== null ? JSON.stringify(value) : value;
162
+ }
163
+ return fields;
164
+ }
165
+ export function createSeoSettingsModule(transport) {
166
+ const read = async (options) => {
167
+ const data = await transport.graphql({ api: 'admin', query: SEO_SETTINGS_QUERY }, options);
168
+ if (!data.activeChannel) {
169
+ throw new NotFoundError({
170
+ code: 'CHANNEL_NOT_FOUND',
171
+ message: 'No store is active for this session, so it has no SEO settings to read.',
172
+ status: 404,
173
+ service: 'vendure',
174
+ });
175
+ }
176
+ return { channel: data.activeChannel, sources: data.channelSettingsSources ?? [] };
177
+ };
178
+ return {
179
+ async get(options) {
180
+ const { channel, sources } = await read(options);
181
+ return settingsOf(channel, sources);
182
+ },
183
+ async set(patch, options) {
184
+ const problems = problemsOf(patch);
185
+ if (problems.length > 0) {
186
+ throw new ValidationError({
187
+ code: INVALID,
188
+ message: problems.map((problem) => problem.message).join(' '),
189
+ status: 400,
190
+ service: 'vendure',
191
+ details: problems,
192
+ });
193
+ }
194
+ // The id `updateChannel` needs, read with the SAME call options, so a per-call tenant
195
+ // writes its own store rather than the client's.
196
+ const { channel, sources } = await read(options);
197
+ const data = await transport.graphql({
198
+ api: 'admin',
199
+ query: UPDATE_SEO_SETTINGS_MUTATION,
200
+ variables: { input: { id: channel.id, customFields: customFieldsOf(patch) } },
201
+ }, options);
202
+ if (isErrorResult(data.updateChannel))
203
+ throw errorFromErrorResult(data.updateChannel);
204
+ // An SEO settings write never changes where the defaults come from, so the sources read
205
+ // just before still hold; `sourceOf` takes the new own defaults when the store's apply.
206
+ return settingsOf(data.updateChannel, sources);
207
+ },
208
+ };
209
+ }
@@ -0,0 +1,29 @@
1
+ import { type Transport } from '@sixtyninecommerce/core';
2
+ import type { Call, ConfigurableOperationDefinition } from '../types.js';
3
+ /** What a shipping method's three operations may be, each with the arguments it takes. */
4
+ export interface ShippingDefinitions {
5
+ /** What a method's `calculator` may be: how it prices an order. */
6
+ calculators: ConfigurableOperationDefinition[];
7
+ /** What a method's `checker` may be: which orders it is offered for. */
8
+ eligibilityCheckers: ConfigurableOperationDefinition[];
9
+ /** What a method's `fulfillmentHandler` may be (`manual-fulfillment`, a carrier's handler). */
10
+ fulfillmentHandlers: ConfigurableOperationDefinition[];
11
+ }
12
+ /** `admin.shipping.definitions`. */
13
+ export interface ShippingDefinitionsModule {
14
+ /**
15
+ * The calculators, eligibility checkers and fulfillment handlers the engine has registered, in
16
+ * one request: the same whichever store the client is on (a handler whose plugin the store does
17
+ * not hold is listed, and refused `PLUGIN_ACCESS_DENIED` when a method picks it). Labels and
18
+ * descriptions are in the language of the request. Needs `ReadSettings`, `ReadOrder` or
19
+ * `ReadShippingMethod` (any one).
20
+ *
21
+ * `args[].required` is NOT the enforced rule (see `ConfigArgDefinition.required`); never gate
22
+ * a form on it.
23
+ *
24
+ * @effect read
25
+ */
26
+ get(options?: Call): Promise<ShippingDefinitions>;
27
+ }
28
+ export declare const SHIPPING_DEFINITIONS_QUERY = "\n query ShippingDefinitions {\n shippingCalculators { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n shippingEligibilityCheckers { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n fulfillmentHandlers { \n code\n description\n args {\n name\n type\n list\n required\n defaultValue\n label\n description\n ui\n }\n }\n }\n";
29
+ export declare function createShippingDefinitionsModule(transport: Transport): ShippingDefinitionsModule;
@@ -0,0 +1,47 @@
1
+ import { UpstreamError } from '@sixtyninecommerce/core';
2
+ const DEFINITION_FIELDS = /* GraphQL */ `
3
+ code
4
+ description
5
+ args {
6
+ name
7
+ type
8
+ list
9
+ required
10
+ defaultValue
11
+ label
12
+ description
13
+ ui
14
+ }
15
+ `;
16
+ export const SHIPPING_DEFINITIONS_QUERY = /* GraphQL */ `
17
+ query ShippingDefinitions {
18
+ shippingCalculators { ${DEFINITION_FIELDS} }
19
+ shippingEligibilityCheckers { ${DEFINITION_FIELDS} }
20
+ fulfillmentHandlers { ${DEFINITION_FIELDS} }
21
+ }
22
+ `;
23
+ export function createShippingDefinitionsModule(transport) {
24
+ return {
25
+ async get(options) {
26
+ const data = await transport.graphql({ api: 'admin', query: SHIPPING_DEFINITIONS_QUERY, variables: {} }, options);
27
+ // Each list is read by name, so a response missing one is refused, never answered empty.
28
+ const list = (field) => {
29
+ const value = data?.[field];
30
+ if (!Array.isArray(value)) {
31
+ throw new UpstreamError({
32
+ code: 'UNEXPECTED_RESPONSE',
33
+ message: `The engine answered without "${field}".`,
34
+ status: 502,
35
+ service: 'vendure',
36
+ });
37
+ }
38
+ return value;
39
+ };
40
+ return {
41
+ calculators: list('shippingCalculators'),
42
+ eligibilityCheckers: list('shippingEligibilityCheckers'),
43
+ fulfillmentHandlers: list('fulfillmentHandlers'),
44
+ };
45
+ },
46
+ };
47
+ }
@@ -0,0 +1,174 @@
1
+ import type { Transport } from '@sixtyninecommerce/core';
2
+ import type { Call } from '../types.js';
3
+ /**
4
+ * A store's fulfillment profile: a named binding of a warehouse, a fulfillment handler, a
5
+ * shipping method and a minimum order. A fulfilment created with a profile is judged against its
6
+ * minimum and charged its shipping method's delivery cost (`fulfillments.profileChargePreview`
7
+ * prices it beforehand).
8
+ */
9
+ export interface FulfillmentProfile {
10
+ id: string;
11
+ /** Stable per store; unique within the store. */
12
+ code: string;
13
+ name: string;
14
+ /** A disabled profile is not offered when fulfilling an order. */
15
+ enabled: boolean;
16
+ /** The warehouse (stock location) the profile ships from. */
17
+ stockLocationId: string;
18
+ /** The fulfillment handler (carrier) code, e.g. `manual-fulfillment`. */
19
+ defaultHandlerCode: string;
20
+ /** The shipping method whose price is the profile's delivery charge. */
21
+ shippingMethodId: string;
22
+ /**
23
+ * The minimum a fulfilment's selected lines must reach, in MINOR units of the store's default
24
+ * currency, NET of tax. `0` is no minimum.
25
+ */
26
+ minOrder: number;
27
+ /** True for the store's default profile, the one storefront checkout applies. */
28
+ isDefault: boolean;
29
+ /** ISO-8601, UTC. */
30
+ createdAt: string;
31
+ /** ISO-8601, UTC. */
32
+ updatedAt: string;
33
+ }
34
+ export interface CreateFulfillmentProfileInput {
35
+ name: string;
36
+ code: string;
37
+ /** Default `true`. */
38
+ enabled?: boolean;
39
+ /** One of the store's own stock locations. */
40
+ stockLocationId: string;
41
+ defaultHandlerCode: string;
42
+ /** One of the store's own shipping methods. */
43
+ shippingMethodId: string;
44
+ /** Minor units, net, in the store's default currency. Default `0`. */
45
+ minOrder?: number;
46
+ }
47
+ /** A PATCH: a key left out keeps the stored value. */
48
+ export interface UpdateFulfillmentProfileInput {
49
+ name?: string;
50
+ code?: string;
51
+ enabled?: boolean;
52
+ stockLocationId?: string;
53
+ defaultHandlerCode?: string;
54
+ shippingMethodId?: string;
55
+ minOrder?: number;
56
+ }
57
+ /**
58
+ * Who is emailed when a fulfilment is created with a handler, in this store. One record per
59
+ * handler; a handler with no record notifies nobody.
60
+ */
61
+ export interface FulfillmentHandlerNotification {
62
+ id: string;
63
+ handlerCode: string;
64
+ /** Off pauses the mails without forgetting the recipients. */
65
+ enabled: boolean;
66
+ /** Trimmed, de-duplicated (case-insensitive) addresses, at most 25. */
67
+ emails: string[];
68
+ /** ISO-8601, UTC. */
69
+ createdAt: string;
70
+ /** ISO-8601, UTC. */
71
+ updatedAt: string;
72
+ }
73
+ export interface SetFulfillmentHandlerNotificationInput {
74
+ handlerCode: string;
75
+ /** Left out: `true` for a new record, unchanged for an existing one. */
76
+ enabled?: boolean;
77
+ /** The WHOLE list: it replaces the stored one. `[]` clears it. */
78
+ emails: string[];
79
+ }
80
+ /** `admin.shipping.fulfillmentProfiles.handlerNotifications`. */
81
+ export interface FulfillmentHandlerNotificationsModule {
82
+ /**
83
+ * Every handler's recipients in the store, by handler code. Needs `ReadShippingMethod`.
84
+ *
85
+ * @effect read
86
+ * @permission ReadShippingMethod
87
+ */
88
+ list(options?: Call): Promise<FulfillmentHandlerNotification[]>;
89
+ /**
90
+ * Create or replace one handler's recipients. Needs `UpdateShippingMethod`. Refused, with
91
+ * nothing saved, for a blank handler code, an address that is not one, or more than 25
92
+ * addresses (`USER_INPUT_ERROR`, a `ValidationError`). The handler code is not checked against
93
+ * the store's handlers: a record for a handler nothing uses is kept and never mails.
94
+ *
95
+ * @effect write
96
+ * @permission UpdateShippingMethod
97
+ */
98
+ set(input: SetFulfillmentHandlerNotificationInput, options?: Call): Promise<FulfillmentHandlerNotification>;
99
+ }
100
+ /**
101
+ * `admin.shipping.fulfillmentProfiles`: the fulfillment profiles of the store the client is
102
+ * scoped to. There is no channel argument; another store is addressed with
103
+ * `admin.withTenant(...)`.
104
+ *
105
+ * A well-formed profile id the store does not have (another store's, or none at all) is refused
106
+ * on every write with `FULFILLMENT_PROFILE_NOT_FOUND` (`NotFoundError`, 404), worded the same
107
+ * either way, and `get` answers `null` for it. An id that is not a uuid is refused by the engine
108
+ * before any of that, on every method `get` included, with `ENTITY_NOT_FOUND` (`NotFoundError`).
109
+ */
110
+ export interface FulfillmentProfilesModule {
111
+ /**
112
+ * Every profile of the store, oldest first. Needs `ReadShippingMethod`.
113
+ *
114
+ * @effect read
115
+ * @permission ReadShippingMethod
116
+ */
117
+ list(options?: Call): Promise<FulfillmentProfile[]>;
118
+ /**
119
+ * One profile, or `null` when the store has none with that id.
120
+ *
121
+ * @effect read
122
+ * @permission ReadShippingMethod
123
+ */
124
+ get(id: string, options?: Call): Promise<FulfillmentProfile | null>;
125
+ /**
126
+ * Create a profile. Needs `UpdateShippingMethod`. A warehouse or shipping method the store
127
+ * does not have is refused `ENTITY_NOT_FOUND` (`NotFoundError`), the same for another store's
128
+ * id as for one that exists nowhere.
129
+ *
130
+ * @effect write
131
+ * @permission UpdateShippingMethod
132
+ */
133
+ create(input: CreateFulfillmentProfileInput, options?: Call): Promise<FulfillmentProfile>;
134
+ /**
135
+ * Change a profile; a key left out keeps its value. Needs `UpdateShippingMethod`. Refused
136
+ * `FULFILLMENT_PROFILE_NOT_FOUND` for a profile the store does not have, and
137
+ * `ENTITY_NOT_FOUND` for a warehouse or shipping method it does not have. A changed minimum
138
+ * binds the next fulfilment; fulfilments already created keep what they were charged.
139
+ *
140
+ * @effect write
141
+ * @permission UpdateShippingMethod
142
+ */
143
+ update(id: string, input: UpdateFulfillmentProfileInput, options?: Call): Promise<FulfillmentProfile>;
144
+ /**
145
+ * Delete a profile for good. When it was the store's default the store is left with NO
146
+ * default profile, so checkout applies no profile minimum until another is set. Fulfilments
147
+ * already created with it are unchanged. Needs `UpdateShippingMethod`; refused
148
+ * `FULFILLMENT_PROFILE_NOT_FOUND` for a profile the store does not have.
149
+ *
150
+ * @effect destructive
151
+ * @permission UpdateShippingMethod
152
+ */
153
+ delete(id: string, options?: Call): Promise<void>;
154
+ /**
155
+ * Make a profile the store's default (the one storefront checkout applies); answers it.
156
+ * Needs `UpdateShippingMethod`; refused `FULFILLMENT_PROFILE_NOT_FOUND` for a profile the
157
+ * store does not have.
158
+ *
159
+ * @effect write
160
+ * @permission UpdateShippingMethod
161
+ */
162
+ setDefault(id: string, options?: Call): Promise<FulfillmentProfile>;
163
+ /** Who is emailed when a fulfilment is created with a handler. */
164
+ handlerNotifications: FulfillmentHandlerNotificationsModule;
165
+ }
166
+ export declare const FULFILLMENT_PROFILES_QUERY = "\n query FulfillmentProfiles {\n fulfillmentProfiles { \n id\n code\n name\n enabled\n stockLocationId\n defaultHandlerCode\n shippingMethodId\n minOrder\n isDefault\n createdAt\n updatedAt\n }\n }\n";
167
+ export declare const FULFILLMENT_PROFILE_QUERY = "\n query FulfillmentProfile($id: ID!) {\n fulfillmentProfile(id: $id) { \n id\n code\n name\n enabled\n stockLocationId\n defaultHandlerCode\n shippingMethodId\n minOrder\n isDefault\n createdAt\n updatedAt\n }\n }\n";
168
+ export declare const CREATE_FULFILLMENT_PROFILE_MUTATION = "\n mutation CreateFulfillmentProfile($input: CreateFulfillmentProfileInput!) {\n createFulfillmentProfile(input: $input) { \n id\n code\n name\n enabled\n stockLocationId\n defaultHandlerCode\n shippingMethodId\n minOrder\n isDefault\n createdAt\n updatedAt\n }\n }\n";
169
+ export declare const UPDATE_FULFILLMENT_PROFILE_MUTATION = "\n mutation UpdateFulfillmentProfile($input: UpdateFulfillmentProfileInput!) {\n updateFulfillmentProfile(input: $input) { \n id\n code\n name\n enabled\n stockLocationId\n defaultHandlerCode\n shippingMethodId\n minOrder\n isDefault\n createdAt\n updatedAt\n }\n }\n";
170
+ export declare const DELETE_FULFILLMENT_PROFILE_MUTATION = "\n mutation DeleteFulfillmentProfile($id: ID!) {\n deleteFulfillmentProfile(id: $id) { result message }\n }\n";
171
+ export declare const SET_DEFAULT_FULFILLMENT_PROFILE_MUTATION = "\n mutation SetDefaultFulfillmentProfile($id: ID!) {\n setDefaultFulfillmentProfile(id: $id) { \n id\n code\n name\n enabled\n stockLocationId\n defaultHandlerCode\n shippingMethodId\n minOrder\n isDefault\n createdAt\n updatedAt\n }\n }\n";
172
+ export declare const FULFILLMENT_HANDLER_NOTIFICATIONS_QUERY = "\n query FulfillmentHandlerNotifications {\n fulfillmentHandlerNotifications { \n id\n handlerCode\n enabled\n emails\n createdAt\n updatedAt\n }\n }\n";
173
+ export declare const SET_FULFILLMENT_HANDLER_NOTIFICATION_MUTATION = "\n mutation SetFulfillmentHandlerNotification($input: SetFulfillmentHandlerNotificationInput!) {\n setFulfillmentHandlerNotification(input: $input) { \n id\n handlerCode\n enabled\n emails\n createdAt\n updatedAt\n }\n }\n";
174
+ export declare function createFulfillmentProfilesModule(transport: Transport): FulfillmentProfilesModule;