@ehrenkind/shopify-lib 0.0.2
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 +172 -0
- package/dist/generated-api-types/2025-04/admin.generated.d.ts +181 -0
- package/dist/generated-api-types/2025-04/admin.generated.d.ts.map +1 -0
- package/dist/generated-api-types/2025-04/admin.generated.js +5 -0
- package/dist/generated-api-types/2025-04/admin.generated.js.map +1 -0
- package/dist/generated-api-types/2025-04/admin.types.d.ts +57664 -0
- package/dist/generated-api-types/2025-04/admin.types.d.ts.map +1 -0
- package/dist/generated-api-types/2025-04/admin.types.js +11356 -0
- package/dist/generated-api-types/2025-04/admin.types.js.map +1 -0
- package/dist/index.cjs +752 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +18290 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +719 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.d.ts +4 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.d.ts.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.js +56 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.js.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.d.ts +3 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.d.ts.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.js +11 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.js.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.d.ts +2 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.d.ts.map +1 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.js +11 -0
- package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.js.map +1 -0
- package/dist/queries/orders/getOrderByName.d.ts +26 -0
- package/dist/queries/orders/getOrderByName.d.ts.map +1 -0
- package/dist/queries/orders/getOrderByName.js +117 -0
- package/dist/queries/orders/getOrderByName.js.map +1 -0
- package/dist/queries/orders/getOrderByName.mock.d.ts +21 -0
- package/dist/queries/orders/getOrderByName.mock.d.ts.map +1 -0
- package/dist/queries/orders/getOrderByName.mock.js +55 -0
- package/dist/queries/orders/getOrderByName.mock.js.map +1 -0
- package/dist/queries/orders/getOrderByName.queries.d.ts +3 -0
- package/dist/queries/orders/getOrderByName.queries.d.ts.map +1 -0
- package/dist/queries/orders/getOrderByName.queries.js +335 -0
- package/dist/queries/orders/getOrderByName.queries.js.map +1 -0
- package/dist/queries/orders/getOrderByName.test.d.ts +2 -0
- package/dist/queries/orders/getOrderByName.test.d.ts.map +1 -0
- package/dist/queries/orders/getOrderByName.test.js +28 -0
- package/dist/queries/orders/getOrderByName.test.js.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.d.ts +21 -0
- package/dist/queries/productVariants/getLeanProductVariants.d.ts.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.js +81 -0
- package/dist/queries/productVariants/getLeanProductVariants.js.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.mock.d.ts +3 -0
- package/dist/queries/productVariants/getLeanProductVariants.mock.d.ts.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.mock.js +33 -0
- package/dist/queries/productVariants/getLeanProductVariants.mock.js.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.test.d.ts +2 -0
- package/dist/queries/productVariants/getLeanProductVariants.test.d.ts.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.test.js +38 -0
- package/dist/queries/productVariants/getLeanProductVariants.test.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mswHandlers.d.ts +2 -0
- package/dist/utils/mswHandlers.d.ts.map +1 -0
- package/dist/utils/mswHandlers.js +32 -0
- package/dist/utils/mswHandlers.js.map +1 -0
- package/dist/utils/shopifyClient.d.ts +6 -0
- package/dist/utils/shopifyClient.d.ts.map +1 -0
- package/dist/utils/shopifyClient.js +82 -0
- package/dist/utils/shopifyClient.js.map +1 -0
- package/dist/utils/shopifyClient.mock.d.ts +3 -0
- package/dist/utils/shopifyClient.mock.d.ts.map +1 -0
- package/dist/utils/shopifyClient.mock.js +19 -0
- package/dist/utils/shopifyClient.mock.js.map +1 -0
- package/dist/utils/shopifyClient.test.d.ts +2 -0
- package/dist/utils/shopifyClient.test.d.ts.map +1 -0
- package/dist/utils/shopifyClient.test.js +27 -0
- package/dist/utils/shopifyClient.test.js.map +1 -0
- package/dist/utils/shopifyFetch.d.ts +19 -0
- package/dist/utils/shopifyFetch.d.ts.map +1 -0
- package/dist/utils/shopifyFetch.js +60 -0
- package/dist/utils/shopifyFetch.js.map +1 -0
- package/dist/utils/shopifyFetch.test.d.ts +2 -0
- package/dist/utils/shopifyFetch.test.d.ts.map +1 -0
- package/dist/utils/shopifyFetch.test.js +17 -0
- package/dist/utils/shopifyFetch.test.js.map +1 -0
- package/dist/utils/test-setup.d.ts +2 -0
- package/dist/utils/test-setup.d.ts.map +1 -0
- package/dist/utils/test-setup.js +13 -0
- package/dist/utils/test-setup.js.map +1 -0
- package/dist/utils/zod.d.ts +3 -0
- package/dist/utils/zod.d.ts.map +1 -0
- package/dist/utils/zod.js +19 -0
- package/dist/utils/zod.js.map +1 -0
- package/package.json +75 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
// src/queries/orders/getOrderByName.ts
|
|
2
|
+
import z3 from "zod";
|
|
3
|
+
|
|
4
|
+
// src/utils/logger.ts
|
|
5
|
+
var { env } = process;
|
|
6
|
+
var gql = String.raw;
|
|
7
|
+
var logLevels = {
|
|
8
|
+
silent: 0,
|
|
9
|
+
error: 1,
|
|
10
|
+
warn: 2,
|
|
11
|
+
info: 3,
|
|
12
|
+
debug: 4
|
|
13
|
+
};
|
|
14
|
+
function getLogLevel(nodeEnv, logLevelEnv) {
|
|
15
|
+
if (logLevelEnv && logLevelEnv in logLevels) {
|
|
16
|
+
return logLevelEnv;
|
|
17
|
+
}
|
|
18
|
+
if (nodeEnv === "test") {
|
|
19
|
+
return "silent";
|
|
20
|
+
}
|
|
21
|
+
if (nodeEnv === "production") {
|
|
22
|
+
return "info";
|
|
23
|
+
}
|
|
24
|
+
return "debug";
|
|
25
|
+
}
|
|
26
|
+
var activeLogLevelName = getLogLevel(env.NODE_ENV, env.LOG_LEVEL);
|
|
27
|
+
var activeLogLevelValue = logLevels[activeLogLevelName];
|
|
28
|
+
var logger = {
|
|
29
|
+
debug: (...args) => {
|
|
30
|
+
if (logLevels.debug <= activeLogLevelValue) {
|
|
31
|
+
console.debug(...args);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
info: (...args) => {
|
|
35
|
+
if (logLevels.info <= activeLogLevelValue) {
|
|
36
|
+
console.info(...args);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
warn: (...args) => {
|
|
40
|
+
if (logLevels.warn <= activeLogLevelValue) {
|
|
41
|
+
console.warn(...args);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
error: (...args) => {
|
|
45
|
+
if (logLevels.error <= activeLogLevelValue) {
|
|
46
|
+
console.error(...args);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/utils/shopifyClient.ts
|
|
52
|
+
import {
|
|
53
|
+
ApiVersion,
|
|
54
|
+
LogSeverity,
|
|
55
|
+
Session,
|
|
56
|
+
shopifyApi
|
|
57
|
+
} from "@shopify/shopify-api";
|
|
58
|
+
import "@shopify/shopify-api/adapters/node";
|
|
59
|
+
import dotenv from "dotenv";
|
|
60
|
+
import { z } from "zod";
|
|
61
|
+
var SHOPIFY_API_VERSION = ApiVersion.April25;
|
|
62
|
+
dotenv.config();
|
|
63
|
+
var envSchema = z.object({
|
|
64
|
+
SHOPIFY_API_KEY: z.string({
|
|
65
|
+
error: () => ({ message: "SHOPIFY_API_KEY is required" })
|
|
66
|
+
}),
|
|
67
|
+
SHOPIFY_API_SECRET: z.string({
|
|
68
|
+
error: () => ({ message: "SHOPIFY_API_SECRET is required" })
|
|
69
|
+
}),
|
|
70
|
+
SHOPIFY_API_HOSTNAME: z.string({
|
|
71
|
+
error: () => ({ message: "SHOPIFY_API_HOSTNAME is required" })
|
|
72
|
+
}),
|
|
73
|
+
SHOPIFY_ACCESS_TOKEN: z.string({
|
|
74
|
+
error: () => ({ message: "SHOPIFY_ACCESS_TOKEN is required" })
|
|
75
|
+
}),
|
|
76
|
+
NODE_ENV: z.enum(["development", "production", "test"]).default("development")
|
|
77
|
+
});
|
|
78
|
+
var mapLogLevelToShopifySeverity = (level) => {
|
|
79
|
+
switch (level) {
|
|
80
|
+
case "silent":
|
|
81
|
+
return LogSeverity.Error;
|
|
82
|
+
case "debug":
|
|
83
|
+
return LogSeverity.Debug;
|
|
84
|
+
case "info":
|
|
85
|
+
return LogSeverity.Info;
|
|
86
|
+
case "warn":
|
|
87
|
+
return LogSeverity.Warning;
|
|
88
|
+
case "error":
|
|
89
|
+
return LogSeverity.Error;
|
|
90
|
+
default:
|
|
91
|
+
return LogSeverity.Info;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
var shopifyGraphqlClient;
|
|
95
|
+
try {
|
|
96
|
+
const env2 = envSchema.parse(process.env);
|
|
97
|
+
const shopify = shopifyApi({
|
|
98
|
+
apiKey: env2.SHOPIFY_API_KEY,
|
|
99
|
+
apiSecretKey: env2.SHOPIFY_API_SECRET,
|
|
100
|
+
hostName: env2.SHOPIFY_API_HOSTNAME,
|
|
101
|
+
apiVersion: SHOPIFY_API_VERSION,
|
|
102
|
+
isEmbeddedApp: false,
|
|
103
|
+
logger: { level: mapLogLevelToShopifySeverity(activeLogLevelName) },
|
|
104
|
+
future: {
|
|
105
|
+
customerAddressDefaultFix: true,
|
|
106
|
+
lineItemBilling: true,
|
|
107
|
+
unstable_managedPricingSupport: false
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const shopifySession = new Session({
|
|
111
|
+
id: `custom-session-${env2.SHOPIFY_API_HOSTNAME}`,
|
|
112
|
+
shop: env2.SHOPIFY_API_HOSTNAME,
|
|
113
|
+
state: "authenticated",
|
|
114
|
+
isOnline: true,
|
|
115
|
+
accessToken: env2.SHOPIFY_ACCESS_TOKEN
|
|
116
|
+
});
|
|
117
|
+
shopifyGraphqlClient = new shopify.clients.Graphql({
|
|
118
|
+
session: shopifySession
|
|
119
|
+
});
|
|
120
|
+
logger.info("Shopify API client initialized successfully.");
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (error instanceof z.ZodError) {
|
|
123
|
+
const msg = z.prettifyError(error);
|
|
124
|
+
logger.error(msg);
|
|
125
|
+
} else {
|
|
126
|
+
logger.error("Failed to initialize Shopify API client:", error);
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/utils/shopifyFetch.ts
|
|
132
|
+
async function fetchShopifyGraphql(params) {
|
|
133
|
+
const {
|
|
134
|
+
query,
|
|
135
|
+
variables: initialVariables,
|
|
136
|
+
dataExtractor,
|
|
137
|
+
fetchAllPages = false
|
|
138
|
+
} = params;
|
|
139
|
+
const allNodes = [];
|
|
140
|
+
let currentVariables = { ...initialVariables };
|
|
141
|
+
let hasNextLoop = true;
|
|
142
|
+
do {
|
|
143
|
+
const response = await shopifyGraphqlClient.request(query, {
|
|
144
|
+
variables: currentVariables
|
|
145
|
+
});
|
|
146
|
+
if (response.errors) {
|
|
147
|
+
let errorMessages = "GraphQL query failed.";
|
|
148
|
+
const errors = response.errors;
|
|
149
|
+
if (Array.isArray(errors)) {
|
|
150
|
+
errorMessages = errors.map((e) => e.message || JSON.stringify(e)).join("\n");
|
|
151
|
+
} else if (typeof errors === "object" && errors !== null && "message" in errors) {
|
|
152
|
+
errorMessages = errors.message || JSON.stringify(errors);
|
|
153
|
+
} else if (typeof errors === "string") {
|
|
154
|
+
errorMessages = errors;
|
|
155
|
+
} else {
|
|
156
|
+
errorMessages = JSON.stringify(errors);
|
|
157
|
+
}
|
|
158
|
+
logger.error("GraphQL query failed:", errorMessages);
|
|
159
|
+
throw new Error(`GraphQL errors: ${errorMessages}`);
|
|
160
|
+
}
|
|
161
|
+
if (!response.data) {
|
|
162
|
+
throw new Error("No data in Shopify API response");
|
|
163
|
+
}
|
|
164
|
+
const { nodes, pageInfo, userErrors } = dataExtractor(response.data);
|
|
165
|
+
if (Array.isArray(userErrors) && userErrors.length > 0) {
|
|
166
|
+
const errorMessages = userErrors.map((e) => e.message || JSON.stringify(e)).join("\n");
|
|
167
|
+
logger.error("Shopify mutation userErrors:", errorMessages);
|
|
168
|
+
throw new Error(`Shopify mutation userErrors: ${errorMessages}`);
|
|
169
|
+
}
|
|
170
|
+
allNodes.push(...nodes);
|
|
171
|
+
hasNextLoop = fetchAllPages ? !!pageInfo?.hasNextPage : false;
|
|
172
|
+
if (hasNextLoop && pageInfo?.endCursor) {
|
|
173
|
+
currentVariables = {
|
|
174
|
+
...currentVariables,
|
|
175
|
+
after: pageInfo.endCursor
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
} while (hasNextLoop);
|
|
179
|
+
return allNodes;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/utils/zod.ts
|
|
183
|
+
import z2 from "zod";
|
|
184
|
+
async function returnOutputParsed(data, Model) {
|
|
185
|
+
const parsed = await Model.safeParseAsync(data);
|
|
186
|
+
if (!parsed.success) {
|
|
187
|
+
if (parsed.error instanceof z2.ZodError) {
|
|
188
|
+
const msg = z2.prettifyError(parsed.error);
|
|
189
|
+
logger.error(msg);
|
|
190
|
+
} else {
|
|
191
|
+
logger.error("Failed to parse:", parsed.error);
|
|
192
|
+
}
|
|
193
|
+
throw new Error("Failed to parse product variants");
|
|
194
|
+
}
|
|
195
|
+
logger.info("Parsed data successfully");
|
|
196
|
+
return parsed.data;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/queries/orders/getOrderByName.queries.ts
|
|
200
|
+
var queryOrdersByName = gql`#graphql
|
|
201
|
+
query ordersByName($first: Int!, $queryFilter: String!) {
|
|
202
|
+
orders(first: $first, query: $queryFilter) {
|
|
203
|
+
edges {
|
|
204
|
+
node {
|
|
205
|
+
id
|
|
206
|
+
name
|
|
207
|
+
createdAt
|
|
208
|
+
updatedAt
|
|
209
|
+
totalPriceSet {
|
|
210
|
+
shopMoney {
|
|
211
|
+
amount
|
|
212
|
+
currencyCode
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
customer {
|
|
216
|
+
id
|
|
217
|
+
lastName
|
|
218
|
+
defaultEmailAddress {
|
|
219
|
+
emailAddress
|
|
220
|
+
}
|
|
221
|
+
displayName
|
|
222
|
+
firstName
|
|
223
|
+
}
|
|
224
|
+
displayFinancialStatus
|
|
225
|
+
displayFulfillmentStatus
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
pageInfo {
|
|
229
|
+
hasNextPage
|
|
230
|
+
endCursor
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
`;
|
|
235
|
+
var queryOrdersByNameFull = gql`#graphql
|
|
236
|
+
query ordersByNameFull($first: Int!, $queryFilter: String!) {
|
|
237
|
+
orders(first: $first, query: $queryFilter) {
|
|
238
|
+
edges {
|
|
239
|
+
node {
|
|
240
|
+
billingAddress {
|
|
241
|
+
address1
|
|
242
|
+
address2
|
|
243
|
+
city
|
|
244
|
+
company
|
|
245
|
+
country
|
|
246
|
+
countryCodeV2
|
|
247
|
+
firstName
|
|
248
|
+
formattedArea
|
|
249
|
+
id
|
|
250
|
+
lastName
|
|
251
|
+
name
|
|
252
|
+
phone
|
|
253
|
+
province
|
|
254
|
+
provinceCode
|
|
255
|
+
timeZone
|
|
256
|
+
zip
|
|
257
|
+
}
|
|
258
|
+
billingAddressMatchesShippingAddress
|
|
259
|
+
cancelReason
|
|
260
|
+
cancellation {
|
|
261
|
+
staffNote
|
|
262
|
+
}
|
|
263
|
+
cancelledAt
|
|
264
|
+
capturable
|
|
265
|
+
clientIp
|
|
266
|
+
closed
|
|
267
|
+
closedAt
|
|
268
|
+
confirmed
|
|
269
|
+
createdAt
|
|
270
|
+
currencyCode
|
|
271
|
+
currentCartDiscountAmountSet {
|
|
272
|
+
presentmentMoney {
|
|
273
|
+
amount
|
|
274
|
+
currencyCode
|
|
275
|
+
}
|
|
276
|
+
shopMoney {
|
|
277
|
+
amount
|
|
278
|
+
currencyCode
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
currentShippingPriceSet {
|
|
282
|
+
presentmentMoney {
|
|
283
|
+
amount
|
|
284
|
+
currencyCode
|
|
285
|
+
}
|
|
286
|
+
shopMoney {
|
|
287
|
+
amount
|
|
288
|
+
currencyCode
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
currentSubtotalLineItemsQuantity
|
|
292
|
+
currentSubtotalPriceSet {
|
|
293
|
+
presentmentMoney {
|
|
294
|
+
amount
|
|
295
|
+
currencyCode
|
|
296
|
+
}
|
|
297
|
+
shopMoney {
|
|
298
|
+
amount
|
|
299
|
+
currencyCode
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
currentTaxLines {
|
|
303
|
+
channelLiable
|
|
304
|
+
rate
|
|
305
|
+
ratePercentage
|
|
306
|
+
source
|
|
307
|
+
title
|
|
308
|
+
priceSet {
|
|
309
|
+
presentmentMoney {
|
|
310
|
+
amount
|
|
311
|
+
currencyCode
|
|
312
|
+
}
|
|
313
|
+
shopMoney {
|
|
314
|
+
amount
|
|
315
|
+
currencyCode
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
currentTotalAdditionalFeesSet {
|
|
320
|
+
presentmentMoney {
|
|
321
|
+
amount
|
|
322
|
+
currencyCode
|
|
323
|
+
}
|
|
324
|
+
shopMoney {
|
|
325
|
+
amount
|
|
326
|
+
currencyCode
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
currentTotalDiscountsSet {
|
|
330
|
+
presentmentMoney {
|
|
331
|
+
amount
|
|
332
|
+
currencyCode
|
|
333
|
+
currencyCode
|
|
334
|
+
}
|
|
335
|
+
shopMoney {
|
|
336
|
+
amount
|
|
337
|
+
currencyCode
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
currentTotalDutiesSet {
|
|
341
|
+
presentmentMoney {
|
|
342
|
+
amount
|
|
343
|
+
currencyCode
|
|
344
|
+
}
|
|
345
|
+
shopMoney {
|
|
346
|
+
amount
|
|
347
|
+
currencyCode
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
currentTotalPriceSet {
|
|
351
|
+
presentmentMoney {
|
|
352
|
+
amount
|
|
353
|
+
currencyCode
|
|
354
|
+
}
|
|
355
|
+
shopMoney {
|
|
356
|
+
amount
|
|
357
|
+
currencyCode
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
currentTotalTaxSet {
|
|
361
|
+
presentmentMoney {
|
|
362
|
+
amount
|
|
363
|
+
currencyCode
|
|
364
|
+
}
|
|
365
|
+
shopMoney {
|
|
366
|
+
amount
|
|
367
|
+
currencyCode
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
currentTotalWeight
|
|
371
|
+
customer {
|
|
372
|
+
id
|
|
373
|
+
lastName
|
|
374
|
+
defaultEmailAddress {
|
|
375
|
+
emailAddress
|
|
376
|
+
}
|
|
377
|
+
displayName
|
|
378
|
+
firstName
|
|
379
|
+
}
|
|
380
|
+
customerAcceptsMarketing
|
|
381
|
+
discountCodes
|
|
382
|
+
discountCode
|
|
383
|
+
displayAddress {
|
|
384
|
+
address1
|
|
385
|
+
address2
|
|
386
|
+
city
|
|
387
|
+
company
|
|
388
|
+
country
|
|
389
|
+
countryCodeV2
|
|
390
|
+
firstName
|
|
391
|
+
formattedArea
|
|
392
|
+
id
|
|
393
|
+
lastName
|
|
394
|
+
name
|
|
395
|
+
phone
|
|
396
|
+
province
|
|
397
|
+
provinceCode
|
|
398
|
+
timeZone
|
|
399
|
+
zip
|
|
400
|
+
}
|
|
401
|
+
displayFinancialStatus
|
|
402
|
+
displayFulfillmentStatus
|
|
403
|
+
dutiesIncluded
|
|
404
|
+
edited
|
|
405
|
+
email
|
|
406
|
+
estimatedTaxes
|
|
407
|
+
fulfillable
|
|
408
|
+
fulfillments(first: 20) {
|
|
409
|
+
createdAt
|
|
410
|
+
deliveredAt
|
|
411
|
+
displayStatus
|
|
412
|
+
estimatedDeliveryAt
|
|
413
|
+
updatedAt
|
|
414
|
+
trackingInfo(first: 10) {
|
|
415
|
+
company
|
|
416
|
+
url
|
|
417
|
+
}
|
|
418
|
+
totalQuantity
|
|
419
|
+
status
|
|
420
|
+
name
|
|
421
|
+
id
|
|
422
|
+
}
|
|
423
|
+
fullyPaid
|
|
424
|
+
id
|
|
425
|
+
lineItems(first: 50) {
|
|
426
|
+
edges {
|
|
427
|
+
node {
|
|
428
|
+
id
|
|
429
|
+
name
|
|
430
|
+
originalUnitPriceSet {
|
|
431
|
+
presentmentMoney {
|
|
432
|
+
amount
|
|
433
|
+
currencyCode
|
|
434
|
+
}
|
|
435
|
+
shopMoney {
|
|
436
|
+
amount
|
|
437
|
+
currencyCode
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
quantity
|
|
441
|
+
requiresShipping
|
|
442
|
+
sku
|
|
443
|
+
title
|
|
444
|
+
variantTitle
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
name
|
|
449
|
+
note
|
|
450
|
+
processedAt
|
|
451
|
+
shippingAddress {
|
|
452
|
+
address1
|
|
453
|
+
address2
|
|
454
|
+
city
|
|
455
|
+
company
|
|
456
|
+
country
|
|
457
|
+
countryCodeV2
|
|
458
|
+
firstName
|
|
459
|
+
formattedArea
|
|
460
|
+
id
|
|
461
|
+
lastName
|
|
462
|
+
name
|
|
463
|
+
phone
|
|
464
|
+
province
|
|
465
|
+
provinceCode
|
|
466
|
+
timeZone
|
|
467
|
+
zip
|
|
468
|
+
}
|
|
469
|
+
statusPageUrl
|
|
470
|
+
tags
|
|
471
|
+
totalPriceSet {
|
|
472
|
+
presentmentMoney {
|
|
473
|
+
amount
|
|
474
|
+
currencyCode
|
|
475
|
+
}
|
|
476
|
+
shopMoney {
|
|
477
|
+
amount
|
|
478
|
+
currencyCode
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
totalReceivedSet {
|
|
482
|
+
presentmentMoney {
|
|
483
|
+
amount
|
|
484
|
+
currencyCode
|
|
485
|
+
}
|
|
486
|
+
shopMoney {
|
|
487
|
+
amount
|
|
488
|
+
currencyCode
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
totalRefundedSet {
|
|
492
|
+
presentmentMoney {
|
|
493
|
+
amount
|
|
494
|
+
currencyCode
|
|
495
|
+
}
|
|
496
|
+
shopMoney {
|
|
497
|
+
amount
|
|
498
|
+
currencyCode
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
totalShippingPriceSet {
|
|
502
|
+
presentmentMoney {
|
|
503
|
+
amount
|
|
504
|
+
currencyCode
|
|
505
|
+
}
|
|
506
|
+
shopMoney {
|
|
507
|
+
amount
|
|
508
|
+
currencyCode
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
totalTaxSet {
|
|
512
|
+
presentmentMoney {
|
|
513
|
+
amount
|
|
514
|
+
currencyCode
|
|
515
|
+
}
|
|
516
|
+
shopMoney {
|
|
517
|
+
amount
|
|
518
|
+
currencyCode
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
totalWeight
|
|
522
|
+
unpaid
|
|
523
|
+
updatedAt
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
pageInfo {
|
|
527
|
+
hasNextPage
|
|
528
|
+
endCursor
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
`;
|
|
533
|
+
|
|
534
|
+
// src/queries/orders/getOrderByName.ts
|
|
535
|
+
var GetLeanOrderByNameReturn = z3.object({
|
|
536
|
+
id: z3.string(),
|
|
537
|
+
name: z3.string(),
|
|
538
|
+
createdAt: z3.string(),
|
|
539
|
+
updatedAt: z3.string(),
|
|
540
|
+
totalPrice: z3.object({
|
|
541
|
+
amount: z3.string(),
|
|
542
|
+
currencyCode: z3.string()
|
|
543
|
+
}),
|
|
544
|
+
customer: z3.object({
|
|
545
|
+
id: z3.string(),
|
|
546
|
+
displayName: z3.string(),
|
|
547
|
+
emailAddress: z3.string().nullable()
|
|
548
|
+
}).nullable(),
|
|
549
|
+
financialStatus: z3.string().nullable(),
|
|
550
|
+
fulfillmentStatus: z3.string().nullable()
|
|
551
|
+
}).nullable();
|
|
552
|
+
async function getOrderByName(orderName, detailLevel = "lean") {
|
|
553
|
+
if (detailLevel === "lean") {
|
|
554
|
+
return getLeanOrderByName(orderName);
|
|
555
|
+
}
|
|
556
|
+
return getFullOrderByName(orderName);
|
|
557
|
+
}
|
|
558
|
+
async function getLeanOrderByName(orderName) {
|
|
559
|
+
const variables = {
|
|
560
|
+
first: 1,
|
|
561
|
+
queryFilter: `name:${orderName}`
|
|
562
|
+
};
|
|
563
|
+
const extractedNodes = await fetchShopifyGraphql({
|
|
564
|
+
query: queryOrdersByName,
|
|
565
|
+
variables,
|
|
566
|
+
dataExtractor: (pageData) => {
|
|
567
|
+
if (!pageData.orders) {
|
|
568
|
+
throw new Error(
|
|
569
|
+
"GraphQL response for orders is missing the 'orders' field."
|
|
570
|
+
);
|
|
571
|
+
}
|
|
572
|
+
const nodes = pageData.orders.edges.map(
|
|
573
|
+
(edge) => edge.node
|
|
574
|
+
);
|
|
575
|
+
return {
|
|
576
|
+
nodes
|
|
577
|
+
};
|
|
578
|
+
},
|
|
579
|
+
fetchAllPages: false
|
|
580
|
+
});
|
|
581
|
+
const order = extractedNodes[0];
|
|
582
|
+
if (!order) {
|
|
583
|
+
logger.debug(`No order found with name: ${orderName}`);
|
|
584
|
+
return null;
|
|
585
|
+
}
|
|
586
|
+
const leanOrder = {
|
|
587
|
+
id: order.id,
|
|
588
|
+
name: order.name,
|
|
589
|
+
createdAt: order.createdAt,
|
|
590
|
+
updatedAt: order.updatedAt,
|
|
591
|
+
totalPrice: {
|
|
592
|
+
amount: order.totalPriceSet?.shopMoney?.amount ?? "",
|
|
593
|
+
currencyCode: order.totalPriceSet?.shopMoney?.currencyCode ?? ""
|
|
594
|
+
},
|
|
595
|
+
customer: order.customer ? {
|
|
596
|
+
id: order.customer.id,
|
|
597
|
+
displayName: order.customer.displayName,
|
|
598
|
+
emailAddress: order.customer.defaultEmailAddress?.emailAddress ?? null
|
|
599
|
+
} : null,
|
|
600
|
+
financialStatus: order.displayFinancialStatus ?? null,
|
|
601
|
+
fulfillmentStatus: order.displayFulfillmentStatus ?? null
|
|
602
|
+
};
|
|
603
|
+
return await returnOutputParsed(leanOrder, GetLeanOrderByNameReturn);
|
|
604
|
+
}
|
|
605
|
+
async function getFullOrderByName(orderName) {
|
|
606
|
+
const variables = {
|
|
607
|
+
first: 1,
|
|
608
|
+
queryFilter: `name:${orderName}`
|
|
609
|
+
};
|
|
610
|
+
const extractedNodes = await fetchShopifyGraphql({
|
|
611
|
+
query: queryOrdersByNameFull,
|
|
612
|
+
variables,
|
|
613
|
+
dataExtractor: (pageData) => {
|
|
614
|
+
if (!pageData.orders) {
|
|
615
|
+
throw new Error(
|
|
616
|
+
"GraphQL response for orders is missing the 'orders' field."
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
const nodes = pageData.orders.edges.map(
|
|
620
|
+
(edge) => edge.node
|
|
621
|
+
);
|
|
622
|
+
return {
|
|
623
|
+
nodes
|
|
624
|
+
};
|
|
625
|
+
},
|
|
626
|
+
fetchAllPages: false
|
|
627
|
+
});
|
|
628
|
+
if (extractedNodes.length === 0) {
|
|
629
|
+
logger.debug(`No order found with name: ${orderName}`);
|
|
630
|
+
return null;
|
|
631
|
+
}
|
|
632
|
+
const order = extractedNodes[0];
|
|
633
|
+
if (!order) {
|
|
634
|
+
logger.debug(`No order found with name: ${orderName}`);
|
|
635
|
+
return null;
|
|
636
|
+
}
|
|
637
|
+
return order;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// src/queries/productVariants/getLeanProductVariants.ts
|
|
641
|
+
import z4 from "zod";
|
|
642
|
+
var GetLeanProductVariantsReturn = z4.array(
|
|
643
|
+
z4.object({
|
|
644
|
+
productId: z4.string(),
|
|
645
|
+
productTitle: z4.string(),
|
|
646
|
+
variantId: z4.string(),
|
|
647
|
+
variantTitle: z4.string(),
|
|
648
|
+
sku: z4.string()
|
|
649
|
+
})
|
|
650
|
+
);
|
|
651
|
+
async function getLeanProductVariants(skus) {
|
|
652
|
+
const queryGql = gql`#graphql
|
|
653
|
+
query leanProductVariants($first: Int!, $after: String, $queryFilter: String) {
|
|
654
|
+
productVariants(first: $first, after: $after, query: $queryFilter) {
|
|
655
|
+
edges {
|
|
656
|
+
node {
|
|
657
|
+
id
|
|
658
|
+
title
|
|
659
|
+
sku
|
|
660
|
+
product {
|
|
661
|
+
id
|
|
662
|
+
title
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
pageInfo {
|
|
667
|
+
hasNextPage
|
|
668
|
+
endCursor
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
`;
|
|
673
|
+
const initialVariables = { first: 250 };
|
|
674
|
+
if (skus && skus.length > 0) {
|
|
675
|
+
initialVariables.queryFilter = skus.map((sku) => `sku:${sku}`).join(" OR ");
|
|
676
|
+
}
|
|
677
|
+
const extractedNodes = await fetchShopifyGraphql({
|
|
678
|
+
query: queryGql,
|
|
679
|
+
variables: initialVariables,
|
|
680
|
+
dataExtractor: (pageData) => {
|
|
681
|
+
if (!pageData.productVariants) {
|
|
682
|
+
throw new Error(
|
|
683
|
+
"GraphQL response for product variants is missing the 'productVariants' field."
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
const nodes = pageData.productVariants.edges.map(
|
|
687
|
+
(edge) => edge.node
|
|
688
|
+
);
|
|
689
|
+
return {
|
|
690
|
+
nodes,
|
|
691
|
+
pageInfo: pageData.productVariants.pageInfo
|
|
692
|
+
};
|
|
693
|
+
},
|
|
694
|
+
fetchAllPages: true
|
|
695
|
+
});
|
|
696
|
+
const allVariants = extractedNodes.flatMap((v) => {
|
|
697
|
+
if (v.sku) {
|
|
698
|
+
return [
|
|
699
|
+
{
|
|
700
|
+
productId: v.product.id,
|
|
701
|
+
productTitle: v.product.title,
|
|
702
|
+
variantId: v.id,
|
|
703
|
+
variantTitle: v.title,
|
|
704
|
+
sku: v.sku
|
|
705
|
+
}
|
|
706
|
+
];
|
|
707
|
+
}
|
|
708
|
+
logger.debug(
|
|
709
|
+
`Product ${v.product.title} (ID: ${v.product.id}) has a variant (ID: ${v.id}) with no SKU. Filtering out.`
|
|
710
|
+
);
|
|
711
|
+
return [];
|
|
712
|
+
});
|
|
713
|
+
return await returnOutputParsed(allVariants, GetLeanProductVariantsReturn);
|
|
714
|
+
}
|
|
715
|
+
export {
|
|
716
|
+
getLeanProductVariants,
|
|
717
|
+
getOrderByName
|
|
718
|
+
};
|
|
719
|
+
//# sourceMappingURL=index.mjs.map
|