@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.
- package/README.md +5772 -118
- package/dist/auth/index.d.ts +7 -1
- package/dist/auth/index.js +8 -1
- package/dist/catalog/assets.d.ts +120 -8
- package/dist/catalog/assets.js +98 -12
- package/dist/catalog/collections.d.ts +279 -14
- package/dist/catalog/collections.js +246 -15
- package/dist/catalog/documents.d.ts +142 -0
- package/dist/catalog/documents.js +114 -0
- package/dist/catalog/index.d.ts +54 -6
- package/dist/catalog/index.js +10 -1
- package/dist/catalog/metadata.d.ts +244 -0
- package/dist/catalog/metadata.js +220 -0
- package/dist/catalog/products.d.ts +159 -19
- package/dist/catalog/products.js +88 -13
- package/dist/catalog/properties.d.ts +140 -14
- package/dist/catalog/properties.js +65 -1
- package/dist/catalog/recommendations.d.ts +288 -0
- package/dist/catalog/recommendations.js +237 -0
- package/dist/catalog/reviews.d.ts +381 -0
- package/dist/catalog/reviews.js +325 -0
- package/dist/catalog/types.d.ts +17 -1
- package/dist/catalog/types.js +10 -0
- package/dist/catalog/variant-find.d.ts +136 -0
- package/dist/catalog/variant-find.js +239 -0
- package/dist/catalog/variants.d.ts +293 -26
- package/dist/catalog/variants.js +164 -7
- package/dist/catalog/visibility.d.ts +38 -7
- package/dist/catalog/visibility.js +19 -1
- package/dist/client.d.ts +121 -9
- package/dist/client.js +53 -14
- package/dist/content/assets.d.ts +285 -0
- package/dist/content/assets.js +181 -0
- package/dist/content/forms.d.ts +332 -1
- package/dist/content/forms.js +140 -4
- package/dist/content/items.d.ts +292 -0
- package/dist/content/items.js +170 -0
- package/dist/content/menus.d.ts +254 -0
- package/dist/content/menus.js +70 -0
- package/dist/content/strings.d.ts +137 -0
- package/dist/content/strings.js +82 -0
- package/dist/content/types.d.ts +282 -0
- package/dist/content/types.js +100 -0
- package/dist/customers/age-verification.d.ts +66 -0
- package/dist/customers/age-verification.js +79 -0
- package/dist/customers/credit.d.ts +263 -0
- package/dist/customers/credit.js +244 -0
- package/dist/customers/delivery-preferences.d.ts +120 -0
- package/dist/customers/delivery-preferences.js +97 -0
- package/dist/customers/delivery-terms.d.ts +44 -0
- package/dist/customers/delivery-terms.js +32 -0
- package/dist/customers/groups.d.ts +207 -0
- package/dist/customers/groups.js +438 -0
- package/dist/customers/index.d.ts +462 -37
- package/dist/customers/index.js +317 -40
- package/dist/customers/invitation-status.d.ts +57 -0
- package/dist/customers/invitation-status.js +21 -0
- package/dist/customers/notes.d.ts +67 -0
- package/dist/customers/notes.js +51 -0
- package/dist/customers/notification-recipients.d.ts +97 -0
- package/dist/customers/notification-recipients.js +84 -0
- package/dist/customers/saved-lists.d.ts +42 -0
- package/dist/customers/saved-lists.js +61 -0
- package/dist/customers/vat.d.ts +83 -0
- package/dist/customers/vat.js +46 -0
- package/dist/customers/wire.d.ts +20 -0
- package/dist/customers/wire.js +35 -0
- package/dist/documents/ar.d.ts +307 -0
- package/dist/documents/ar.js +254 -0
- package/dist/documents/emails.d.ts +150 -0
- package/dist/documents/emails.js +220 -0
- package/dist/documents/index.d.ts +744 -21
- package/dist/documents/index.js +438 -24
- package/dist/documents/pdf.d.ts +2 -0
- package/dist/documents/pdf.js +11 -0
- package/dist/fulfillments/create.d.ts +167 -0
- package/dist/fulfillments/create.js +216 -0
- package/dist/fulfillments/index.d.ts +163 -11
- package/dist/fulfillments/index.js +135 -6
- package/dist/fulfillments/payment-policy.d.ts +64 -0
- package/dist/fulfillments/payment-policy.js +140 -0
- package/dist/fulfillments/warehouse.d.ts +724 -0
- package/dist/fulfillments/warehouse.js +914 -0
- package/dist/geo/index.d.ts +119 -0
- package/dist/geo/index.js +107 -0
- package/dist/index.d.ts +147 -39
- package/dist/index.js +51 -12
- package/dist/integrations/afas-actions.d.ts +234 -0
- package/dist/integrations/afas-actions.js +310 -0
- package/dist/integrations/afas-types.d.ts +483 -0
- package/dist/integrations/afas-types.js +5 -0
- package/dist/integrations/afas.d.ts +234 -0
- package/dist/integrations/afas.js +290 -0
- package/dist/integrations/connections.d.ts +103 -0
- package/dist/integrations/connections.js +55 -0
- package/dist/integrations/esp.d.ts +313 -0
- package/dist/integrations/esp.js +169 -0
- package/dist/integrations/exact-online-types.d.ts +965 -0
- package/dist/integrations/exact-online-types.js +6 -0
- package/dist/integrations/exact-online.d.ts +784 -0
- package/dist/integrations/exact-online.js +1089 -0
- package/dist/integrations/index.d.ts +44 -3
- package/dist/integrations/index.js +23 -3
- package/dist/integrations/pipeline-discoveries.d.ts +65 -0
- package/dist/integrations/pipeline-discoveries.js +65 -0
- package/dist/integrations/pipeline-keys.d.ts +13 -0
- package/dist/integrations/pipeline-keys.js +22 -0
- package/dist/integrations/pipeline-runs.d.ts +119 -0
- package/dist/integrations/pipeline-runs.js +87 -0
- package/dist/integrations/pipelines.d.ts +87 -15
- package/dist/integrations/pipelines.js +41 -22
- package/dist/integrations/price-import.d.ts +223 -0
- package/dist/integrations/price-import.js +124 -0
- package/dist/integrations/types.d.ts +367 -3
- package/dist/integrations/types.js +4 -3
- package/dist/locations/index.d.ts +66 -0
- package/dist/locations/index.js +31 -0
- package/dist/meta/index.d.ts +172 -0
- package/dist/metafields/index.d.ts +8 -1
- package/dist/metafields/index.js +10 -0
- package/dist/orders/cancel-with-money.d.ts +237 -0
- package/dist/orders/cancel-with-money.js +155 -0
- package/dist/orders/commit-edit.d.ts +23 -1
- package/dist/orders/commit-edit.js +19 -2
- package/dist/orders/deposit-policy.d.ts +3 -1
- package/dist/orders/drafts.d.ts +800 -0
- package/dist/orders/drafts.js +771 -0
- package/dist/orders/fields.d.ts +245 -0
- package/dist/orders/fields.js +188 -0
- package/dist/orders/get.d.ts +29 -19
- package/dist/orders/get.js +17 -8
- package/dist/orders/index.d.ts +66 -15
- package/dist/orders/index.js +25 -2
- package/dist/orders/lifecycle.d.ts +128 -0
- package/dist/orders/lifecycle.js +158 -0
- package/dist/orders/line-price-preview.d.ts +7 -2
- package/dist/orders/list.d.ts +243 -0
- package/dist/orders/list.js +487 -0
- package/dist/orders/manual-discounts.d.ts +13 -5
- package/dist/orders/manual-pricing.d.ts +5 -0
- package/dist/orders/money-view.d.ts +149 -0
- package/dist/orders/money-view.js +99 -0
- package/dist/orders/order-entry.d.ts +20 -7
- package/dist/orders/plan-edit.d.ts +34 -2
- package/dist/orders/plan-edit.js +112 -11
- package/dist/orders/settings.d.ts +201 -0
- package/dist/orders/settings.js +325 -0
- package/dist/orders/status.d.ts +159 -13
- package/dist/orders/status.js +21 -0
- package/dist/orders/surcharges.d.ts +20 -1
- package/dist/orders/surcharges.js +37 -11
- package/dist/payments/account-credit.d.ts +46 -0
- package/dist/payments/account-credit.js +42 -0
- package/dist/payments/ar.d.ts +292 -0
- package/dist/payments/ar.js +223 -0
- package/dist/payments/connected-account.d.ts +47 -0
- package/dist/payments/connected-account.js +61 -0
- package/dist/payments/credit-noted-fields.d.ts +19 -0
- package/dist/payments/credit-noted-fields.js +69 -0
- package/dist/payments/customer-consent.d.ts +30 -0
- package/dist/payments/customer-consent.js +49 -0
- package/dist/payments/index.d.ts +340 -19
- package/dist/payments/index.js +151 -1
- package/dist/payments/methods.d.ts +303 -8
- package/dist/payments/methods.js +337 -7
- package/dist/payments/mollie-methods.d.ts +159 -0
- package/dist/payments/mollie-methods.js +141 -0
- package/dist/payments/payment-links.d.ts +180 -0
- package/dist/payments/payment-links.js +97 -0
- package/dist/payments/provider-keys.d.ts +150 -0
- package/dist/payments/provider-keys.js +118 -0
- package/dist/payments/providers.d.ts +86 -11
- package/dist/payments/providers.js +29 -0
- package/dist/payments/requests.d.ts +147 -0
- package/dist/payments/requests.js +93 -0
- package/dist/payments/store-credit-fields.d.ts +15 -0
- package/dist/payments/store-credit-fields.js +51 -0
- package/dist/pickups/index.d.ts +106 -0
- package/dist/pickups/index.js +108 -0
- package/dist/platform/channels.d.ts +132 -0
- package/dist/platform/channels.js +128 -0
- package/dist/platform/email-gateways.d.ts +165 -0
- package/dist/platform/email-gateways.js +78 -0
- package/dist/platform/geo.d.ts +123 -0
- package/dist/platform/geo.js +144 -0
- package/dist/platform/tax.d.ts +162 -0
- package/dist/platform/tax.js +169 -0
- package/dist/pos/anomalies.d.ts +158 -0
- package/dist/pos/anomalies.js +64 -0
- package/dist/pos/assisted-selling.d.ts +79 -0
- package/dist/pos/assisted-selling.js +38 -0
- package/dist/pos/exchanges.d.ts +108 -0
- package/dist/pos/exchanges.js +22 -0
- package/dist/pos/gift-cards.d.ts +135 -0
- package/dist/pos/gift-cards.js +47 -0
- package/dist/pos/index.d.ts +2370 -58
- package/dist/pos/index.js +854 -7
- package/dist/pos/no-receipt.d.ts +94 -0
- package/dist/pos/no-receipt.js +25 -0
- package/dist/pos/offline-sales.d.ts +228 -0
- package/dist/pos/offline-sales.js +170 -0
- package/dist/pos/pay-by-link.d.ts +143 -0
- package/dist/pos/pay-by-link.js +57 -0
- package/dist/pos/quick-keys.d.ts +103 -0
- package/dist/pos/quick-keys.js +45 -0
- package/dist/pos/reports.d.ts +360 -0
- package/dist/pos/reports.js +62 -0
- package/dist/pos/returns.d.ts +244 -0
- package/dist/pos/returns.js +83 -0
- package/dist/pricing/bulk-coupons.d.ts +139 -0
- package/dist/pricing/bulk-coupons.js +112 -0
- package/dist/pricing/index.d.ts +174 -4
- package/dist/pricing/index.js +174 -1
- package/dist/pricing/price-lists.d.ts +606 -0
- package/dist/pricing/price-lists.js +600 -0
- package/dist/purchasing/alerts.d.ts +104 -0
- package/dist/purchasing/alerts.js +88 -0
- package/dist/purchasing/backorders.d.ts +61 -0
- package/dist/purchasing/backorders.js +92 -0
- package/dist/purchasing/cost.d.ts +110 -0
- package/dist/purchasing/cost.js +86 -0
- package/dist/purchasing/index.d.ts +54 -0
- package/dist/purchasing/index.js +24 -0
- package/dist/purchasing/links.d.ts +263 -0
- package/dist/purchasing/links.js +192 -0
- package/dist/purchasing/purchase-orders.d.ts +551 -0
- package/dist/purchasing/purchase-orders.js +491 -0
- package/dist/purchasing/receipts.d.ts +396 -0
- package/dist/purchasing/receipts.js +287 -0
- package/dist/purchasing/replenishment.d.ts +281 -0
- package/dist/purchasing/replenishment.js +240 -0
- package/dist/purchasing/returns.d.ts +273 -0
- package/dist/purchasing/returns.js +229 -0
- package/dist/purchasing/settings.d.ts +152 -0
- package/dist/purchasing/settings.js +181 -0
- package/dist/purchasing/suppliers.d.ts +476 -0
- package/dist/purchasing/suppliers.js +438 -0
- package/dist/quotes/index.d.ts +518 -0
- package/dist/quotes/index.js +439 -0
- package/dist/reports/index.d.ts +71 -8
- package/dist/reports/index.js +74 -11
- package/dist/returns/index.d.ts +675 -21
- package/dist/returns/index.js +756 -11
- package/dist/search/index.d.ts +76 -1
- package/dist/search/index.js +63 -0
- package/dist/seo/config.d.ts +128 -0
- package/dist/seo/config.js +95 -0
- package/dist/seo/redirects.d.ts +125 -0
- package/dist/seo/redirects.js +60 -1
- package/dist/seo/settings.d.ts +147 -0
- package/dist/seo/settings.js +209 -0
- package/dist/shipping/definitions.d.ts +29 -0
- package/dist/shipping/definitions.js +47 -0
- package/dist/shipping/fulfillment-profiles.d.ts +174 -0
- package/dist/shipping/fulfillment-profiles.js +104 -0
- package/dist/shipping/hendriks.d.ts +97 -0
- package/dist/shipping/hendriks.js +50 -0
- package/dist/shipping/index.d.ts +54 -0
- package/dist/shipping/index.js +27 -0
- package/dist/shipping/methods.d.ts +205 -0
- package/dist/shipping/methods.js +240 -0
- package/dist/shipping/myparcel.d.ts +668 -0
- package/dist/shipping/myparcel.js +466 -0
- package/dist/shipping/parcel-count-suggestion.d.ts +2 -0
- package/dist/shipping/parcel-rule.d.ts +6 -5
- package/dist/shipping/parcel-rule.js +21 -23
- package/dist/shipping/rate-tables.d.ts +324 -0
- package/dist/shipping/rate-tables.js +390 -0
- package/dist/shipping/ship-to-countries.d.ts +75 -0
- package/dist/shipping/ship-to-countries.js +47 -0
- package/dist/stock/by-location.d.ts +86 -0
- package/dist/stock/by-location.js +94 -0
- package/dist/stock/index.d.ts +18 -4
- package/dist/stock/index.js +7 -0
- package/dist/stock/locations.d.ts +144 -0
- package/dist/stock/locations.js +168 -0
- package/dist/stock/settings.d.ts +106 -0
- package/dist/stock/settings.js +103 -0
- package/dist/stock/transfers.d.ts +386 -52
- package/dist/stock/transfers.js +222 -17
- package/dist/stored-value/index.d.ts +312 -11
- package/dist/stored-value/index.js +223 -4
- package/dist/subscriptions/index.d.ts +682 -0
- package/dist/subscriptions/index.js +815 -0
- package/dist/tax/display-policy.d.ts +105 -0
- package/dist/tax/display-policy.js +84 -0
- package/dist/tax/index.d.ts +79 -1
- package/dist/tax/index.js +52 -0
- package/dist/tenant/email-style.d.ts +102 -0
- package/dist/tenant/email-style.js +72 -0
- package/dist/tenant/email-templates.d.ts +287 -0
- package/dist/tenant/email-templates.js +271 -0
- package/dist/tenant/notifications.d.ts +23 -17
- package/dist/tenant/settings-sources.d.ts +1 -1
- package/dist/tenant/time-zone.d.ts +17 -0
- package/dist/tenant/time-zone.js +11 -0
- package/dist/types.d.ts +50 -3
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.js +2 -0
- package/dist/users/warehouses.d.ts +50 -0
- package/dist/users/warehouses.js +51 -0
- package/package.json +2 -2
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { Page, Transport } from '@sixtyninecommerce/core';
|
|
2
|
+
import type { Call, ListOptions } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* A country. Countries are PLATFORM-WIDE: every store reads the same table, and only a
|
|
5
|
+
* SuperAdmin changes it.
|
|
6
|
+
*/
|
|
7
|
+
export interface Country {
|
|
8
|
+
id: string;
|
|
9
|
+
/** In the language of the request. */
|
|
10
|
+
name: string;
|
|
11
|
+
/** ISO 3166-1 alpha-2, upper case. */
|
|
12
|
+
code: string;
|
|
13
|
+
/** A disabled country is kept for history; checkout and addresses refuse it. */
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}
|
|
18
|
+
/** A region inside a zone: today always a country (`type: 'country'`). */
|
|
19
|
+
export interface ZoneMember {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
code: string;
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
type: string;
|
|
25
|
+
}
|
|
26
|
+
/** A tax or shipping zone: a named set of countries, platform-wide like the countries. */
|
|
27
|
+
export interface Zone {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
createdAt: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
}
|
|
33
|
+
/** A zone with the countries in it. */
|
|
34
|
+
export interface ZoneWithMembers extends Zone {
|
|
35
|
+
members: ZoneMember[];
|
|
36
|
+
}
|
|
37
|
+
/** Options for {@link GeoZonesModule.list}. */
|
|
38
|
+
export interface ZoneListOptions extends ListOptions {
|
|
39
|
+
/** Also select each zone's members (the countries in it). Defaults to false. */
|
|
40
|
+
members?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface GeoCountriesModule {
|
|
43
|
+
/**
|
|
44
|
+
* The platform's countries, in id order.
|
|
45
|
+
*
|
|
46
|
+
* A `Page`: walk it (`for await`, or `.next()` until null) for the COMPLETE list. Nothing is cut
|
|
47
|
+
* at a fixed size; every following page keeps the same order and per-call options.
|
|
48
|
+
*
|
|
49
|
+
* @effect read
|
|
50
|
+
*/
|
|
51
|
+
list(options?: ListOptions): Promise<Page<Country>>;
|
|
52
|
+
}
|
|
53
|
+
export interface GeoZonesModule {
|
|
54
|
+
/**
|
|
55
|
+
* The platform's zones, in id order, with their members when `members` is true.
|
|
56
|
+
*
|
|
57
|
+
* A `Page`: walk it (`for await`, or `.next()` until null) for the COMPLETE list. Nothing is cut
|
|
58
|
+
* at a fixed size; every following page keeps the same order, `members` and per-call options.
|
|
59
|
+
*
|
|
60
|
+
* @effect read
|
|
61
|
+
*/
|
|
62
|
+
list(options: ZoneListOptions & {
|
|
63
|
+
members: true;
|
|
64
|
+
}): Promise<Page<ZoneWithMembers>>;
|
|
65
|
+
/**
|
|
66
|
+
* The platform's zones, in id order, without their members. A complete list when walked.
|
|
67
|
+
*
|
|
68
|
+
* @effect read
|
|
69
|
+
*/
|
|
70
|
+
list(options?: ZoneListOptions): Promise<Page<Zone>>;
|
|
71
|
+
/**
|
|
72
|
+
* One zone with its members, or null when no zone has that id. An id that is not in the
|
|
73
|
+
* platform's id format at all is refused by the engine (`ENTITY_NOT_FOUND`, a `NotFoundError`).
|
|
74
|
+
*
|
|
75
|
+
* @effect read
|
|
76
|
+
*/
|
|
77
|
+
get(id: string, options?: Call): Promise<ZoneWithMembers | null>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Countries and zones (spec §9.2, ruling G128). Platform-wide reads: any store's client answers
|
|
81
|
+
* the same lists. Reading needs `ReadCountry` / `ReadZone`, which every store role holds; a
|
|
82
|
+
* SuperAdmin writes them through `platform.geo`.
|
|
83
|
+
*/
|
|
84
|
+
export interface GeoModule {
|
|
85
|
+
countries: GeoCountriesModule;
|
|
86
|
+
zones: GeoZonesModule;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The zone provisioning gives a store for its country when it is sent no zones
|
|
90
|
+
* (`platform.provisionStore`, see `ProvisionStoreInput.defaultTaxZoneId`): the most SPECIFIC
|
|
91
|
+
* zone that contains the country — the fewest members — so a dedicated `Benelux` wins over a
|
|
92
|
+
* catch-all `Europe`. Ties break on name, then id, so the answer never depends on list order.
|
|
93
|
+
* Country codes compare case-insensitively.
|
|
94
|
+
*
|
|
95
|
+
* Null when no zone contains the country (or the code is blank): provisioning then refuses to
|
|
96
|
+
* guess, and so does this.
|
|
97
|
+
*
|
|
98
|
+
* Pass the COMPLETE zone list with members (`geo.zones.list({ members: true })`, walked): a cut
|
|
99
|
+
* list can answer a less specific zone than the server would.
|
|
100
|
+
*
|
|
101
|
+
* The server re-judges this: provisioning sent no zones resolves them itself with the same rule.
|
|
102
|
+
* A form that pre-fills with it and finds both zones unchanged at submit can leave them out and
|
|
103
|
+
* let the server have the last word.
|
|
104
|
+
*/
|
|
105
|
+
export declare function mostSpecificZone<T extends {
|
|
106
|
+
id: string;
|
|
107
|
+
name: string;
|
|
108
|
+
members: {
|
|
109
|
+
code: string;
|
|
110
|
+
}[];
|
|
111
|
+
}>(zones: readonly T[], countryCode: string | null | undefined): T | null;
|
|
112
|
+
export declare const COUNTRY_FIELDS = "\n id\n name\n code\n enabled\n createdAt\n updatedAt\n";
|
|
113
|
+
export declare const ZONE_FIELDS = "\n id\n name\n createdAt\n updatedAt\n";
|
|
114
|
+
export declare const ZONE_MEMBER_FIELDS = "\n members {\n id\n name\n code\n enabled\n type\n }\n";
|
|
115
|
+
export declare const GEO_COUNTRIES_QUERY = "\n query GeoCountries($options: CountryListOptions) {\n countries(options: $options) {\n items { \n id\n name\n code\n enabled\n createdAt\n updatedAt\n }\n totalItems\n }\n }\n";
|
|
116
|
+
export declare const GEO_ZONES_QUERY = "\n query GeoZones($options: ZoneListOptions) {\n zones(options: $options) {\n items { \n id\n name\n createdAt\n updatedAt\n }\n totalItems\n }\n }\n";
|
|
117
|
+
export declare const GEO_ZONES_WITH_MEMBERS_QUERY = "\n query GeoZonesWithMembers($options: ZoneListOptions) {\n zones(options: $options) {\n items { \n id\n name\n createdAt\n updatedAt\n \n members {\n id\n name\n code\n enabled\n type\n }\n }\n totalItems\n }\n }\n";
|
|
118
|
+
export declare const GEO_ZONE_QUERY = "\n query GeoZone($id: ID!) {\n zone(id: $id) { \n id\n name\n createdAt\n updatedAt\n \n members {\n id\n name\n code\n enabled\n type\n }\n }\n }\n";
|
|
119
|
+
export declare function createGeoModule(transport: Transport): GeoModule;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { fieldOf, vendureListPage } from '../catalog/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The zone provisioning gives a store for its country when it is sent no zones
|
|
4
|
+
* (`platform.provisionStore`, see `ProvisionStoreInput.defaultTaxZoneId`): the most SPECIFIC
|
|
5
|
+
* zone that contains the country — the fewest members — so a dedicated `Benelux` wins over a
|
|
6
|
+
* catch-all `Europe`. Ties break on name, then id, so the answer never depends on list order.
|
|
7
|
+
* Country codes compare case-insensitively.
|
|
8
|
+
*
|
|
9
|
+
* Null when no zone contains the country (or the code is blank): provisioning then refuses to
|
|
10
|
+
* guess, and so does this.
|
|
11
|
+
*
|
|
12
|
+
* Pass the COMPLETE zone list with members (`geo.zones.list({ members: true })`, walked): a cut
|
|
13
|
+
* list can answer a less specific zone than the server would.
|
|
14
|
+
*
|
|
15
|
+
* The server re-judges this: provisioning sent no zones resolves them itself with the same rule.
|
|
16
|
+
* A form that pre-fills with it and finds both zones unchanged at submit can leave them out and
|
|
17
|
+
* let the server have the last word.
|
|
18
|
+
*/
|
|
19
|
+
export function mostSpecificZone(zones, countryCode) {
|
|
20
|
+
const code = typeof countryCode === 'string' ? countryCode.trim().toUpperCase() : '';
|
|
21
|
+
if (code === '')
|
|
22
|
+
return null;
|
|
23
|
+
const candidates = zones.filter((zone) => zone.members.some((member) => member.code?.toUpperCase() === code));
|
|
24
|
+
const [best] = [...candidates].sort((a, b) => {
|
|
25
|
+
const size = a.members.length - b.members.length;
|
|
26
|
+
if (size !== 0)
|
|
27
|
+
return size;
|
|
28
|
+
const name = a.name.localeCompare(b.name, 'en');
|
|
29
|
+
if (name !== 0)
|
|
30
|
+
return name;
|
|
31
|
+
return a.id.localeCompare(b.id);
|
|
32
|
+
});
|
|
33
|
+
return best ?? null;
|
|
34
|
+
}
|
|
35
|
+
export const COUNTRY_FIELDS = /* GraphQL */ `
|
|
36
|
+
id
|
|
37
|
+
name
|
|
38
|
+
code
|
|
39
|
+
enabled
|
|
40
|
+
createdAt
|
|
41
|
+
updatedAt
|
|
42
|
+
`;
|
|
43
|
+
export const ZONE_FIELDS = /* GraphQL */ `
|
|
44
|
+
id
|
|
45
|
+
name
|
|
46
|
+
createdAt
|
|
47
|
+
updatedAt
|
|
48
|
+
`;
|
|
49
|
+
export const ZONE_MEMBER_FIELDS = /* GraphQL */ `
|
|
50
|
+
members {
|
|
51
|
+
id
|
|
52
|
+
name
|
|
53
|
+
code
|
|
54
|
+
enabled
|
|
55
|
+
type
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
export const GEO_COUNTRIES_QUERY = /* GraphQL */ `
|
|
59
|
+
query GeoCountries($options: CountryListOptions) {
|
|
60
|
+
countries(options: $options) {
|
|
61
|
+
items { ${COUNTRY_FIELDS} }
|
|
62
|
+
totalItems
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
export const GEO_ZONES_QUERY = /* GraphQL */ `
|
|
67
|
+
query GeoZones($options: ZoneListOptions) {
|
|
68
|
+
zones(options: $options) {
|
|
69
|
+
items { ${ZONE_FIELDS} }
|
|
70
|
+
totalItems
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
export const GEO_ZONES_WITH_MEMBERS_QUERY = /* GraphQL */ `
|
|
75
|
+
query GeoZonesWithMembers($options: ZoneListOptions) {
|
|
76
|
+
zones(options: $options) {
|
|
77
|
+
items { ${ZONE_FIELDS} ${ZONE_MEMBER_FIELDS} }
|
|
78
|
+
totalItems
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
export const GEO_ZONE_QUERY = /* GraphQL */ `
|
|
83
|
+
query GeoZone($id: ID!) {
|
|
84
|
+
zone(id: $id) { ${ZONE_FIELDS} ${ZONE_MEMBER_FIELDS} }
|
|
85
|
+
}
|
|
86
|
+
`;
|
|
87
|
+
/**
|
|
88
|
+
* Vendure's list queries add no ORDER BY of their own, and `skip/take` over an unordered query
|
|
89
|
+
* can repeat or skip rows between two requests. Every list here is ordered by id, the one unique
|
|
90
|
+
* key a sort can name (a GraphQL sort input applies its fields in the SCHEMA's order, where `id`
|
|
91
|
+
* comes first, so `{ name, id }` is id order too), so a walk answers each row exactly once.
|
|
92
|
+
*/
|
|
93
|
+
const BY_ID = { id: 'ASC' };
|
|
94
|
+
export function createGeoModule(transport) {
|
|
95
|
+
function listZones(options) {
|
|
96
|
+
return vendureListPage(transport, options?.members === true ? GEO_ZONES_WITH_MEMBERS_QUERY : GEO_ZONES_QUERY, 'zones', (skip, take) => ({ options: { skip, take, sort: BY_ID } }), options);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
countries: {
|
|
100
|
+
list: (options) => vendureListPage(transport, GEO_COUNTRIES_QUERY, 'countries', (skip, take) => ({ options: { skip, take, sort: BY_ID } }), options),
|
|
101
|
+
},
|
|
102
|
+
zones: {
|
|
103
|
+
list: listZones,
|
|
104
|
+
get: (id, options) => fieldOf(transport, GEO_ZONE_QUERY, 'zone', { id }, options),
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|