@ehrenkind/shopify-lib 0.3.0 → 0.4.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/dist/generated-api-types/2025-04/admin.generated.d.ts +125 -0
- package/dist/generated-api-types/2025-04/admin.generated.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/mutations/customers/deleteCustomerById.d.ts +1 -3
- package/dist/mutations/customers/deleteCustomerById.d.ts.map +1 -1
- package/dist/mutations/customers/deleteCustomerById.js +1 -4
- package/dist/mutations/customers/deleteCustomerById.js.map +1 -1
- package/dist/queries/customers/getCustomersByEmail.d.ts +13 -0
- package/dist/queries/customers/getCustomersByEmail.d.ts.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.js +26 -0
- package/dist/queries/customers/getCustomersByEmail.js.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.mock.d.ts +8 -0
- package/dist/queries/customers/getCustomersByEmail.mock.d.ts.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.mock.js +54 -0
- package/dist/queries/customers/getCustomersByEmail.mock.js.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.queries.d.ts +2 -0
- package/dist/queries/customers/getCustomersByEmail.queries.d.ts.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.queries.js +41 -0
- package/dist/queries/customers/getCustomersByEmail.queries.js.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.test.d.ts +2 -0
- package/dist/queries/customers/getCustomersByEmail.test.d.ts.map +1 -0
- package/dist/queries/customers/getCustomersByEmail.test.js +29 -0
- package/dist/queries/customers/getCustomersByEmail.test.js.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.d.ts +14 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.d.ts.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.js +27 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.js.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.d.ts +12 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.d.ts.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.js +41 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.js.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.d.ts +2 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.d.ts.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.js +28 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.js.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.d.ts +2 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.d.ts.map +1 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.js +19 -0
- package/dist/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.d.ts +12 -0
- package/dist/queries/fulfillments/getFulfillmentById.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.js +27 -0
- package/dist/queries/fulfillments/getFulfillmentById.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.mock.d.ts +21 -0
- package/dist/queries/fulfillments/getFulfillmentById.mock.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.mock.js +83 -0
- package/dist/queries/fulfillments/getFulfillmentById.mock.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.queries.d.ts +2 -0
- package/dist/queries/fulfillments/getFulfillmentById.queries.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.queries.js +60 -0
- package/dist/queries/fulfillments/getFulfillmentById.queries.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.test.d.ts +2 -0
- package/dist/queries/fulfillments/getFulfillmentById.test.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentById.test.js +37 -0
- package/dist/queries/fulfillments/getFulfillmentById.test.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.d.ts +14 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.js +36 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.mock.d.ts +5 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.mock.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.mock.js +20 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.mock.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.queries.d.ts +2 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.queries.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.queries.js +13 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.queries.js.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.test.d.ts +2 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.test.d.ts.map +1 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.test.js +61 -0
- package/dist/queries/fulfillments/getFulfillmentTrackingIds.test.js.map +1 -0
- package/dist/queries/orders/getOrderById.d.ts +14 -14
- package/dist/queries/orders/getOrderById.mock.d.ts.map +1 -1
- package/dist/queries/orders/getOrderByName.d.ts +6 -6
- package/dist/queries/orders/getOrderCancellationInfo.d.ts +12 -0
- package/dist/queries/orders/getOrderCancellationInfo.d.ts.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.js +35 -0
- package/dist/queries/orders/getOrderCancellationInfo.js.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.mock.d.ts +6 -0
- package/dist/queries/orders/getOrderCancellationInfo.mock.d.ts.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.mock.js +29 -0
- package/dist/queries/orders/getOrderCancellationInfo.mock.js.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.queries.d.ts +2 -0
- package/dist/queries/orders/getOrderCancellationInfo.queries.d.ts.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.queries.js +15 -0
- package/dist/queries/orders/getOrderCancellationInfo.queries.js.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.test.d.ts +2 -0
- package/dist/queries/orders/getOrderCancellationInfo.test.d.ts.map +1 -0
- package/dist/queries/orders/getOrderCancellationInfo.test.js +34 -0
- package/dist/queries/orders/getOrderCancellationInfo.test.js.map +1 -0
- package/dist/queries/orders/getOrderPaymentDetails.d.ts +5 -123
- package/dist/queries/orders/getOrderPaymentDetails.d.ts.map +1 -1
- package/dist/queries/orders/getOrderPaymentDetails.js +3 -22
- package/dist/queries/orders/getOrderPaymentDetails.js.map +1 -1
- package/dist/queries/orders/getOrderPaymentDetails.mock.d.ts +7 -9
- package/dist/queries/orders/getOrderPaymentDetails.mock.d.ts.map +1 -1
- package/dist/queries/orders/getOrderPaymentDetails.mock.js +1 -3
- package/dist/queries/orders/getOrderPaymentDetails.mock.js.map +1 -1
- package/dist/queries/orders/getOrdersByCustomerId.d.ts +15 -0
- package/dist/queries/orders/getOrdersByCustomerId.d.ts.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.js +32 -0
- package/dist/queries/orders/getOrdersByCustomerId.js.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.mock.d.ts +15 -0
- package/dist/queries/orders/getOrdersByCustomerId.mock.d.ts.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.mock.js +76 -0
- package/dist/queries/orders/getOrdersByCustomerId.mock.js.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.queries.d.ts +2 -0
- package/dist/queries/orders/getOrdersByCustomerId.queries.d.ts.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.queries.js +41 -0
- package/dist/queries/orders/getOrdersByCustomerId.queries.js.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.test.d.ts +2 -0
- package/dist/queries/orders/getOrdersByCustomerId.test.d.ts.map +1 -0
- package/dist/queries/orders/getOrdersByCustomerId.test.js +33 -0
- package/dist/queries/orders/getOrdersByCustomerId.test.js.map +1 -0
- package/dist/queries/productVariants/getLeanProductVariants.d.ts +2 -2
- package/dist/utils/mswHandlers.d.ts.map +1 -1
- package/dist/utils/mswHandlers.js +18 -0
- package/dist/utils/mswHandlers.js.map +1 -1
- package/dist/utils/shopifyFetch.d.ts +1 -1
- package/dist/utils/shopifyFetch.d.ts.map +1 -1
- package/dist/utils/shopifyFetch.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FulfillmentOrdersByOrderIdQuery } from '../../generated-api-types/2025-04/admin.generated';
|
|
2
|
+
export declare const fulfillmentOrdersByOrderIdMock: FulfillmentOrdersByOrderIdQuery;
|
|
3
|
+
export declare const expectedFulfillmentOrdersByOrderId: (Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentOrder, "id" | "status"> & {
|
|
4
|
+
lineItems: {
|
|
5
|
+
edges: Array<{
|
|
6
|
+
node: (Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentOrderLineItem, "id" | "remainingQuantity" | "totalQuantity"> & {
|
|
7
|
+
lineItem: Pick<import("../../generated-api-types/2025-04/admin.types").LineItem, "id">;
|
|
8
|
+
});
|
|
9
|
+
}>;
|
|
10
|
+
};
|
|
11
|
+
})[];
|
|
12
|
+
//# sourceMappingURL=getFulfillmentOrdersByOrderId.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.mock.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAA;AAGxG,eAAO,MAAM,8BAA8B,EAAE,+BAqC5C,CAAA;AAED,eAAO,MAAM,kCAAkC;;;;;;;;IAGtC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FulfillmentOrderStatus } from '../../generated-api-types/2025-04/admin.types';
|
|
2
|
+
export const fulfillmentOrdersByOrderIdMock = {
|
|
3
|
+
order: {
|
|
4
|
+
fulfillmentOrders: {
|
|
5
|
+
edges: [
|
|
6
|
+
{
|
|
7
|
+
node: {
|
|
8
|
+
id: 'gid://shopify/FulfillmentOrder/7654321098765',
|
|
9
|
+
status: FulfillmentOrderStatus.Open,
|
|
10
|
+
lineItems: {
|
|
11
|
+
edges: [
|
|
12
|
+
{
|
|
13
|
+
node: {
|
|
14
|
+
id: 'gid://shopify/FulfillmentOrderLineItem/111111111111',
|
|
15
|
+
remainingQuantity: 1,
|
|
16
|
+
totalQuantity: 1,
|
|
17
|
+
lineItem: {
|
|
18
|
+
id: 'gid://shopify/LineItem/222222222222',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
node: {
|
|
24
|
+
id: 'gid://shopify/FulfillmentOrderLineItem/444444444444',
|
|
25
|
+
remainingQuantity: 2,
|
|
26
|
+
totalQuantity: 2,
|
|
27
|
+
lineItem: {
|
|
28
|
+
id: 'gid://shopify/LineItem/555555555555',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
export const expectedFulfillmentOrdersByOrderId = fulfillmentOrdersByOrderIdMock.order?.fulfillmentOrders.edges.map((edge) => edge.node) ?? [];
|
|
41
|
+
//# sourceMappingURL=getFulfillmentOrdersByOrderId.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.mock.js","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.mock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,MAAM,CAAC,MAAM,8BAA8B,GAAoC;IAC7E,KAAK,EAAE;QACL,iBAAiB,EAAE;YACjB,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE;wBACJ,EAAE,EAAE,8CAA8C;wBAClD,MAAM,EAAE,sBAAsB,CAAC,IAAI;wBACnC,SAAS,EAAE;4BACT,KAAK,EAAE;gCACL;oCACE,IAAI,EAAE;wCACJ,EAAE,EAAE,qDAAqD;wCACzD,iBAAiB,EAAE,CAAC;wCACpB,aAAa,EAAE,CAAC;wCAChB,QAAQ,EAAE;4CACR,EAAE,EAAE,qCAAqC;yCAC1C;qCACF;iCACF;gCACD;oCACE,IAAI,EAAE;wCACJ,EAAE,EAAE,qDAAqD;wCACzD,iBAAiB,EAAE,CAAC;wCACpB,aAAa,EAAE,CAAC;wCAChB,QAAQ,EAAE;4CACR,EAAE,EAAE,qCAAqC;yCAC1C;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF;CACF,CAAA;AAED,MAAM,CAAC,MAAM,kCAAkC,GAC7C,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAC/D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CACpB,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.queries.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,+BAA+B,QAyB3C,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { gql } from '../../utils/logger';
|
|
2
|
+
export const queryFulfillmentOrdersByOrderId = gql `#graphql
|
|
3
|
+
query fulfillmentOrdersByOrderId($orderId: ID!) {
|
|
4
|
+
order(id: $orderId) {
|
|
5
|
+
fulfillmentOrders(first: 50) {
|
|
6
|
+
edges {
|
|
7
|
+
node {
|
|
8
|
+
id
|
|
9
|
+
status
|
|
10
|
+
lineItems(first: 100) {
|
|
11
|
+
edges {
|
|
12
|
+
node {
|
|
13
|
+
id
|
|
14
|
+
remainingQuantity
|
|
15
|
+
totalQuantity
|
|
16
|
+
lineItem {
|
|
17
|
+
id
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
//# sourceMappingURL=getFulfillmentOrdersByOrderId.queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.queries.js","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAExC,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBjD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.test.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { graphql, passthrough } from 'msw';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { server } from '../../utils/mswHandlers';
|
|
4
|
+
import { getFulfillmentOrdersByOrderId } from './getFulfillmentOrdersByOrderId';
|
|
5
|
+
import { expectedFulfillmentOrdersByOrderId } from './getFulfillmentOrdersByOrderId.mock';
|
|
6
|
+
describe('getFulfillmentOrdersByOrderId', () => {
|
|
7
|
+
it('should return fulfillment orders for an order', async () => {
|
|
8
|
+
const result = await getFulfillmentOrdersByOrderId(5709883474250);
|
|
9
|
+
expect(result).toEqual(expectedFulfillmentOrdersByOrderId);
|
|
10
|
+
});
|
|
11
|
+
describe('Live', () => {
|
|
12
|
+
it('should return empty array when order not found', async () => {
|
|
13
|
+
server.use(graphql.query('fulfillmentOrdersByOrderId', () => passthrough()));
|
|
14
|
+
const result = await getFulfillmentOrdersByOrderId(99999999999);
|
|
15
|
+
expect(result).toEqual([]);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=getFulfillmentOrdersByOrderId.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentOrdersByOrderId.test.js","sourceRoot":"","sources":["../../../src/queries/fulfillmentOrders/getFulfillmentOrdersByOrderId.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAA;AAEzF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,aAAa,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,CAAC,GAAG,CACR,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CACjE,CAAA;YACD,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,WAAW,CAAC,CAAA;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FulfillmentByIdQuery } from '../../generated-api-types/2025-04/admin.generated.js';
|
|
2
|
+
export type Fulfillment = NonNullable<FulfillmentByIdQuery['fulfillment']>;
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves a single fulfillment from Shopify by its ID.
|
|
5
|
+
* Returns null if no fulfillment is found with the specified ID.
|
|
6
|
+
*
|
|
7
|
+
* @param {string | number | bigint} id - The Shopify fulfillment ID. Can be a GID string (e.g., "gid://shopify/Fulfillment/123456789") or a numeric ID (e.g., 123456789 or 123456789n).
|
|
8
|
+
* @returns {Promise<Fulfillment | null>} A promise that resolves to the fulfillment data or null if not found.
|
|
9
|
+
* @throws {Error} If the GraphQL query fails or if the response structure is invalid.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFulfillmentById(id: string | number | bigint): Promise<Fulfillment | null>;
|
|
12
|
+
//# sourceMappingURL=getFulfillmentById.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,sDAAsD,CAAA;AAS7D,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAA;AAE1E;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsB7B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import { convertIdIntoGid, fetchShopifyGraphql, } from '../../utils/shopifyFetch.js';
|
|
3
|
+
import { queryFulfillmentById } from './getFulfillmentById.queries.js';
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves a single fulfillment from Shopify by its ID.
|
|
6
|
+
* Returns null if no fulfillment is found with the specified ID.
|
|
7
|
+
*
|
|
8
|
+
* @param {string | number | bigint} id - The Shopify fulfillment ID. Can be a GID string (e.g., "gid://shopify/Fulfillment/123456789") or a numeric ID (e.g., 123456789 or 123456789n).
|
|
9
|
+
* @returns {Promise<Fulfillment | null>} A promise that resolves to the fulfillment data or null if not found.
|
|
10
|
+
* @throws {Error} If the GraphQL query fails or if the response structure is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export async function getFulfillmentById(id) {
|
|
13
|
+
const gid = typeof id === 'string'
|
|
14
|
+
? id
|
|
15
|
+
: convertIdIntoGid(typeof id === 'number' ? BigInt(id) : id, 'Fulfillment');
|
|
16
|
+
const variables = { id: gid };
|
|
17
|
+
const response = await fetchShopifyGraphql({
|
|
18
|
+
query: queryFulfillmentById,
|
|
19
|
+
variables,
|
|
20
|
+
});
|
|
21
|
+
if (!response.fulfillment) {
|
|
22
|
+
logger.debug(`No fulfillment found with ID: ${id}`);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return response.fulfillment;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=getFulfillmentById.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAKtE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAA4B;IAE5B,MAAM,GAAG,GACP,OAAO,EAAE,KAAK,QAAQ;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,gBAAgB,CACd,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EACxC,aAAa,CACd,CAAA;IAEP,MAAM,SAAS,GAAkC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;IAE5D,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAuB;QAC/D,KAAK,EAAE,oBAAoB;QAC3B,SAAS;KACV,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,QAAQ,CAAC,WAAW,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FulfillmentByIdQuery } from '../../generated-api-types/2025-04/admin.generated';
|
|
2
|
+
export declare const fulfillmentByIdMock: FulfillmentByIdQuery;
|
|
3
|
+
export declare const expectedFulfillmentById: import("../../generated-api-types/2025-04/admin.types").Maybe<Pick<import("../../generated-api-types/2025-04/admin.types").Fulfillment, "id" | "createdAt" | "updatedAt" | "name" | "status" | "totalQuantity" | "estimatedDeliveryAt" | "deliveredAt"> & {
|
|
4
|
+
location?: import("../../generated-api-types/2025-04/admin.types").Maybe<Pick<import("../../generated-api-types/2025-04/admin.types").Location, "id" | "legacyResourceId" | "name">>;
|
|
5
|
+
service?: import("../../generated-api-types/2025-04/admin.types").Maybe<Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentService, "handle" | "serviceName">>;
|
|
6
|
+
trackingInfo: Array<Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentTrackingInfo, "company" | "number" | "url">>;
|
|
7
|
+
originAddress?: import("../../generated-api-types/2025-04/admin.types").Maybe<Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentOriginAddress, "address1" | "address2" | "city" | "countryCode" | "provinceCode" | "zip">>;
|
|
8
|
+
fulfillmentLineItems: {
|
|
9
|
+
edges: Array<{
|
|
10
|
+
node: (Pick<import("../../generated-api-types/2025-04/admin.types").FulfillmentLineItem, "id" | "quantity"> & {
|
|
11
|
+
originalTotalSet: {
|
|
12
|
+
shopMoney: Pick<import("../../generated-api-types/2025-04/admin.types").MoneyV2, "amount" | "currencyCode">;
|
|
13
|
+
};
|
|
14
|
+
lineItem: (Pick<import("../../generated-api-types/2025-04/admin.types").LineItem, "id" | "title" | "sku"> & {
|
|
15
|
+
variant?: import("../../generated-api-types/2025-04/admin.types").Maybe<Pick<import("../../generated-api-types/2025-04/admin.types").ProductVariant, "id">>;
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
}> | undefined;
|
|
21
|
+
//# sourceMappingURL=getFulfillmentById.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.mock.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAA;AAM7F,eAAO,MAAM,mBAAmB,EAAE,oBA+EjC,CAAA;AAED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;2BAC8uC,CAAC;;;;;cAD7sC,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { CurrencyCode, FulfillmentStatus, } from '../../generated-api-types/2025-04/admin.types';
|
|
2
|
+
export const fulfillmentByIdMock = {
|
|
3
|
+
fulfillment: {
|
|
4
|
+
id: 'gid://shopify/Fulfillment/5765989589285',
|
|
5
|
+
name: '#B12345.1',
|
|
6
|
+
createdAt: '2023-09-20T08:00:00Z',
|
|
7
|
+
updatedAt: '2023-09-21T10:00:00Z',
|
|
8
|
+
status: FulfillmentStatus.Success,
|
|
9
|
+
totalQuantity: 2,
|
|
10
|
+
estimatedDeliveryAt: '2023-09-22T12:00:00Z',
|
|
11
|
+
deliveredAt: '2023-09-21T10:00:00Z',
|
|
12
|
+
location: {
|
|
13
|
+
id: 'gid://shopify/Location/123456789',
|
|
14
|
+
legacyResourceId: '123456789',
|
|
15
|
+
name: 'Main Warehouse',
|
|
16
|
+
},
|
|
17
|
+
service: {
|
|
18
|
+
handle: 'dhl-express',
|
|
19
|
+
serviceName: 'DHL Express',
|
|
20
|
+
},
|
|
21
|
+
trackingInfo: [
|
|
22
|
+
{
|
|
23
|
+
company: 'DHL',
|
|
24
|
+
number: '123456789012',
|
|
25
|
+
url: 'https://tracking.dhl.com/123456789012',
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
originAddress: {
|
|
29
|
+
address1: 'Warehouse Street 1',
|
|
30
|
+
address2: null,
|
|
31
|
+
city: 'Berlin',
|
|
32
|
+
countryCode: 'DE',
|
|
33
|
+
provinceCode: 'BE',
|
|
34
|
+
zip: '10115',
|
|
35
|
+
},
|
|
36
|
+
fulfillmentLineItems: {
|
|
37
|
+
edges: [
|
|
38
|
+
{
|
|
39
|
+
node: {
|
|
40
|
+
id: 'gid://shopify/FulfillmentLineItem/111111111111',
|
|
41
|
+
quantity: 1,
|
|
42
|
+
originalTotalSet: {
|
|
43
|
+
shopMoney: {
|
|
44
|
+
amount: '129.0',
|
|
45
|
+
currencyCode: CurrencyCode.Eur,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
lineItem: {
|
|
49
|
+
id: 'gid://shopify/LineItem/222222222222',
|
|
50
|
+
title: 'Premium Mattress',
|
|
51
|
+
sku: 'MATTRESS-001',
|
|
52
|
+
variant: {
|
|
53
|
+
id: 'gid://shopify/ProductVariant/333333333333',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
node: {
|
|
60
|
+
id: 'gid://shopify/FulfillmentLineItem/444444444444',
|
|
61
|
+
quantity: 1,
|
|
62
|
+
originalTotalSet: {
|
|
63
|
+
shopMoney: {
|
|
64
|
+
amount: '49.0',
|
|
65
|
+
currencyCode: CurrencyCode.Eur,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
lineItem: {
|
|
69
|
+
id: 'gid://shopify/LineItem/555555555555',
|
|
70
|
+
title: 'Pillow Set',
|
|
71
|
+
sku: 'PILLOW-002',
|
|
72
|
+
variant: {
|
|
73
|
+
id: 'gid://shopify/ProductVariant/666666666666',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
export const expectedFulfillmentById = fulfillmentByIdMock.fulfillment;
|
|
83
|
+
//# sourceMappingURL=getFulfillmentById.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.mock.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.mock.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,iBAAiB,GAClB,MAAM,+CAA+C,CAAA;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,WAAW,EAAE;QACX,EAAE,EAAE,yCAAyC;QAC7C,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,sBAAsB;QACjC,MAAM,EAAE,iBAAiB,CAAC,OAAO;QACjC,aAAa,EAAE,CAAC;QAChB,mBAAmB,EAAE,sBAAsB;QAC3C,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE;YACR,EAAE,EAAE,kCAAkC;YACtC,gBAAgB,EAAE,WAAW;YAC7B,IAAI,EAAE,gBAAgB;SACvB;QACD,OAAO,EAAE;YACP,MAAM,EAAE,aAAa;YACrB,WAAW,EAAE,aAAa;SAC3B;QACD,YAAY,EAAE;YACZ;gBACE,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,cAAc;gBACtB,GAAG,EAAE,uCAAuC;aAC7C;SACF;QACD,aAAa,EAAE;YACb,QAAQ,EAAE,oBAAoB;YAC9B,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,GAAG,EAAE,OAAO;SACb;QACD,oBAAoB,EAAE;YACpB,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE;wBACJ,EAAE,EAAE,gDAAgD;wBACpD,QAAQ,EAAE,CAAC;wBACX,gBAAgB,EAAE;4BAChB,SAAS,EAAE;gCACT,MAAM,EAAE,OAAO;gCACf,YAAY,EAAE,YAAY,CAAC,GAAG;6BAC/B;yBACF;wBACD,QAAQ,EAAE;4BACR,EAAE,EAAE,qCAAqC;4BACzC,KAAK,EAAE,kBAAkB;4BACzB,GAAG,EAAE,cAAc;4BACnB,OAAO,EAAE;gCACP,EAAE,EAAE,2CAA2C;6BAChD;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE;wBACJ,EAAE,EAAE,gDAAgD;wBACpD,QAAQ,EAAE,CAAC;wBACX,gBAAgB,EAAE;4BAChB,SAAS,EAAE;gCACT,MAAM,EAAE,MAAM;gCACd,YAAY,EAAE,YAAY,CAAC,GAAG;6BAC/B;yBACF;wBACD,QAAQ,EAAE;4BACR,EAAE,EAAE,qCAAqC;4BACzC,KAAK,EAAE,YAAY;4BACnB,GAAG,EAAE,YAAY;4BACjB,OAAO,EAAE;gCACP,EAAE,EAAE,2CAA2C;6BAChD;yBACF;qBACF;iBACF;aACF;SACF;KACF;CACF,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.queries.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.queries.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,QAyDhC,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { gql } from '../../utils/logger';
|
|
2
|
+
export const queryFulfillmentById = gql `#graphql
|
|
3
|
+
query fulfillmentById($id: ID!) {
|
|
4
|
+
fulfillment(id: $id) {
|
|
5
|
+
id
|
|
6
|
+
name
|
|
7
|
+
createdAt
|
|
8
|
+
updatedAt
|
|
9
|
+
status
|
|
10
|
+
totalQuantity
|
|
11
|
+
estimatedDeliveryAt
|
|
12
|
+
deliveredAt
|
|
13
|
+
location {
|
|
14
|
+
id
|
|
15
|
+
legacyResourceId
|
|
16
|
+
name
|
|
17
|
+
}
|
|
18
|
+
service {
|
|
19
|
+
handle
|
|
20
|
+
serviceName
|
|
21
|
+
}
|
|
22
|
+
trackingInfo(first: 10) {
|
|
23
|
+
company
|
|
24
|
+
number
|
|
25
|
+
url
|
|
26
|
+
}
|
|
27
|
+
originAddress {
|
|
28
|
+
address1
|
|
29
|
+
address2
|
|
30
|
+
city
|
|
31
|
+
countryCode
|
|
32
|
+
provinceCode
|
|
33
|
+
zip
|
|
34
|
+
}
|
|
35
|
+
fulfillmentLineItems(first: 100) {
|
|
36
|
+
edges {
|
|
37
|
+
node {
|
|
38
|
+
id
|
|
39
|
+
quantity
|
|
40
|
+
originalTotalSet {
|
|
41
|
+
shopMoney {
|
|
42
|
+
amount
|
|
43
|
+
currencyCode
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
lineItem {
|
|
47
|
+
id
|
|
48
|
+
title
|
|
49
|
+
sku
|
|
50
|
+
variant {
|
|
51
|
+
id
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
//# sourceMappingURL=getFulfillmentById.queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.queries.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAExC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDtC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.test.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { graphql, passthrough } from 'msw';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { server } from '../../utils/mswHandlers';
|
|
4
|
+
import { getFulfillmentById } from './getFulfillmentById';
|
|
5
|
+
import { expectedFulfillmentById } from './getFulfillmentById.mock';
|
|
6
|
+
describe('getFulfillmentById', () => {
|
|
7
|
+
it('should return fulfillment when found with GID string', async () => {
|
|
8
|
+
const result = await getFulfillmentById('gid://shopify/Fulfillment/5765989589285');
|
|
9
|
+
expect(result).toEqual(expectedFulfillmentById);
|
|
10
|
+
});
|
|
11
|
+
it('should return fulfillment when found with numeric ID', async () => {
|
|
12
|
+
const result = await getFulfillmentById(5765989589285n);
|
|
13
|
+
expect(result).toEqual(expectedFulfillmentById);
|
|
14
|
+
});
|
|
15
|
+
it('should return fulfillment when found with number', async () => {
|
|
16
|
+
const result = await getFulfillmentById(5765989589285);
|
|
17
|
+
expect(result).toEqual(expectedFulfillmentById);
|
|
18
|
+
});
|
|
19
|
+
it('should include fulfillmentLineItems', async () => {
|
|
20
|
+
const result = await getFulfillmentById('gid://shopify/Fulfillment/5765989589285');
|
|
21
|
+
expect(result?.fulfillmentLineItems.edges).toHaveLength(2);
|
|
22
|
+
expect(result?.fulfillmentLineItems.edges[0]?.node.lineItem.sku).toBe('MATTRESS-001');
|
|
23
|
+
});
|
|
24
|
+
it('should include tracking info', async () => {
|
|
25
|
+
const result = await getFulfillmentById('gid://shopify/Fulfillment/5765989589285');
|
|
26
|
+
expect(result?.trackingInfo).toHaveLength(1);
|
|
27
|
+
expect(result?.trackingInfo[0]?.company).toBe('DHL');
|
|
28
|
+
});
|
|
29
|
+
describe('Live', () => {
|
|
30
|
+
it('should return null when fulfillment not found', async () => {
|
|
31
|
+
server.use(graphql.query('fulfillmentById', () => passthrough()));
|
|
32
|
+
const result = await getFulfillmentById('gid://shopify/Fulfillment/99999999999');
|
|
33
|
+
expect(result).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=getFulfillmentById.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentById.test.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentById.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAEnE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,yCAAyC,CAC1C,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,aAAa,CAAC,CAAA;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,yCAAyC,CAC1C,CAAA;QACD,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CACnE,cAAc,CACf,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,yCAAyC,CAC1C,CAAA;QACD,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,uCAAuC,CACxC,CAAA;YACD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type FulfillmentTrackingIds = {
|
|
2
|
+
trackingNumbers: string[];
|
|
3
|
+
trackingCompany: string | null;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Retrieves tracking information for a fulfillment by its ID.
|
|
7
|
+
* Returns the tracking numbers and the tracking company.
|
|
8
|
+
*
|
|
9
|
+
* @param {string | number | bigint} id - The Shopify fulfillment ID. Can be a GID string (e.g., "gid://shopify/Fulfillment/123456789") or a numeric ID (e.g., 123456789 or 123456789n).
|
|
10
|
+
* @returns {Promise<FulfillmentTrackingIds | null>} A promise that resolves to the tracking info or null if fulfillment not found.
|
|
11
|
+
* @throws {Error} If the GraphQL query fails.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getFulfillmentTrackingIds(id: string | number | bigint): Promise<FulfillmentTrackingIds | null>;
|
|
14
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,sBAAsB,GAAG;IACnC,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAC3B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAgCxC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import { convertIdIntoGid, fetchShopifyGraphql, } from '../../utils/shopifyFetch.js';
|
|
3
|
+
import { queryFulfillmentTrackingIds } from './getFulfillmentTrackingIds.queries.js';
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves tracking information for a fulfillment by its ID.
|
|
6
|
+
* Returns the tracking numbers and the tracking company.
|
|
7
|
+
*
|
|
8
|
+
* @param {string | number | bigint} id - The Shopify fulfillment ID. Can be a GID string (e.g., "gid://shopify/Fulfillment/123456789") or a numeric ID (e.g., 123456789 or 123456789n).
|
|
9
|
+
* @returns {Promise<FulfillmentTrackingIds | null>} A promise that resolves to the tracking info or null if fulfillment not found.
|
|
10
|
+
* @throws {Error} If the GraphQL query fails.
|
|
11
|
+
*/
|
|
12
|
+
export async function getFulfillmentTrackingIds(id) {
|
|
13
|
+
const gid = typeof id === 'string'
|
|
14
|
+
? id
|
|
15
|
+
: convertIdIntoGid(typeof id === 'number' ? BigInt(id) : id, 'Fulfillment');
|
|
16
|
+
const variables = { id: gid };
|
|
17
|
+
const response = await fetchShopifyGraphql({
|
|
18
|
+
query: queryFulfillmentTrackingIds,
|
|
19
|
+
variables,
|
|
20
|
+
});
|
|
21
|
+
if (!response.fulfillment) {
|
|
22
|
+
logger.debug(`No fulfillment found with ID: ${id}`);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const trackingInfo = response.fulfillment.trackingInfo;
|
|
26
|
+
const trackingNumbers = trackingInfo
|
|
27
|
+
.map((info) => info.number)
|
|
28
|
+
.filter((num) => num != null);
|
|
29
|
+
// Use the first company found (typically all tracking numbers share the same company)
|
|
30
|
+
const trackingCompany = trackingInfo[0]?.company ?? null;
|
|
31
|
+
return {
|
|
32
|
+
trackingNumbers,
|
|
33
|
+
trackingCompany,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAA;AAOpF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAA4B;IAE5B,MAAM,GAAG,GACP,OAAO,EAAE,KAAK,QAAQ;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,gBAAgB,CACd,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EACxC,aAAa,CACd,CAAA;IAEP,MAAM,SAAS,GAAyC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;IAEnE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAA8B;QACtE,KAAK,EAAE,2BAA2B;QAClC,SAAS;KACV,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAA;IACtD,MAAM,eAAe,GAAG,YAAY;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;SAC1B,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;IAC9C,sFAAsF;IACtF,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI,CAAA;IAExD,OAAO;QACL,eAAe;QACf,eAAe;KAChB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FulfillmentTrackingIdsQuery } from '../../generated-api-types/2025-04/admin.generated';
|
|
2
|
+
import type { FulfillmentTrackingIds } from './getFulfillmentTrackingIds';
|
|
3
|
+
export declare const fulfillmentTrackingIdsMock: FulfillmentTrackingIdsQuery;
|
|
4
|
+
export declare const expectedFulfillmentTrackingIds: FulfillmentTrackingIds;
|
|
5
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.mock.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAA;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEzE,eAAO,MAAM,0BAA0B,EAAE,2BAcxC,CAAA;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAG5C,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const fulfillmentTrackingIdsMock = {
|
|
2
|
+
fulfillment: {
|
|
3
|
+
id: 'gid://shopify/Fulfillment/5765989589285',
|
|
4
|
+
trackingInfo: [
|
|
5
|
+
{
|
|
6
|
+
company: 'DHL',
|
|
7
|
+
number: '123456789012',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
company: 'DHL',
|
|
11
|
+
number: '987654321098',
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export const expectedFulfillmentTrackingIds = {
|
|
17
|
+
trackingNumbers: ['123456789012', '987654321098'],
|
|
18
|
+
trackingCompany: 'DHL',
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.mock.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.mock.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,0BAA0B,GAAgC;IACrE,WAAW,EAAE;QACX,EAAE,EAAE,yCAAyC;QAC7C,YAAY,EAAE;YACZ;gBACE,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,cAAc;aACvB;SACF;KACF;CACF,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA2B;IACpE,eAAe,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IACjD,eAAe,EAAE,KAAK;CACvB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.queries.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.queries.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,QAUvC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { gql } from '../../utils/logger';
|
|
2
|
+
export const queryFulfillmentTrackingIds = gql `#graphql
|
|
3
|
+
query fulfillmentTrackingIds($id: ID!) {
|
|
4
|
+
fulfillment(id: $id) {
|
|
5
|
+
id
|
|
6
|
+
trackingInfo(first: 50) {
|
|
7
|
+
company
|
|
8
|
+
number
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
`;
|
|
13
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.queries.js","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAExC,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAA;;;;;;;;;;CAU7C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFulfillmentTrackingIds.test.d.ts","sourceRoot":"","sources":["../../../src/queries/fulfillments/getFulfillmentTrackingIds.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { HttpResponse, graphql, passthrough } from 'msw';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { server } from '../../utils/mswHandlers';
|
|
4
|
+
import { getFulfillmentTrackingIds } from './getFulfillmentTrackingIds';
|
|
5
|
+
import { expectedFulfillmentTrackingIds } from './getFulfillmentTrackingIds.mock';
|
|
6
|
+
describe('getFulfillmentTrackingIds', () => {
|
|
7
|
+
it('should return tracking info when found with GID string', async () => {
|
|
8
|
+
const result = await getFulfillmentTrackingIds('gid://shopify/Fulfillment/5765989589285');
|
|
9
|
+
expect(result).toEqual(expectedFulfillmentTrackingIds);
|
|
10
|
+
});
|
|
11
|
+
it('should return tracking info when found with numeric ID', async () => {
|
|
12
|
+
const result = await getFulfillmentTrackingIds(5765989589285n);
|
|
13
|
+
expect(result).toEqual(expectedFulfillmentTrackingIds);
|
|
14
|
+
});
|
|
15
|
+
it('should return tracking info when found with number', async () => {
|
|
16
|
+
const result = await getFulfillmentTrackingIds(5765989589285);
|
|
17
|
+
expect(result).toEqual(expectedFulfillmentTrackingIds);
|
|
18
|
+
});
|
|
19
|
+
it('should return empty tracking when fulfillment has no tracking info', async () => {
|
|
20
|
+
server.use(graphql.query('fulfillmentTrackingIds', () => HttpResponse.json({
|
|
21
|
+
data: {
|
|
22
|
+
fulfillment: {
|
|
23
|
+
id: 'gid://shopify/Fulfillment/5765989589285',
|
|
24
|
+
trackingInfo: [],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
})));
|
|
28
|
+
const result = await getFulfillmentTrackingIds(5765989589285);
|
|
29
|
+
expect(result).toEqual({
|
|
30
|
+
trackingNumbers: [],
|
|
31
|
+
trackingCompany: null,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it('should filter out null tracking numbers', async () => {
|
|
35
|
+
server.use(graphql.query('fulfillmentTrackingIds', () => HttpResponse.json({
|
|
36
|
+
data: {
|
|
37
|
+
fulfillment: {
|
|
38
|
+
id: 'gid://shopify/Fulfillment/5765989589285',
|
|
39
|
+
trackingInfo: [
|
|
40
|
+
{ number: '123456789', company: 'DHL' },
|
|
41
|
+
{ number: null, company: 'DHL' },
|
|
42
|
+
{ number: '987654321', company: 'DHL' },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
})));
|
|
47
|
+
const result = await getFulfillmentTrackingIds(5765989589285);
|
|
48
|
+
expect(result).toEqual({
|
|
49
|
+
trackingNumbers: ['123456789', '987654321'],
|
|
50
|
+
trackingCompany: 'DHL',
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('Live', () => {
|
|
54
|
+
it('should return null when fulfillment not found', async () => {
|
|
55
|
+
server.use(graphql.query('fulfillmentTrackingIds', () => passthrough()));
|
|
56
|
+
const result = await getFulfillmentTrackingIds('gid://shopify/Fulfillment/99999999999');
|
|
57
|
+
expect(result).toBeNull();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=getFulfillmentTrackingIds.test.js.map
|