@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.
Files changed (95) hide show
  1. package/README.md +172 -0
  2. package/dist/generated-api-types/2025-04/admin.generated.d.ts +181 -0
  3. package/dist/generated-api-types/2025-04/admin.generated.d.ts.map +1 -0
  4. package/dist/generated-api-types/2025-04/admin.generated.js +5 -0
  5. package/dist/generated-api-types/2025-04/admin.generated.js.map +1 -0
  6. package/dist/generated-api-types/2025-04/admin.types.d.ts +57664 -0
  7. package/dist/generated-api-types/2025-04/admin.types.d.ts.map +1 -0
  8. package/dist/generated-api-types/2025-04/admin.types.js +11356 -0
  9. package/dist/generated-api-types/2025-04/admin.types.js.map +1 -0
  10. package/dist/index.cjs +752 -0
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/index.d.cts +18290 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.mjs +719 -0
  18. package/dist/index.mjs.map +1 -0
  19. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.d.ts +4 -0
  20. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.d.ts.map +1 -0
  21. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.js +56 -0
  22. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.js.map +1 -0
  23. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.d.ts +3 -0
  24. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.d.ts.map +1 -0
  25. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.js +11 -0
  26. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock.js.map +1 -0
  27. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.d.ts +2 -0
  28. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.d.ts.map +1 -0
  29. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.js +11 -0
  30. package/dist/mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.test.js.map +1 -0
  31. package/dist/queries/orders/getOrderByName.d.ts +26 -0
  32. package/dist/queries/orders/getOrderByName.d.ts.map +1 -0
  33. package/dist/queries/orders/getOrderByName.js +117 -0
  34. package/dist/queries/orders/getOrderByName.js.map +1 -0
  35. package/dist/queries/orders/getOrderByName.mock.d.ts +21 -0
  36. package/dist/queries/orders/getOrderByName.mock.d.ts.map +1 -0
  37. package/dist/queries/orders/getOrderByName.mock.js +55 -0
  38. package/dist/queries/orders/getOrderByName.mock.js.map +1 -0
  39. package/dist/queries/orders/getOrderByName.queries.d.ts +3 -0
  40. package/dist/queries/orders/getOrderByName.queries.d.ts.map +1 -0
  41. package/dist/queries/orders/getOrderByName.queries.js +335 -0
  42. package/dist/queries/orders/getOrderByName.queries.js.map +1 -0
  43. package/dist/queries/orders/getOrderByName.test.d.ts +2 -0
  44. package/dist/queries/orders/getOrderByName.test.d.ts.map +1 -0
  45. package/dist/queries/orders/getOrderByName.test.js +28 -0
  46. package/dist/queries/orders/getOrderByName.test.js.map +1 -0
  47. package/dist/queries/productVariants/getLeanProductVariants.d.ts +21 -0
  48. package/dist/queries/productVariants/getLeanProductVariants.d.ts.map +1 -0
  49. package/dist/queries/productVariants/getLeanProductVariants.js +81 -0
  50. package/dist/queries/productVariants/getLeanProductVariants.js.map +1 -0
  51. package/dist/queries/productVariants/getLeanProductVariants.mock.d.ts +3 -0
  52. package/dist/queries/productVariants/getLeanProductVariants.mock.d.ts.map +1 -0
  53. package/dist/queries/productVariants/getLeanProductVariants.mock.js +33 -0
  54. package/dist/queries/productVariants/getLeanProductVariants.mock.js.map +1 -0
  55. package/dist/queries/productVariants/getLeanProductVariants.test.d.ts +2 -0
  56. package/dist/queries/productVariants/getLeanProductVariants.test.d.ts.map +1 -0
  57. package/dist/queries/productVariants/getLeanProductVariants.test.js +38 -0
  58. package/dist/queries/productVariants/getLeanProductVariants.test.js.map +1 -0
  59. package/dist/utils/logger.d.ts +11 -0
  60. package/dist/utils/logger.d.ts.map +1 -0
  61. package/dist/utils/logger.js +50 -0
  62. package/dist/utils/logger.js.map +1 -0
  63. package/dist/utils/mswHandlers.d.ts +2 -0
  64. package/dist/utils/mswHandlers.d.ts.map +1 -0
  65. package/dist/utils/mswHandlers.js +32 -0
  66. package/dist/utils/mswHandlers.js.map +1 -0
  67. package/dist/utils/shopifyClient.d.ts +6 -0
  68. package/dist/utils/shopifyClient.d.ts.map +1 -0
  69. package/dist/utils/shopifyClient.js +82 -0
  70. package/dist/utils/shopifyClient.js.map +1 -0
  71. package/dist/utils/shopifyClient.mock.d.ts +3 -0
  72. package/dist/utils/shopifyClient.mock.d.ts.map +1 -0
  73. package/dist/utils/shopifyClient.mock.js +19 -0
  74. package/dist/utils/shopifyClient.mock.js.map +1 -0
  75. package/dist/utils/shopifyClient.test.d.ts +2 -0
  76. package/dist/utils/shopifyClient.test.d.ts.map +1 -0
  77. package/dist/utils/shopifyClient.test.js +27 -0
  78. package/dist/utils/shopifyClient.test.js.map +1 -0
  79. package/dist/utils/shopifyFetch.d.ts +19 -0
  80. package/dist/utils/shopifyFetch.d.ts.map +1 -0
  81. package/dist/utils/shopifyFetch.js +60 -0
  82. package/dist/utils/shopifyFetch.js.map +1 -0
  83. package/dist/utils/shopifyFetch.test.d.ts +2 -0
  84. package/dist/utils/shopifyFetch.test.d.ts.map +1 -0
  85. package/dist/utils/shopifyFetch.test.js +17 -0
  86. package/dist/utils/shopifyFetch.test.js.map +1 -0
  87. package/dist/utils/test-setup.d.ts +2 -0
  88. package/dist/utils/test-setup.d.ts.map +1 -0
  89. package/dist/utils/test-setup.js +13 -0
  90. package/dist/utils/test-setup.js.map +1 -0
  91. package/dist/utils/zod.d.ts +3 -0
  92. package/dist/utils/zod.d.ts.map +1 -0
  93. package/dist/utils/zod.js +19 -0
  94. package/dist/utils/zod.js.map +1 -0
  95. package/package.json +75 -0
@@ -0,0 +1,32 @@
1
+ import { graphql } from 'msw';
2
+ import { setupServer } from 'msw/node';
3
+ import { connectMetaObjectToProductVariantMock } from '../mutations/productVariantsBulkUpdate/connectMetaObjectToProductVariant.mock';
4
+ import { ordersByNameMock } from '../queries/orders/getOrderByName.mock';
5
+ import { leanProductVariantsMock } from '../queries/productVariants/getLeanProductVariants.mock';
6
+ import { logger } from './logger';
7
+ import { productHandlesMock } from './shopifyClient.mock';
8
+ const orders = [
9
+ graphql.query('ordersByName', createGqlResponse(ordersByNameMock)),
10
+ graphql.query('ordersByNameFull', createGqlResponse(ordersByNameMock)),
11
+ ];
12
+ const productVariants = [
13
+ graphql.query('productHandles', createGqlResponse(productHandlesMock)),
14
+ graphql.query('leanProductVariants', createGqlResponse(leanProductVariantsMock)),
15
+ ];
16
+ const productVariantsBulkUpdate = [
17
+ graphql.mutation('connectMetaObjectToProductVariant', createGqlResponse(connectMetaObjectToProductVariantMock)),
18
+ ];
19
+ const handlers = [...orders, ...productVariants, ...productVariantsBulkUpdate];
20
+ function createGqlResponse(mockData) {
21
+ return ({ operationName, query, }) => {
22
+ logger.debug(`[MSW] Mocking GraphQL query: ${operationName}`);
23
+ logger.debug(query);
24
+ return new Response(JSON.stringify({ data: mockData }), {
25
+ headers: {
26
+ 'Content-Type': 'application/json',
27
+ },
28
+ });
29
+ };
30
+ }
31
+ export const server = setupServer(...handlers);
32
+ //# sourceMappingURL=mswHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mswHandlers.js","sourceRoot":"","sources":["../../src/utils/mswHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,qCAAqC,EAAE,MAAM,+EAA+E,CAAA;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wDAAwD,CAAA;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,MAAM,GAAG;IACb,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CACvE,CAAA;AAED,MAAM,eAAe,GAAG;IACtB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACtE,OAAO,CAAC,KAAK,CACX,qBAAqB,EACrB,iBAAiB,CAAC,uBAAuB,CAAC,CAC3C;CACF,CAAA;AAED,MAAM,yBAAyB,GAAG;IAChC,OAAO,CAAC,QAAQ,CACd,mCAAmC,EACnC,iBAAiB,CAAC,qCAAqC,CAAC,CACzD;CACF,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,eAAe,EAAE,GAAG,yBAAyB,CAAC,CAAA;AAE9E,SAAS,iBAAiB,CAAI,QAAW;IACvC,OAAO,CAAC,EACN,aAAa,EACb,KAAK,GAIN,EAAE,EAAE;QACH,MAAM,CAAC,KAAK,CAAC,gCAAgC,aAAa,EAAE,CAAC,CAAA;QAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACnB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YACtD,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { ApiVersion, type GraphqlClient } from '@shopify/shopify-api';
2
+ import '@shopify/shopify-api/adapters/node';
3
+ export declare const SHOPIFY_API_VERSION = ApiVersion.April25;
4
+ declare let shopifyGraphqlClient: GraphqlClient;
5
+ export { shopifyGraphqlClient as shopifyClient };
6
+ //# sourceMappingURL=shopifyClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopifyClient.d.ts","sourceRoot":"","sources":["../../src/utils/shopifyClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,aAAa,EAInB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,oCAAoC,CAAA;AAM3C,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAuCrD,QAAA,IAAI,oBAAoB,EAAE,aAAa,CAAA;AA2CvC,OAAO,EAAE,oBAAoB,IAAI,aAAa,EAAE,CAAA"}
@@ -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
+ error: () => ({ message: 'SHOPIFY_API_KEY is required' }),
12
+ }),
13
+ SHOPIFY_API_SECRET: z.string({
14
+ error: () => ({ message: 'SHOPIFY_API_SECRET is required' }),
15
+ }),
16
+ SHOPIFY_API_HOSTNAME: z.string({
17
+ error: () => ({ message: 'SHOPIFY_API_HOSTNAME is required' }),
18
+ }),
19
+ SHOPIFY_ACCESS_TOKEN: z.string({
20
+ error: () => ({ message: '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 = z.prettifyError(error);
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,3 @@
1
+ import type { ProductHandlesQuery } from '../generated-api-types/2025-04/admin.generated';
2
+ export declare const productHandlesMock: ProductHandlesQuery;
3
+ //# sourceMappingURL=shopifyClient.mock.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shopifyClient.test.d.ts.map
@@ -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,19 @@
1
+ export declare function convertIdIntoGid(id: bigint, type: 'Order' | 'Customer'): string;
2
+ interface PageInfo {
3
+ hasNextPage: boolean;
4
+ endCursor?: string | null | undefined;
5
+ }
6
+ export declare function fetchShopifyGraphql<TResultNode, TPageData>(params: {
7
+ query: string;
8
+ variables: Record<string, unknown>;
9
+ dataExtractor: (pageData: TPageData) => {
10
+ nodes: TResultNode[];
11
+ pageInfo?: PageInfo;
12
+ userErrors?: {
13
+ message?: string;
14
+ }[];
15
+ };
16
+ fetchAllPages?: boolean;
17
+ }): Promise<TResultNode[]>;
18
+ export {};
19
+ //# 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,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,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK;QACtC,KAAK,EAAE,WAAW,EAAE,CAAA;QACpB,QAAQ,CAAC,EAAE,QAAQ,CAAA;QACnB,UAAU,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KACpC,CAAA;IACD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsEzB"}
@@ -0,0 +1,60 @@
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
+ const allNodes = [];
9
+ let currentVariables = { ...initialVariables };
10
+ let hasNextLoop = true;
11
+ do {
12
+ const response = (await shopifyClient.request(query, {
13
+ variables: currentVariables,
14
+ }));
15
+ if (response.errors) {
16
+ let errorMessages = 'GraphQL query failed.';
17
+ const errors = response.errors;
18
+ if (Array.isArray(errors)) {
19
+ errorMessages = errors
20
+ .map((e) => e.message || JSON.stringify(e))
21
+ .join('\n');
22
+ }
23
+ else if (typeof errors === 'object' &&
24
+ errors !== null &&
25
+ 'message' in errors) {
26
+ errorMessages = errors.message || JSON.stringify(errors);
27
+ }
28
+ else if (typeof errors === 'string') {
29
+ errorMessages = errors;
30
+ }
31
+ else {
32
+ errorMessages = JSON.stringify(errors);
33
+ }
34
+ logger.error('GraphQL query failed:', errorMessages);
35
+ throw new Error(`GraphQL errors: ${errorMessages}`);
36
+ }
37
+ if (!response.data) {
38
+ throw new Error('No data in Shopify API response');
39
+ }
40
+ const { nodes, pageInfo, userErrors } = dataExtractor(response.data);
41
+ // Handle Shopify mutation userErrors pattern
42
+ if (Array.isArray(userErrors) && userErrors.length > 0) {
43
+ const errorMessages = userErrors
44
+ .map((e) => e.message || JSON.stringify(e))
45
+ .join('\n');
46
+ logger.error('Shopify mutation userErrors:', errorMessages);
47
+ throw new Error(`Shopify mutation userErrors: ${errorMessages}`);
48
+ }
49
+ allNodes.push(...nodes);
50
+ hasNextLoop = fetchAllPages ? !!pageInfo?.hasNextPage : false;
51
+ if (hasNextLoop && pageInfo?.endCursor) {
52
+ currentVariables = {
53
+ ...currentVariables,
54
+ after: pageInfo.endCursor,
55
+ };
56
+ }
57
+ } while (hasNextLoop);
58
+ return allNodes;
59
+ }
60
+ //# 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shopifyFetch.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -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,3 @@
1
+ import z from 'zod';
2
+ export declare function returnOutputParsed<T>(data: unknown, Model: z.ZodType<T>): Promise<T>;
3
+ //# sourceMappingURL=zod.d.ts.map
@@ -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 = z.prettifyError(parsed.error);
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,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACzC,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 ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@ehrenkind/shopify-lib",
3
+ "version": "0.0.2",
4
+ "main": "dist/index.cjs",
5
+ "module": "dist/index.mjs",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.mjs"
12
+ },
13
+ "require": {
14
+ "types": "./dist/index.d.cts",
15
+ "default": "./dist/index.cjs"
16
+ }
17
+ }
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/formbench/shopify-lib.git"
22
+ },
23
+ "keywords": [],
24
+ "author": "",
25
+ "license": "ISC",
26
+ "bugs": {
27
+ "url": "https://github.com/formbench/shopify-lib/issues"
28
+ },
29
+ "homepage": "https://github.com/formbench/shopify-lib#readme",
30
+ "description": "",
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "type": "module",
35
+ "devDependencies": {
36
+ "@arethetypeswrong/cli": "^0.17.4",
37
+ "@biomejs/biome": "^1.9.4",
38
+ "@changesets/cli": "^2.28.1",
39
+ "@parcel/watcher": "2.5.1",
40
+ "@total-typescript/ts-reset": "^0.6.1",
41
+ "@types/node": "22.15.17",
42
+ "knip": "5.55.1",
43
+ "lefthook": "1.11.12",
44
+ "msw": "2.10.2",
45
+ "tsup": "8.5.0",
46
+ "typescript": "^5.8.2",
47
+ "vitest": "^3.1.1"
48
+ },
49
+ "dependencies": {
50
+ "@graphql-codegen/cli": "5.0.6",
51
+ "@shopify/admin-api-client": "1.1.1",
52
+ "@shopify/api-codegen-preset": "1.1.8",
53
+ "@shopify/shopify-api": "^11.11.1",
54
+ "dotenv": "^16.4.7",
55
+ "zod": "4.0.0-beta.20250505T195954"
56
+ },
57
+ "scripts": {
58
+ "build": "tsup",
59
+ "watch": "pnpm graphql-codegen-esm --watch",
60
+ "ci": "pnpm format:check && pnpm knip && pnpm check-exports && pnpm test",
61
+ "ci-light": "pnpm format:check",
62
+ "format:check": "biome check .",
63
+ "format:fix": "biome check --fix .",
64
+ "check-exports": "attw --pack . --ignore-rules=cjs-resolves-to-esm",
65
+ "test": "vitest run --test-name-pattern '^((?!Live).)*$'",
66
+ "test:watch": "vitest --test-name-pattern '^((?!Live).)*$'",
67
+ "test-all-including-live": "vitest run",
68
+ "local-release": "changeset version && changeset publish",
69
+ "typecheck": "tsc",
70
+ "knip": "knip --max-issues 10",
71
+ "knip:fix": "knip --fix",
72
+ "postinstall": "lefthook install",
73
+ "codegen": "graphql-codegen-esm"
74
+ }
75
+ }