@tiledev/sdk-shopify 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +650 -50
- package/dist/alertSettings.d.ts.map +1 -1
- package/dist/alertSettings.js +2 -0
- package/dist/alertSettings.js.map +1 -1
- package/dist/attribution.d.ts +21 -0
- package/dist/attribution.d.ts.map +1 -1
- package/dist/attribution.js +17 -0
- package/dist/attribution.js.map +1 -1
- package/dist/auth/pkce.d.ts +30 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +128 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session.d.ts +118 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +896 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/storeCredit.d.ts +64 -0
- package/dist/auth/storeCredit.d.ts.map +1 -0
- package/dist/auth/storeCredit.js +274 -0
- package/dist/auth/storeCredit.js.map +1 -0
- package/dist/cart.d.ts +25 -1
- package/dist/cart.d.ts.map +1 -1
- package/dist/cart.js +95 -2
- package/dist/cart.js.map +1 -1
- package/dist/cartPolicy.js +4 -4
- package/dist/checkout.d.ts +123 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +205 -0
- package/dist/checkout.js.map +1 -0
- package/dist/customer.d.ts.map +1 -1
- package/dist/customer.js +8 -0
- package/dist/customer.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +74 -2
- package/dist/index.js.map +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +2 -0
- package/dist/messages.js.map +1 -1
- package/dist/money.d.ts +16 -0
- package/dist/money.d.ts.map +1 -1
- package/dist/money.js +55 -0
- package/dist/money.js.map +1 -1
- package/dist/orders.d.ts +99 -0
- package/dist/orders.d.ts.map +1 -0
- package/dist/orders.js +439 -0
- package/dist/orders.js.map +1 -0
- package/dist/productPage.d.ts +100 -0
- package/dist/productPage.d.ts.map +1 -0
- package/dist/productPage.js +298 -0
- package/dist/productPage.js.map +1 -0
- package/dist/productStore.d.ts +1 -1
- package/dist/productStore.d.ts.map +1 -1
- package/dist/productStore.js +63 -5
- package/dist/productStore.js.map +1 -1
- package/dist/products.d.ts.map +1 -1
- package/dist/products.js +15 -3
- package/dist/products.js.map +1 -1
- package/dist/purchaseRules.d.ts +74 -0
- package/dist/purchaseRules.d.ts.map +1 -0
- package/dist/purchaseRules.js +73 -0
- package/dist/purchaseRules.js.map +1 -0
- package/dist/queries.d.ts +15 -13
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +43 -7
- package/dist/queries.js.map +1 -1
- package/dist/react/ShopifyProvider.d.ts +167 -25
- package/dist/react/ShopifyProvider.d.ts.map +1 -1
- package/dist/react/ShopifyProvider.js +352 -207
- package/dist/react/ShopifyProvider.js.map +1 -1
- package/dist/react/appForeground.d.ts +6 -0
- package/dist/react/appForeground.d.ts.map +1 -0
- package/dist/react/appForeground.js +19 -0
- package/dist/react/appForeground.js.map +1 -0
- package/dist/react/appForeground.native.d.ts +2 -0
- package/dist/react/appForeground.native.d.ts.map +1 -0
- package/dist/react/appForeground.native.js +23 -0
- package/dist/react/appForeground.native.js.map +1 -0
- package/dist/react/index.d.ts +7 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +23 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/tileCreditClient.d.ts +4 -0
- package/dist/react/tileCreditClient.d.ts.map +1 -0
- package/dist/react/tileCreditClient.js +27 -0
- package/dist/react/tileCreditClient.js.map +1 -0
- package/dist/react/useAppDiscountCode.d.ts +19 -0
- package/dist/react/useAppDiscountCode.d.ts.map +1 -0
- package/dist/react/useAppDiscountCode.js +44 -0
- package/dist/react/useAppDiscountCode.js.map +1 -0
- package/dist/react/useCartStoreCredit.d.ts +25 -0
- package/dist/react/useCartStoreCredit.d.ts.map +1 -0
- package/dist/react/useCartStoreCredit.js +292 -0
- package/dist/react/useCartStoreCredit.js.map +1 -0
- package/dist/react/useOrders.d.ts +104 -0
- package/dist/react/useOrders.d.ts.map +1 -0
- package/dist/react/useOrders.js +287 -0
- package/dist/react/useOrders.js.map +1 -0
- package/dist/react/useProduct.d.ts.map +1 -1
- package/dist/react/useProduct.js +1 -9
- package/dist/react/useProduct.js.map +1 -1
- package/dist/react/useProductPage.d.ts +148 -0
- package/dist/react/useProductPage.d.ts.map +1 -0
- package/dist/react/useProductPage.js +178 -0
- package/dist/react/useProductPage.js.map +1 -0
- package/dist/react/useProductRecommendations.d.ts +27 -0
- package/dist/react/useProductRecommendations.d.ts.map +1 -0
- package/dist/react/useProductRecommendations.js +76 -0
- package/dist/react/useProductRecommendations.js.map +1 -0
- package/dist/react/useStoreCredit.d.ts +58 -0
- package/dist/react/useStoreCredit.d.ts.map +1 -0
- package/dist/react/useStoreCredit.js +209 -0
- package/dist/react/useStoreCredit.js.map +1 -0
- package/dist/react/useTileCredit.d.ts +4 -3
- package/dist/react/useTileCredit.d.ts.map +1 -1
- package/dist/react/useTileCredit.js +63 -55
- package/dist/react/useTileCredit.js.map +1 -1
- package/dist/shopify.d.ts.map +1 -1
- package/dist/shopify.js +2 -0
- package/dist/shopify.js.map +1 -1
- package/dist/storedList.d.ts +27 -0
- package/dist/storedList.d.ts.map +1 -0
- package/dist/storedList.js +152 -0
- package/dist/storedList.js.map +1 -0
- package/dist/tileCredit.d.ts +25 -10
- package/dist/tileCredit.d.ts.map +1 -1
- package/dist/tileCredit.js +97 -45
- package/dist/tileCredit.js.map +1 -1
- package/dist/types.d.ts +407 -34
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/dist/variants.d.ts.map +1 -1
- package/dist/variants.js +4 -3
- package/dist/variants.js.map +1 -1
- package/dist/waitlist.d.ts +4 -0
- package/dist/waitlist.d.ts.map +1 -0
- package/dist/waitlist.js +213 -0
- package/dist/waitlist.js.map +1 -0
- package/dist/wishlist.d.ts.map +1 -1
- package/dist/wishlist.js +70 -47
- package/dist/wishlist.js.map +1 -1
- package/package.json +2 -2
package/dist/orders.js
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ORDER_CLOCK_LEEWAY_MS = exports.STOREFRONT_ORDER_DETAIL_QUERY = exports.STOREFRONT_ORDER_IDS_QUERY = exports.STOREFRONT_ORDER_HISTORY_QUERY = exports.ACCOUNT_ORDER_DETAIL_QUERY = exports.ACCOUNT_ORDER_HISTORY_QUERY = exports.ORDER_LINES_READ = exports.LIST_LINES_COUNTED = void 0;
|
|
4
|
+
exports.orderProgress = orderProgress;
|
|
5
|
+
exports.placedSince = placedSince;
|
|
6
|
+
exports.customerAccountOrders = customerAccountOrders;
|
|
7
|
+
exports.storefrontOrders = storefrontOrders;
|
|
8
|
+
exports.withFreshFirstPage = withFreshFirstPage;
|
|
9
|
+
exports.withNextPage = withNextPage;
|
|
10
|
+
exports.planBuyAgain = planBuyAgain;
|
|
11
|
+
/**
|
|
12
|
+
* The signed-in shopper's orders, for `useOrders` and `useOrder` (react/useOrders.ts), from the API
|
|
13
|
+
* their session reads (`CustomerState.sessionKind`):
|
|
14
|
+
*
|
|
15
|
+
* - `shopify`: the Customer Account API (`customer.orders`, `order(id:)`), as production Amber did.
|
|
16
|
+
* - `password`: the Storefront API (`customer(customerAccessToken:) { orders }`).
|
|
17
|
+
*
|
|
18
|
+
* Both answer in the same shapes (`OrderSummary`, `OrderDetails`), so a screen doesn't care which
|
|
19
|
+
* sign-in it was. Newest first on both, by `processedAt`: the date the screens show. (Production
|
|
20
|
+
* sorted by ID; an imported order's `processedAt` can be older than its ID suggests.)
|
|
21
|
+
*
|
|
22
|
+
* Framework-free. Tested in test/orders.test.mjs.
|
|
23
|
+
*/
|
|
24
|
+
const client_1 = require("./client");
|
|
25
|
+
const productPage_1 = require("./productPage");
|
|
26
|
+
const types_1 = require("./types");
|
|
27
|
+
/**
|
|
28
|
+
* Lines counted per order in a list, for `itemCount`. A list needs only the quantities, and this keeps
|
|
29
|
+
* a page of 25 near 850 Customer Account API cost points by Shopify's published cost rules (that API
|
|
30
|
+
* charges per field read, from 7,500 points per shopper and store).
|
|
31
|
+
*/
|
|
32
|
+
exports.LIST_LINES_COUNTED = 30;
|
|
33
|
+
/** Lines read for one order. */
|
|
34
|
+
exports.ORDER_LINES_READ = 100;
|
|
35
|
+
// ── Customer Account API (Shopify sign-in) ─────────────────────────────────
|
|
36
|
+
exports.ACCOUNT_ORDER_HISTORY_QUERY = `
|
|
37
|
+
query OrderHistory($first: Int!, $after: String) {
|
|
38
|
+
customer {
|
|
39
|
+
orders(first: $first, after: $after, sortKey: PROCESSED_AT, reverse: true) {
|
|
40
|
+
pageInfo { hasNextPage endCursor }
|
|
41
|
+
nodes {
|
|
42
|
+
id
|
|
43
|
+
name
|
|
44
|
+
processedAt
|
|
45
|
+
cancelledAt
|
|
46
|
+
fulfillmentStatus
|
|
47
|
+
statusPageUrl
|
|
48
|
+
totalPrice { amount currencyCode }
|
|
49
|
+
lineItems(first: ${exports.LIST_LINES_COUNTED}) { nodes { quantity } }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
exports.ACCOUNT_ORDER_DETAIL_QUERY = `
|
|
56
|
+
query OrderDetail($id: ID!) {
|
|
57
|
+
order(id: $id) {
|
|
58
|
+
id
|
|
59
|
+
name
|
|
60
|
+
processedAt
|
|
61
|
+
cancelledAt
|
|
62
|
+
fulfillmentStatus
|
|
63
|
+
statusPageUrl
|
|
64
|
+
totalPrice { amount currencyCode }
|
|
65
|
+
subtotal { amount currencyCode }
|
|
66
|
+
totalShipping { amount currencyCode }
|
|
67
|
+
totalTax { amount currencyCode }
|
|
68
|
+
totalRefunded { amount currencyCode }
|
|
69
|
+
discountApplications(first: 10) { nodes { ... on DiscountCodeApplication { code } } }
|
|
70
|
+
lineItems(first: ${exports.ORDER_LINES_READ}) {
|
|
71
|
+
nodes {
|
|
72
|
+
title
|
|
73
|
+
variantTitle
|
|
74
|
+
quantity
|
|
75
|
+
variantId
|
|
76
|
+
image { url }
|
|
77
|
+
price { amount currencyCode }
|
|
78
|
+
totalPrice { amount currencyCode }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
// ── Storefront API (email and password) ────────────────────────────────────
|
|
85
|
+
exports.STOREFRONT_ORDER_HISTORY_QUERY = `
|
|
86
|
+
query CustomerOrderHistory($accessToken: String!, $first: Int!, $after: String) {
|
|
87
|
+
customer(customerAccessToken: $accessToken) {
|
|
88
|
+
orders(first: $first, after: $after, sortKey: PROCESSED_AT, reverse: true) {
|
|
89
|
+
pageInfo { hasNextPage endCursor }
|
|
90
|
+
nodes {
|
|
91
|
+
id
|
|
92
|
+
name
|
|
93
|
+
processedAt
|
|
94
|
+
canceledAt
|
|
95
|
+
fulfillmentStatus
|
|
96
|
+
statusUrl
|
|
97
|
+
totalPrice { amount currencyCode }
|
|
98
|
+
lineItems(first: ${exports.LIST_LINES_COUNTED}) { nodes { quantity } }
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
`;
|
|
104
|
+
/**
|
|
105
|
+
* The Storefront API has no order-by-id query, so one order is found in two cheap reads: its place in
|
|
106
|
+
* the list (ids only, 250 a page), then that one order, read after the cursor of the one before it.
|
|
107
|
+
*/
|
|
108
|
+
exports.STOREFRONT_ORDER_IDS_QUERY = `
|
|
109
|
+
query CustomerOrderIds($accessToken: String!, $after: String) {
|
|
110
|
+
customer(customerAccessToken: $accessToken) {
|
|
111
|
+
orders(first: 250, after: $after, sortKey: PROCESSED_AT, reverse: true) {
|
|
112
|
+
pageInfo { hasNextPage endCursor }
|
|
113
|
+
edges { cursor node { id } }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
exports.STOREFRONT_ORDER_DETAIL_QUERY = `
|
|
119
|
+
query CustomerOrderDetail($accessToken: String!, $after: String) {
|
|
120
|
+
customer(customerAccessToken: $accessToken) {
|
|
121
|
+
orders(first: 1, after: $after, sortKey: PROCESSED_AT, reverse: true) {
|
|
122
|
+
nodes {
|
|
123
|
+
id
|
|
124
|
+
name
|
|
125
|
+
processedAt
|
|
126
|
+
canceledAt
|
|
127
|
+
fulfillmentStatus
|
|
128
|
+
statusUrl
|
|
129
|
+
totalPrice { amount currencyCode }
|
|
130
|
+
subtotalPrice { amount currencyCode }
|
|
131
|
+
totalShippingPrice { amount currencyCode }
|
|
132
|
+
totalTax { amount currencyCode }
|
|
133
|
+
totalRefunded { amount currencyCode }
|
|
134
|
+
discountApplications(first: 10) { nodes { ... on DiscountCodeApplication { code } } }
|
|
135
|
+
lineItems(first: ${exports.ORDER_LINES_READ}) {
|
|
136
|
+
nodes {
|
|
137
|
+
title
|
|
138
|
+
quantity
|
|
139
|
+
originalTotalPrice { amount currencyCode }
|
|
140
|
+
variant { id title image { url } }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
// ── Mapping ────────────────────────────────────────────────────────────────
|
|
149
|
+
/** Production Amber's status card rule: cancelled wins, then the fulfilment status. */
|
|
150
|
+
function orderProgress(cancelledAt, fulfillmentStatus) {
|
|
151
|
+
if (cancelledAt)
|
|
152
|
+
return 'cancelled';
|
|
153
|
+
if (fulfillmentStatus === 'FULFILLED')
|
|
154
|
+
return 'fulfilled';
|
|
155
|
+
if (fulfillmentStatus === 'PARTIALLY_FULFILLED')
|
|
156
|
+
return 'partiallyFulfilled';
|
|
157
|
+
return 'confirmed';
|
|
158
|
+
}
|
|
159
|
+
const nodesOf = (list) => { var _a; return ((_a = list === null || list === void 0 ? void 0 : list.nodes) !== null && _a !== void 0 ? _a : []).filter((node) => !!node); };
|
|
160
|
+
const toCents = (m) => { var _a; return Math.round((Number.parseFloat((_a = m === null || m === void 0 ? void 0 : m.amount) !== null && _a !== void 0 ? _a : '0') || 0) * 100); };
|
|
161
|
+
const fromCents = (cents, currencyCode) => ({ amount: (cents / 100).toFixed(2), currencyCode });
|
|
162
|
+
const copyMoney = (m) => (m ? { amount: m.amount, currencyCode: m.currencyCode } : null);
|
|
163
|
+
/** For the rows a screen shows only when they say something: a zero is null. */
|
|
164
|
+
const unlessZero = (m) => (m && toCents(m) !== 0 ? copyMoney(m) : null);
|
|
165
|
+
/** Shopify's name for the only variant of a product with one. */
|
|
166
|
+
const variantTitleOf = (title) => (title && title !== 'Default Title' ? title : null);
|
|
167
|
+
const codesOf = (list) => nodesOf(list).map((node) => node.code).filter((code) => !!code);
|
|
168
|
+
function fromAccount(raw) {
|
|
169
|
+
var _a, _b, _c, _d, _e;
|
|
170
|
+
return {
|
|
171
|
+
id: raw.id,
|
|
172
|
+
name: (_a = raw.name) !== null && _a !== void 0 ? _a : '',
|
|
173
|
+
processedAt: (_b = raw.processedAt) !== null && _b !== void 0 ? _b : '',
|
|
174
|
+
cancelledAt: (_c = raw.cancelledAt) !== null && _c !== void 0 ? _c : null,
|
|
175
|
+
fulfillmentStatus: (_d = raw.fulfillmentStatus) !== null && _d !== void 0 ? _d : null,
|
|
176
|
+
statusPageUrl: (_e = raw.statusPageUrl) !== null && _e !== void 0 ? _e : null,
|
|
177
|
+
totalPrice: raw.totalPrice,
|
|
178
|
+
lines: nodesOf(raw.lineItems).map((line) => {
|
|
179
|
+
var _a, _b, _c, _d, _e;
|
|
180
|
+
return ({
|
|
181
|
+
title: (_a = line.title) !== null && _a !== void 0 ? _a : '',
|
|
182
|
+
variantTitle: variantTitleOf(line.variantTitle),
|
|
183
|
+
quantity: (_b = line.quantity) !== null && _b !== void 0 ? _b : 0,
|
|
184
|
+
imageUrl: (_d = (_c = line.image) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : null,
|
|
185
|
+
unitPrice: copyMoney(line.price),
|
|
186
|
+
totalPrice: copyMoney(line.totalPrice),
|
|
187
|
+
variantId: (_e = line.variantId) !== null && _e !== void 0 ? _e : null,
|
|
188
|
+
});
|
|
189
|
+
}),
|
|
190
|
+
netSubtotal: raw.subtotal,
|
|
191
|
+
totalShipping: raw.totalShipping,
|
|
192
|
+
totalTax: raw.totalTax,
|
|
193
|
+
totalRefunded: raw.totalRefunded,
|
|
194
|
+
discountCodes: codesOf(raw.discountApplications),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function fromStorefront(raw) {
|
|
198
|
+
var _a, _b, _c, _d, _e;
|
|
199
|
+
return {
|
|
200
|
+
id: raw.id,
|
|
201
|
+
name: (_a = raw.name) !== null && _a !== void 0 ? _a : '',
|
|
202
|
+
processedAt: (_b = raw.processedAt) !== null && _b !== void 0 ? _b : '',
|
|
203
|
+
cancelledAt: (_c = raw.canceledAt) !== null && _c !== void 0 ? _c : null,
|
|
204
|
+
fulfillmentStatus: (_d = raw.fulfillmentStatus) !== null && _d !== void 0 ? _d : null,
|
|
205
|
+
statusPageUrl: (_e = raw.statusUrl) !== null && _e !== void 0 ? _e : null,
|
|
206
|
+
totalPrice: raw.totalPrice,
|
|
207
|
+
lines: nodesOf(raw.lineItems).map((line) => {
|
|
208
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
209
|
+
const quantity = (_a = line.quantity) !== null && _a !== void 0 ? _a : 0;
|
|
210
|
+
const total = line.originalTotalPrice;
|
|
211
|
+
return {
|
|
212
|
+
title: (_b = line.title) !== null && _b !== void 0 ? _b : '',
|
|
213
|
+
variantTitle: variantTitleOf((_c = line.variant) === null || _c === void 0 ? void 0 : _c.title),
|
|
214
|
+
quantity,
|
|
215
|
+
imageUrl: (_f = (_e = (_d = line.variant) === null || _d === void 0 ? void 0 : _d.image) === null || _e === void 0 ? void 0 : _e.url) !== null && _f !== void 0 ? _f : null,
|
|
216
|
+
// The Storefront API has no unit price on an order line; its pre-discount total is one times quantity.
|
|
217
|
+
unitPrice: total && quantity > 0 ? fromCents(Math.round(toCents(total) / quantity), total.currencyCode) : null,
|
|
218
|
+
totalPrice: copyMoney(total),
|
|
219
|
+
variantId: (_h = (_g = line.variant) === null || _g === void 0 ? void 0 : _g.id) !== null && _h !== void 0 ? _h : null,
|
|
220
|
+
};
|
|
221
|
+
}),
|
|
222
|
+
netSubtotal: raw.subtotalPrice,
|
|
223
|
+
totalShipping: raw.totalShippingPrice,
|
|
224
|
+
totalTax: raw.totalTax,
|
|
225
|
+
totalRefunded: raw.totalRefunded,
|
|
226
|
+
discountCodes: codesOf(raw.discountApplications),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function toSummary(order) {
|
|
230
|
+
var _a;
|
|
231
|
+
return {
|
|
232
|
+
id: order.id,
|
|
233
|
+
name: order.name,
|
|
234
|
+
processedAt: order.processedAt,
|
|
235
|
+
progress: orderProgress(order.cancelledAt, order.fulfillmentStatus),
|
|
236
|
+
cancelledAt: order.cancelledAt,
|
|
237
|
+
totalPrice: (_a = copyMoney(order.totalPrice)) !== null && _a !== void 0 ? _a : { amount: '0.00', currencyCode: '' },
|
|
238
|
+
itemCount: order.lines.reduce((sum, line) => sum + line.quantity, 0),
|
|
239
|
+
statusPageUrl: order.statusPageUrl,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Production Amber's totals: the subtotal shown is the lines before discounts, and the discount is the
|
|
244
|
+
* gap between that and Shopify's subtotal (which is after every discount, line or order level), so a
|
|
245
|
+
* whole-order code that lands on no single line is counted too.
|
|
246
|
+
*/
|
|
247
|
+
function toDetails(order) {
|
|
248
|
+
var _a, _b, _c, _d;
|
|
249
|
+
const currencyCode = (_d = (_b = (_a = order.totalPrice) === null || _a === void 0 ? void 0 : _a.currencyCode) !== null && _b !== void 0 ? _b : (_c = order.netSubtotal) === null || _c === void 0 ? void 0 : _c.currencyCode) !== null && _d !== void 0 ? _d : '';
|
|
250
|
+
const lineTotals = order.lines.map((line) => line.totalPrice).filter((total) => !!total);
|
|
251
|
+
const itemsCents = lineTotals.reduce((sum, total) => sum + toCents(total), 0);
|
|
252
|
+
const netCents = order.netSubtotal ? toCents(order.netSubtotal) : itemsCents;
|
|
253
|
+
const discountCents = Math.max(0, itemsCents - netCents);
|
|
254
|
+
return {
|
|
255
|
+
...toSummary(order),
|
|
256
|
+
lineItems: order.lines,
|
|
257
|
+
subtotal: itemsCents > 0 ? fromCents(itemsCents, currencyCode) : copyMoney(order.netSubtotal),
|
|
258
|
+
totalShipping: copyMoney(order.totalShipping),
|
|
259
|
+
totalTax: unlessZero(order.totalTax),
|
|
260
|
+
totalDiscount: discountCents > 0 ? fromCents(discountCents, currencyCode) : null,
|
|
261
|
+
totalRefunded: unlessZero(order.totalRefunded),
|
|
262
|
+
discountCodes: order.discountCodes,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// ── Reading ────────────────────────────────────────────────────────────────
|
|
266
|
+
/**
|
|
267
|
+
* Leeway for the phone's clock against Shopify's when telling a new order from the one before it: an
|
|
268
|
+
* order placed up to this long before `since` still counts (`useLatestOrderSince`). 2 minutes.
|
|
269
|
+
*/
|
|
270
|
+
exports.ORDER_CLOCK_LEEWAY_MS = 2 * 60 * 1000;
|
|
271
|
+
/**
|
|
272
|
+
* Whether an order was placed at or after `since` (ms since 1970), less `clockLeewayMs`. Every order
|
|
273
|
+
* counts when `since` is null or undefined. An order whose date can't be read never counts.
|
|
274
|
+
*/
|
|
275
|
+
function placedSince(order, since, clockLeewayMs = exports.ORDER_CLOCK_LEEWAY_MS) {
|
|
276
|
+
if (since == null)
|
|
277
|
+
return true;
|
|
278
|
+
return Date.parse(order.processedAt) >= since - clockLeewayMs;
|
|
279
|
+
}
|
|
280
|
+
const sessionEnded = () => new types_1.ShopifyError('The customer session has ended');
|
|
281
|
+
function toPage(raw, read) {
|
|
282
|
+
var _a, _b, _c, _d, _e;
|
|
283
|
+
return {
|
|
284
|
+
orders: ((_a = raw === null || raw === void 0 ? void 0 : raw.nodes) !== null && _a !== void 0 ? _a : []).filter((node) => !!node).map((node) => toSummary(read(node))),
|
|
285
|
+
endCursor: (_c = (_b = raw === null || raw === void 0 ? void 0 : raw.pageInfo) === null || _b === void 0 ? void 0 : _b.endCursor) !== null && _c !== void 0 ? _c : null,
|
|
286
|
+
hasNextPage: !!((_d = raw === null || raw === void 0 ? void 0 : raw.pageInfo) === null || _d === void 0 ? void 0 : _d.hasNextPage) && !!((_e = raw === null || raw === void 0 ? void 0 : raw.pageInfo) === null || _e === void 0 ? void 0 : _e.endCursor),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/** Shopify sign-in: the Customer Account API. */
|
|
290
|
+
function customerAccountOrders(accountRequest) {
|
|
291
|
+
return {
|
|
292
|
+
async list(first, after) {
|
|
293
|
+
var _a;
|
|
294
|
+
const data = await accountRequest(exports.ACCOUNT_ORDER_HISTORY_QUERY, { first, after });
|
|
295
|
+
return toPage((_a = data.customer) === null || _a === void 0 ? void 0 : _a.orders, fromAccount);
|
|
296
|
+
},
|
|
297
|
+
async get(id) {
|
|
298
|
+
const data = await accountRequest(exports.ACCOUNT_ORDER_DETAIL_QUERY, { id });
|
|
299
|
+
return data.order ? toDetails(fromAccount(data.order)) : null;
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Email and password: the Storefront API, with the session's token. A token Shopify no longer accepts
|
|
305
|
+
* reads `customer: null`, which is the session ending, not an empty history.
|
|
306
|
+
*/
|
|
307
|
+
function storefrontOrders(getAccessToken) {
|
|
308
|
+
async function token() {
|
|
309
|
+
const accessToken = await getAccessToken();
|
|
310
|
+
if (!accessToken)
|
|
311
|
+
throw sessionEnded();
|
|
312
|
+
return accessToken;
|
|
313
|
+
}
|
|
314
|
+
/** The cursor to read `id` after (null: it is the newest), or undefined when there is no such order. */
|
|
315
|
+
async function cursorBefore(accessToken, id) {
|
|
316
|
+
let after = null;
|
|
317
|
+
for (;;) {
|
|
318
|
+
const data = await (0, client_1.request)(exports.STOREFRONT_ORDER_IDS_QUERY, {
|
|
319
|
+
accessToken,
|
|
320
|
+
after,
|
|
321
|
+
});
|
|
322
|
+
if (!data.customer)
|
|
323
|
+
throw sessionEnded();
|
|
324
|
+
const { edges, pageInfo } = data.customer.orders;
|
|
325
|
+
const at = edges.findIndex((edge) => edge.node.id === id);
|
|
326
|
+
if (at >= 0)
|
|
327
|
+
return at === 0 ? after : edges[at - 1].cursor;
|
|
328
|
+
if (!pageInfo.hasNextPage || !pageInfo.endCursor)
|
|
329
|
+
return undefined;
|
|
330
|
+
after = pageInfo.endCursor;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
async list(first, after) {
|
|
335
|
+
const data = await (0, client_1.request)(exports.STOREFRONT_ORDER_HISTORY_QUERY, {
|
|
336
|
+
accessToken: await token(),
|
|
337
|
+
first,
|
|
338
|
+
after,
|
|
339
|
+
});
|
|
340
|
+
if (!data.customer)
|
|
341
|
+
throw sessionEnded();
|
|
342
|
+
return toPage(data.customer.orders, fromStorefront);
|
|
343
|
+
},
|
|
344
|
+
async get(id) {
|
|
345
|
+
const accessToken = await token();
|
|
346
|
+
// Twice at most: an order placed between the two reads moves the one asked for along by one.
|
|
347
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
348
|
+
const after = await cursorBefore(accessToken, id);
|
|
349
|
+
if (after === undefined)
|
|
350
|
+
return null;
|
|
351
|
+
const data = await (0, client_1.request)(exports.STOREFRONT_ORDER_DETAIL_QUERY, { accessToken, after });
|
|
352
|
+
if (!data.customer)
|
|
353
|
+
throw sessionEnded();
|
|
354
|
+
const node = data.customer.orders.nodes[0];
|
|
355
|
+
if ((node === null || node === void 0 ? void 0 : node.id) === id)
|
|
356
|
+
return toDetails(fromStorefront(node));
|
|
357
|
+
}
|
|
358
|
+
throw new types_1.ShopifyError('The order list changed while it was being read; try again');
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* A refreshed first page laid over what is on screen. The pages loaded after it are kept, so a list
|
|
364
|
+
* scrolled down stays where it was (they aren't re-read). When the fresh page doesn't reach back to
|
|
365
|
+
* them (many new orders since), or it is the whole history, it replaces the list.
|
|
366
|
+
*/
|
|
367
|
+
function withFreshFirstPage(shown, page) {
|
|
368
|
+
const fresh = { orders: page.orders, endCursor: page.endCursor, hasMore: page.hasNextPage };
|
|
369
|
+
if (!page.hasNextPage || page.orders.length === 0)
|
|
370
|
+
return fresh;
|
|
371
|
+
const lastFresh = page.orders[page.orders.length - 1].id;
|
|
372
|
+
const at = shown.orders.findIndex((order) => order.id === lastFresh);
|
|
373
|
+
if (at < 0)
|
|
374
|
+
return fresh;
|
|
375
|
+
const freshIds = new Set(page.orders.map((order) => order.id));
|
|
376
|
+
const rest = shown.orders.slice(at + 1).filter((order) => !freshIds.has(order.id));
|
|
377
|
+
if (rest.length === 0)
|
|
378
|
+
return fresh;
|
|
379
|
+
return { orders: [...page.orders, ...rest], endCursor: shown.endCursor, hasMore: shown.hasMore };
|
|
380
|
+
}
|
|
381
|
+
/** The next page after what is shown, leaving out any order already there. */
|
|
382
|
+
function withNextPage(shown, page) {
|
|
383
|
+
const ids = new Set(shown.orders.map((order) => order.id));
|
|
384
|
+
return {
|
|
385
|
+
orders: [...shown.orders, ...page.orders.filter((order) => !ids.has(order.id))],
|
|
386
|
+
endCursor: page.endCursor,
|
|
387
|
+
hasMore: page.hasNextPage,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Which of an order's lines can go back in the cart, and how many of each, by the cart's stock rule
|
|
392
|
+
* (`stockCeiling`, as `useAddToCart` checks it): a quantity over what is left is cut to what is left,
|
|
393
|
+
* counting what the cart already holds and what earlier lines of this order take. `variants` are read
|
|
394
|
+
* fresh; a line whose variant isn't among them no longer exists.
|
|
395
|
+
*
|
|
396
|
+
* A variant still sold out and enrolled in pre-order (a selling plan) goes back on that plan, at the
|
|
397
|
+
* ordered quantity: a pre-order isn't limited by stock. Everything else goes back as an ordinary line.
|
|
398
|
+
* The same "sold out and on a plan" rule as the Waitlist's pre-order add. Decided 2026-10-04 by the
|
|
399
|
+
* Head of Engineering: "if item is still out of stock with selling plan add them as pre order
|
|
400
|
+
* otherwise add it normally".
|
|
401
|
+
*
|
|
402
|
+
* `options.skipVariant` leaves out (and counts as skipped) every line whose variant it returns true
|
|
403
|
+
* for, before anything is added or claimed. The app passes Cart Hold's `isHeldOut`, so a size whose
|
|
404
|
+
* every unit was just found held in other carts isn't tried again. Decided 2026-10-04 by the Head of
|
|
405
|
+
* Engineering.
|
|
406
|
+
*/
|
|
407
|
+
function planBuyAgain(lines, variants, cart, options = {}) {
|
|
408
|
+
var _a, _b, _c, _d;
|
|
409
|
+
const byId = new Map(variants.map((variant) => [variant.id, variant]));
|
|
410
|
+
const planned = new Map();
|
|
411
|
+
const inputs = [];
|
|
412
|
+
let skipped = 0;
|
|
413
|
+
for (const line of lines) {
|
|
414
|
+
const variant = line.variantId ? byId.get(line.variantId) : undefined;
|
|
415
|
+
if (!variant || !variant.availableForSale || line.quantity <= 0) {
|
|
416
|
+
skipped += 1;
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
if ((_a = options.skipVariant) === null || _a === void 0 ? void 0 : _a.call(options, variant.id)) {
|
|
420
|
+
skipped += 1;
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
if (((_b = variant.quantityAvailable) !== null && _b !== void 0 ? _b : 0) <= 0 && variant.sellingPlan) {
|
|
424
|
+
inputs.push({ merchandiseId: variant.id, quantity: line.quantity, sellingPlanId: variant.sellingPlan.id });
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
const ceiling = (0, productPage_1.stockCeiling)(variant);
|
|
428
|
+
const taken = (0, productPage_1.quantityInCart)(cart, variant.id) + ((_c = planned.get(variant.id)) !== null && _c !== void 0 ? _c : 0);
|
|
429
|
+
const quantity = ceiling === null ? line.quantity : Math.min(line.quantity, ceiling - taken);
|
|
430
|
+
if (quantity <= 0) {
|
|
431
|
+
skipped += 1;
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
planned.set(variant.id, ((_d = planned.get(variant.id)) !== null && _d !== void 0 ? _d : 0) + quantity);
|
|
435
|
+
inputs.push({ merchandiseId: variant.id, quantity });
|
|
436
|
+
}
|
|
437
|
+
return { inputs, skipped };
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=orders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../src/orders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { ProductBase } from './productStore';
|
|
2
|
+
import type { Cart, Money, Product, ProductMedia, ProductOption, ProductVariant } from './types';
|
|
3
|
+
/** What the page logic needs of a product: the full product, or the store's preview of it. */
|
|
4
|
+
export type ProductLike = ProductBase & Partial<Pick<Product, 'media' | 'onlineStoreUrl' | 'images'>>;
|
|
5
|
+
/** Chosen value per option name, e.g. `{ Size: 'SM', Color: 'Wine' }`. */
|
|
6
|
+
export type OptionSelection = Record<string, string>;
|
|
7
|
+
/** Selectors are shown Color, then Size, then anything else (case-insensitive). */
|
|
8
|
+
export declare const DEFAULT_OPTION_ORDER: readonly string[];
|
|
9
|
+
/**
|
|
10
|
+
* Shopify gives a single-variant product a placeholder option ("Title" with the one value "Default
|
|
11
|
+
* Title"). It is not a choice and must not become a selector.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isPlaceholderOption(option: ProductOption): boolean;
|
|
14
|
+
export interface SelectableOptionsConfig {
|
|
15
|
+
/** Option names in display order (case-insensitive); unlisted ones keep their order after these. */
|
|
16
|
+
order?: readonly string[];
|
|
17
|
+
/** Keep an option (default: everything but the placeholder). */
|
|
18
|
+
include?: (option: ProductOption) => boolean;
|
|
19
|
+
}
|
|
20
|
+
/** The options worth a selector, in display order. */
|
|
21
|
+
export declare function selectableOptions(options: ProductOption[] | null | undefined, config?: SelectableOptionsConfig): ProductOption[];
|
|
22
|
+
/** The variant matching every chosen value, or null for a combination Shopify doesn't sell. */
|
|
23
|
+
export declare function findVariant(variants: ProductVariant[] | null | undefined, selection: OptionSelection): ProductVariant | null;
|
|
24
|
+
/** The first purchasable combination, so Add to Cart works without touching a selector; else the first. */
|
|
25
|
+
export declare function initialSelection(variants: ProductVariant[] | null | undefined): OptionSelection;
|
|
26
|
+
/** The selection a variant represents, e.g. to preselect a variant from a link. */
|
|
27
|
+
export declare function selectionForVariant(variant: ProductVariant | null | undefined): OptionSelection;
|
|
28
|
+
/**
|
|
29
|
+
* Can't be bought now: no such combination, not for sale, or none left. A variant can be 0 left and
|
|
30
|
+
* still for sale (oversell / pre-order) only if `quantityAvailable` isn't 0, so 0 is treated as gone.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isVariantUnavailable(variant: ProductVariant | null | undefined): boolean;
|
|
33
|
+
export interface OptionValueState {
|
|
34
|
+
value: string;
|
|
35
|
+
selected: boolean;
|
|
36
|
+
/** The variant this value would select, keeping the other options as they are. */
|
|
37
|
+
variant: ProductVariant | null;
|
|
38
|
+
available: boolean;
|
|
39
|
+
/** Units left of that variant; null when Shopify doesn't track it. */
|
|
40
|
+
quantityAvailable: number | null;
|
|
41
|
+
}
|
|
42
|
+
export interface OptionState {
|
|
43
|
+
name: string;
|
|
44
|
+
selectedValue: string | null;
|
|
45
|
+
values: OptionValueState[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Every value of every option with what choosing it would give. Stock is per combination, so a
|
|
49
|
+
* Size's count follows the selected Color and vice versa.
|
|
50
|
+
*/
|
|
51
|
+
export declare function optionStates(options: ProductOption[], variants: ProductVariant[] | null | undefined, selection: OptionSelection, isUnavailable?: (variant: ProductVariant | null) => boolean): OptionState[];
|
|
52
|
+
/** "Ivory / L": the chosen values, in the options' order. */
|
|
53
|
+
export declare function selectionLabel(options: ProductOption[], selection: OptionSelection, separator?: string): string;
|
|
54
|
+
export interface VariantPrice {
|
|
55
|
+
price: Money | null;
|
|
56
|
+
/** Only when it is above `price`; Shopify returns "0.0" for "no compare-at". */
|
|
57
|
+
compareAtPrice: Money | null;
|
|
58
|
+
onSale: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** The chosen variant's price; without a variant, the product's lowest. */
|
|
61
|
+
export declare function variantPrice(variant: ProductVariant | null | undefined, product?: Pick<ProductBase, 'priceRange' | 'compareAtPriceRange'> | null): VariantPrice;
|
|
62
|
+
/** "Hurry! Only a few pieces left." at or below this many units across the product. */
|
|
63
|
+
export declare const DEFAULT_LOW_STOCK_THRESHOLD = 10;
|
|
64
|
+
export declare function isLowStock(totalInventory: number | null | undefined, availableForSale: boolean | undefined, threshold?: number | null): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* The most of `variant` a cart may hold, or null for no ceiling. Shopify doesn't refuse an add past
|
|
67
|
+
* the stock level (it answers 200 and clamps silently), so the ceiling is checked before the write.
|
|
68
|
+
* null: untracked inventory, or overselling allowed (`<= 0` while still for sale, e.g. pre-order).
|
|
69
|
+
*/
|
|
70
|
+
export declare function stockCeiling(variant: Pick<ProductVariant, 'availableForSale' | 'quantityAvailable'> | null | undefined): number | null;
|
|
71
|
+
/** How many of `variantId` the cart holds, across every line (one variant can fill several). */
|
|
72
|
+
export declare function quantityInCart(cart: Pick<Cart, 'lines'> | null | undefined, variantId: string | null | undefined): number;
|
|
73
|
+
/** Whether `current + by` stays within `ceiling` (null: always). */
|
|
74
|
+
export declare function withinCeiling(ceiling: number | null, current: number, by?: number): boolean;
|
|
75
|
+
/** The gallery's opening slide: the first video when asked for (and there is one), else the first image. */
|
|
76
|
+
export declare function initialMediaIndex(media: ProductMedia[] | null | undefined, preferVideo?: boolean): number;
|
|
77
|
+
/** The first still, for a thumbnail. Videos sort first, so `media[0]` is often a video frame. */
|
|
78
|
+
export declare function firstImageUrl(product: Pick<ProductLike, 'media' | 'featuredImage'> | null | undefined): string | null;
|
|
79
|
+
export declare function sizedImageUrl(url: string | null | undefined, pixels: number): string | null;
|
|
80
|
+
export type DescriptionSpan = {
|
|
81
|
+
text: string;
|
|
82
|
+
bold: boolean;
|
|
83
|
+
};
|
|
84
|
+
/** A paragraph or a bullet. */
|
|
85
|
+
export type DescriptionBlock = {
|
|
86
|
+
spans: DescriptionSpan[];
|
|
87
|
+
bullet: boolean;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Shopify's `descriptionHtml` as paragraphs and bullets with their bold runs (the "Details:" /
|
|
91
|
+
* "Fit:" labels), for nested Text rather than an HTML renderer. Plain text works too.
|
|
92
|
+
*/
|
|
93
|
+
export declare function parseDescriptionHtml(html: string | null | undefined): DescriptionBlock[];
|
|
94
|
+
/**
|
|
95
|
+
* The link to share: Shopify's `onlineStoreUrl` (a page a shopper can open), else
|
|
96
|
+
* `https://<storeDomain>/products/<handle>`, which on a store not on the Online Store channel is the
|
|
97
|
+
* myshopify host. `storeDomain` defaults to the configured one.
|
|
98
|
+
*/
|
|
99
|
+
export declare function productShareUrl(product: Pick<ProductLike, 'handle' | 'onlineStoreUrl'> | null | undefined, storeDomain?: string): string | null;
|
|
100
|
+
//# sourceMappingURL=productPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productPage.d.ts","sourceRoot":"","sources":["../src/productPage.ts"],"names":[],"mappings":"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"}
|