@ehrenkind/shopify-lib 0.0.6 → 0.1.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 +2 -34
- package/dist/generated-api-types/2025-04/admin.generated.d.ts +209 -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 +60044 -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 +11451 -0
- package/dist/generated-api-types/2025-04/admin.types.js.map +1 -0
- package/dist/index.cjs +96 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +168 -49
- package/dist/index.d.ts +5 -18816
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +95 -37
- package/dist/index.mjs.map +1 -1
- package/dist/mutations/customers/deleteCustomerById.d.ts +4 -0
- package/dist/mutations/customers/deleteCustomerById.d.ts.map +1 -0
- package/dist/mutations/customers/deleteCustomerById.js +38 -0
- package/dist/mutations/customers/deleteCustomerById.js.map +1 -0
- package/dist/mutations/customers/deleteCustomerById.mock.d.ts +4 -0
- package/dist/mutations/customers/deleteCustomerById.mock.d.ts.map +1 -0
- package/dist/mutations/customers/deleteCustomerById.mock.js +8 -0
- package/dist/mutations/customers/deleteCustomerById.mock.js.map +1 -0
- package/dist/mutations/customers/deleteCustomerById.test.d.ts +2 -0
- package/dist/mutations/customers/deleteCustomerById.test.d.ts.map +1 -0
- package/dist/mutations/customers/deleteCustomerById.test.js +10 -0
- package/dist/mutations/customers/deleteCustomerById.test.js.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 +72 -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/orders/getOrderPaymentDetails.d.ts +130 -0
- package/dist/queries/orders/getOrderPaymentDetails.d.ts.map +1 -0
- package/dist/queries/orders/getOrderPaymentDetails.js +45 -0
- package/dist/queries/orders/getOrderPaymentDetails.js.map +1 -0
- package/dist/queries/orders/getOrderPaymentDetails.queries.d.ts +2 -0
- package/dist/queries/orders/getOrderPaymentDetails.queries.d.ts.map +1 -0
- package/dist/queries/orders/getOrderPaymentDetails.queries.js +21 -0
- package/dist/queries/orders/getOrderPaymentDetails.queries.js.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.d.ts +33 -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 +41 -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 +24 -0
- package/dist/utils/shopifyFetch.d.ts.map +1 -0
- package/dist/utils/shopifyFetch.js +67 -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 +3 -2
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ApiVersion, LogSeverity, Session, shopifyApi, } from '@shopify/shopify-api';
|
|
2
|
+
import '@shopify/shopify-api/adapters/node';
|
|
3
|
+
import dotenv from 'dotenv';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { activeLogLevelName, logger } from './logger.js';
|
|
6
|
+
// https://shopify.dev/docs/api/admin-graphql/2025-04/
|
|
7
|
+
export const SHOPIFY_API_VERSION = ApiVersion.April25;
|
|
8
|
+
dotenv.config();
|
|
9
|
+
const envSchema = z.object({
|
|
10
|
+
SHOPIFY_API_KEY: z.string({
|
|
11
|
+
required_error: 'SHOPIFY_API_KEY is required',
|
|
12
|
+
}),
|
|
13
|
+
SHOPIFY_API_SECRET: z.string({
|
|
14
|
+
required_error: 'SHOPIFY_API_SECRET is required',
|
|
15
|
+
}),
|
|
16
|
+
SHOPIFY_API_HOSTNAME: z.string({
|
|
17
|
+
required_error: 'SHOPIFY_API_HOSTNAME is required',
|
|
18
|
+
}),
|
|
19
|
+
SHOPIFY_ACCESS_TOKEN: z.string({
|
|
20
|
+
required_error: 'SHOPIFY_ACCESS_TOKEN is required',
|
|
21
|
+
}),
|
|
22
|
+
NODE_ENV: z
|
|
23
|
+
.enum(['development', 'production', 'test'])
|
|
24
|
+
.default('development'),
|
|
25
|
+
});
|
|
26
|
+
const mapLogLevelToShopifySeverity = (level) => {
|
|
27
|
+
switch (level) {
|
|
28
|
+
case 'silent':
|
|
29
|
+
return LogSeverity.Error;
|
|
30
|
+
case 'debug':
|
|
31
|
+
return LogSeverity.Debug;
|
|
32
|
+
case 'info':
|
|
33
|
+
return LogSeverity.Info;
|
|
34
|
+
case 'warn':
|
|
35
|
+
return LogSeverity.Warning;
|
|
36
|
+
case 'error':
|
|
37
|
+
return LogSeverity.Error;
|
|
38
|
+
default:
|
|
39
|
+
return LogSeverity.Info;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
let shopifyGraphqlClient;
|
|
43
|
+
try {
|
|
44
|
+
// biome-ignore lint/nursery/noProcessEnv: <explanation>
|
|
45
|
+
const env = envSchema.parse(process.env);
|
|
46
|
+
const shopify = shopifyApi({
|
|
47
|
+
apiKey: env.SHOPIFY_API_KEY,
|
|
48
|
+
apiSecretKey: env.SHOPIFY_API_SECRET,
|
|
49
|
+
hostName: env.SHOPIFY_API_HOSTNAME,
|
|
50
|
+
apiVersion: SHOPIFY_API_VERSION,
|
|
51
|
+
isEmbeddedApp: false,
|
|
52
|
+
logger: { level: mapLogLevelToShopifySeverity(activeLogLevelName) },
|
|
53
|
+
future: {
|
|
54
|
+
customerAddressDefaultFix: true,
|
|
55
|
+
lineItemBilling: true,
|
|
56
|
+
unstable_managedPricingSupport: false,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const shopifySession = new Session({
|
|
60
|
+
id: `custom-session-${env.SHOPIFY_API_HOSTNAME}`,
|
|
61
|
+
shop: env.SHOPIFY_API_HOSTNAME,
|
|
62
|
+
state: 'authenticated',
|
|
63
|
+
isOnline: true,
|
|
64
|
+
accessToken: env.SHOPIFY_ACCESS_TOKEN,
|
|
65
|
+
});
|
|
66
|
+
shopifyGraphqlClient = new shopify.clients.Graphql({
|
|
67
|
+
session: shopifySession,
|
|
68
|
+
});
|
|
69
|
+
logger.info('Shopify API client initialized successfully.');
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof z.ZodError) {
|
|
73
|
+
const msg = JSON.stringify(error.format(), null, 2);
|
|
74
|
+
logger.error(msg);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
logger.error('Failed to initialize Shopify API client:', error);
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
export { shopifyGraphqlClient as shopifyClient };
|
|
82
|
+
//# sourceMappingURL=shopifyClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyClient.js","sourceRoot":"","sources":["../../src/utils/shopifyClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyClient.mock.d.ts","sourceRoot":"","sources":["../../src/utils/shopifyClient.mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAA;AAEzF,eAAO,MAAM,kBAAkB,EAAE,mBAiBhC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const productHandlesMock = {
|
|
2
|
+
products: {
|
|
3
|
+
edges: [
|
|
4
|
+
{
|
|
5
|
+
node: {
|
|
6
|
+
handle: 'product-1',
|
|
7
|
+
title: 'Product 1',
|
|
8
|
+
},
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
node: {
|
|
12
|
+
handle: 'product-2',
|
|
13
|
+
title: 'Product 2',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=shopifyClient.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyClient.mock.js","sourceRoot":"","sources":["../../src/utils/shopifyClient.mock.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,QAAQ,EAAE;QACR,KAAK,EAAE;YACL;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,WAAW;iBACnB;aACF;YACD;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,WAAW;iBACnB;aACF;SACF;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyClient.test.d.ts","sourceRoot":"","sources":["../../src/utils/shopifyClient.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { shopifyClient } from './shopifyClient';
|
|
3
|
+
describe('Shopify GraphQL Client', () => {
|
|
4
|
+
it('should be initialized', () => {
|
|
5
|
+
expect(shopifyClient).toBeDefined();
|
|
6
|
+
});
|
|
7
|
+
it('should fetch product handles using the request method', async () => {
|
|
8
|
+
const query = `#graphql
|
|
9
|
+
query productHandles($first: Int!) {
|
|
10
|
+
products(first: $first) {
|
|
11
|
+
edges {
|
|
12
|
+
node {
|
|
13
|
+
handle
|
|
14
|
+
title
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}`;
|
|
19
|
+
const variables = {
|
|
20
|
+
first: 10,
|
|
21
|
+
};
|
|
22
|
+
const response = await shopifyClient.request(query, { variables });
|
|
23
|
+
expect(response.data).toBeDefined();
|
|
24
|
+
expect(response.data?.products).toBeDefined();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=shopifyClient.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyClient.test.js","sourceRoot":"","sources":["../../src/utils/shopifyClient.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,KAAK,GAAG;;;;;;;;;;QAUV,CAAA;QAEJ,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,EAAE;SACV,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;QAElE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function convertIdIntoGid(id: bigint, type: 'Order' | 'Customer'): string;
|
|
2
|
+
interface PageInfo {
|
|
3
|
+
hasNextPage: boolean;
|
|
4
|
+
endCursor?: string | null | undefined;
|
|
5
|
+
}
|
|
6
|
+
type TExtractorFunctionType<TResultNode, TPageData> = (pageData: TPageData) => {
|
|
7
|
+
nodes: TResultNode[];
|
|
8
|
+
pageInfo?: PageInfo;
|
|
9
|
+
userErrors?: {
|
|
10
|
+
message?: string;
|
|
11
|
+
}[];
|
|
12
|
+
};
|
|
13
|
+
export declare function fetchShopifyGraphql<TResultNode, TPageData>(params: {
|
|
14
|
+
query: string;
|
|
15
|
+
variables: Record<string, unknown>;
|
|
16
|
+
dataExtractor?: TExtractorFunctionType<TResultNode, TPageData>;
|
|
17
|
+
fetchAllPages?: boolean;
|
|
18
|
+
}): Promise<TResultNode[]>;
|
|
19
|
+
export declare function fetchShopifyGraphql<TReturnType>(params: {
|
|
20
|
+
query: string;
|
|
21
|
+
variables: Record<string, unknown>;
|
|
22
|
+
}): Promise<TReturnType>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=shopifyFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyFetch.d.ts","sourceRoot":"","sources":["../../src/utils/shopifyFetch.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,GAAG,UAAU,GACzB,MAAM,CAER;AAED,UAAU,QAAQ;IAChB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACtC;AAOD,KAAK,sBAAsB,CAAC,WAAW,EAAE,SAAS,IAAI,CAAC,QAAQ,EAAE,SAAS,KAAK;IAC7E,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACpC,CAAA;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;IACxE,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,aAAa,CAAC,EAAE,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;AAC1B,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { logger } from './logger.js';
|
|
2
|
+
import { shopifyClient } from './shopifyClient.js';
|
|
3
|
+
export function convertIdIntoGid(id, type) {
|
|
4
|
+
return `gid://shopify/${type}/${id}`;
|
|
5
|
+
}
|
|
6
|
+
export async function fetchShopifyGraphql(params) {
|
|
7
|
+
const { query, variables: initialVariables, dataExtractor, fetchAllPages = false, } = params;
|
|
8
|
+
let currentVariables = { ...initialVariables };
|
|
9
|
+
if (!dataExtractor) {
|
|
10
|
+
return makeRequest(query, currentVariables);
|
|
11
|
+
}
|
|
12
|
+
const allNodes = [];
|
|
13
|
+
let hasNextLoop = true;
|
|
14
|
+
do {
|
|
15
|
+
const response = await makeRequest(query, currentVariables);
|
|
16
|
+
const { nodes, pageInfo, userErrors } = dataExtractor(response);
|
|
17
|
+
// Handle Shopify mutation userErrors pattern
|
|
18
|
+
if (Array.isArray(userErrors) && userErrors.length > 0) {
|
|
19
|
+
const errorMessages = userErrors
|
|
20
|
+
.map((e) => e.message || JSON.stringify(e))
|
|
21
|
+
.join('\n');
|
|
22
|
+
logger.error('Shopify mutation userErrors:', errorMessages);
|
|
23
|
+
throw new Error(`Shopify mutation userErrors: ${errorMessages}`);
|
|
24
|
+
}
|
|
25
|
+
allNodes.push(...nodes);
|
|
26
|
+
hasNextLoop = fetchAllPages ? !!pageInfo?.hasNextPage : false;
|
|
27
|
+
if (hasNextLoop && pageInfo?.endCursor) {
|
|
28
|
+
currentVariables = {
|
|
29
|
+
...currentVariables,
|
|
30
|
+
after: pageInfo.endCursor,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} while (hasNextLoop);
|
|
34
|
+
return allNodes;
|
|
35
|
+
}
|
|
36
|
+
async function makeRequest(query, variables) {
|
|
37
|
+
const response = (await shopifyClient.request(query, {
|
|
38
|
+
variables,
|
|
39
|
+
}));
|
|
40
|
+
if (response.errors) {
|
|
41
|
+
let errorMessages = 'GraphQL query failed.';
|
|
42
|
+
const errors = response.errors;
|
|
43
|
+
if (Array.isArray(errors)) {
|
|
44
|
+
errorMessages = errors
|
|
45
|
+
.map((e) => e.message || JSON.stringify(e))
|
|
46
|
+
.join('\n');
|
|
47
|
+
}
|
|
48
|
+
else if (typeof errors === 'object' &&
|
|
49
|
+
errors !== null &&
|
|
50
|
+
'message' in errors) {
|
|
51
|
+
errorMessages = errors.message || JSON.stringify(errors);
|
|
52
|
+
}
|
|
53
|
+
else if (typeof errors === 'string') {
|
|
54
|
+
errorMessages = errors;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
errorMessages = JSON.stringify(errors);
|
|
58
|
+
}
|
|
59
|
+
logger.error('GraphQL query failed:', errorMessages);
|
|
60
|
+
throw new Error(`GraphQL errors: ${errorMessages}`);
|
|
61
|
+
}
|
|
62
|
+
if (!response.data) {
|
|
63
|
+
throw new Error('No data in Shopify API response');
|
|
64
|
+
}
|
|
65
|
+
return response.data;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=shopifyFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyFetch.js","sourceRoot":"","sources":["../../src/utils/shopifyFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyFetch.test.d.ts","sourceRoot":"","sources":["../../src/utils/shopifyFetch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { convertIdIntoGid } from './shopifyFetch';
|
|
3
|
+
describe('convertIdIntoGid', () => {
|
|
4
|
+
it('should convert an Order ID to a GID', () => {
|
|
5
|
+
const id = 12345n;
|
|
6
|
+
const type = 'Order';
|
|
7
|
+
const expectedGid = 'gid://shopify/Order/12345';
|
|
8
|
+
expect(convertIdIntoGid(id, type)).toBe(expectedGid);
|
|
9
|
+
});
|
|
10
|
+
it('should convert a Customer ID to a GID', () => {
|
|
11
|
+
const id = 67890n;
|
|
12
|
+
const type = 'Customer';
|
|
13
|
+
const expectedGid = 'gid://shopify/Customer/67890';
|
|
14
|
+
expect(convertIdIntoGid(id, type)).toBe(expectedGid);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=shopifyFetch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopifyFetch.test.js","sourceRoot":"","sources":["../../src/utils/shopifyFetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAA;QACjB,MAAM,IAAI,GAAG,OAAO,CAAA;QACpB,MAAM,WAAW,GAAG,2BAA2B,CAAA;QAC/C,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAA;QACjB,MAAM,IAAI,GAAG,UAAU,CAAA;QACvB,MAAM,WAAW,GAAG,8BAA8B,CAAA;QAClD,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../../src/utils/test-setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { afterAll, afterEach, beforeAll, vi } from 'vitest';
|
|
2
|
+
import { server } from './mswHandlers';
|
|
3
|
+
beforeAll(() => {
|
|
4
|
+
server.listen();
|
|
5
|
+
});
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
server.resetHandlers();
|
|
8
|
+
vi.clearAllMocks();
|
|
9
|
+
});
|
|
10
|
+
afterAll(() => {
|
|
11
|
+
server.close();
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=test-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../src/utils/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,MAAM,EAAE,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,aAAa,EAAE,CAAA;IACtB,EAAE,CAAC,aAAa,EAAE,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,GAAG,EAAE;IACZ,MAAM,CAAC,KAAK,EAAE,CAAA;AAChB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/utils/zod.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAGnB,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAepB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
export async function returnOutputParsed(data, Model) {
|
|
4
|
+
const parsed = await Model.safeParseAsync(data);
|
|
5
|
+
if (!parsed.success) {
|
|
6
|
+
if (parsed.error instanceof z.ZodError) {
|
|
7
|
+
const msg = JSON.stringify(parsed.error.format(), null, 2);
|
|
8
|
+
logger.error(msg);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
logger.error('Failed to parse:', parsed.error);
|
|
12
|
+
}
|
|
13
|
+
// throw parsedVariants.error
|
|
14
|
+
throw new Error('Failed to parse product variants');
|
|
15
|
+
}
|
|
16
|
+
logger.info('Parsed data successfully');
|
|
17
|
+
return parsed.data;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=zod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/utils/zod.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAa,EACb,KAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAC1D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAChD,CAAC;QACD,6BAA6B;QAC7B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ehrenkind/shopify-lib",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"main": "dist/index.cjs",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -65,7 +65,8 @@
|
|
|
65
65
|
"test": "vitest run --test-name-pattern '^((?!Live).)*$'",
|
|
66
66
|
"test:watch": "vitest --test-name-pattern '^((?!Live).)*$'",
|
|
67
67
|
"test-all-including-live": "vitest run",
|
|
68
|
-
"
|
|
68
|
+
"change": "changeset",
|
|
69
|
+
"release": "[ -z \"$(git status --porcelain)\" ] || (echo 'Release aborted: commit or stash uncommitted changes first.' && exit 1) && changeset version && git add . && git commit -m \"release: v$(node -p \"require('./package.json').version\")\" && changeset publish && git push --follow-tags",
|
|
69
70
|
"typecheck": "tsc",
|
|
70
71
|
"knip": "knip --max-issues 10",
|
|
71
72
|
"knip:fix": "knip --fix",
|