@codextech/commerce-platform 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 +51 -0
- package/dist/cart/index.d.ts +41 -0
- package/dist/cart/index.d.ts.map +1 -0
- package/dist/cart/index.js +278 -0
- package/dist/cart/index.js.map +1 -0
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/connectors/pinnacle/catalog.d.ts +63 -0
- package/dist/connectors/pinnacle/catalog.d.ts.map +1 -0
- package/dist/connectors/pinnacle/catalog.js +238 -0
- package/dist/connectors/pinnacle/catalog.js.map +1 -0
- package/dist/connectors/pinnacle/index.d.ts +3 -0
- package/dist/connectors/pinnacle/index.d.ts.map +1 -0
- package/dist/connectors/pinnacle/index.js +3 -0
- package/dist/connectors/pinnacle/index.js.map +1 -0
- package/dist/connectors/pinnacle/taxonomy.d.ts +53 -0
- package/dist/connectors/pinnacle/taxonomy.d.ts.map +1 -0
- package/dist/connectors/pinnacle/taxonomy.js +206 -0
- package/dist/connectors/pinnacle/taxonomy.js.map +1 -0
- package/dist/errors/index.d.ts +47 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +257 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/images/index.d.ts +31 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +39 -0
- package/dist/images/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/money/index.d.ts +5 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/index.js +29 -0
- package/dist/money/index.js.map +1 -0
- package/dist/react-router/index.d.ts +3 -0
- package/dist/react-router/index.d.ts.map +1 -0
- package/dist/react-router/index.js +2 -0
- package/dist/react-router/index.js.map +1 -0
- package/dist/shopify/index.d.ts +107 -0
- package/dist/shopify/index.d.ts.map +1 -0
- package/dist/shopify/index.js +524 -0
- package/dist/shopify/index.js.map +1 -0
- package/dist/types/index.d.ts +172 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# @codextech/commerce-platform
|
|
2
|
+
|
|
3
|
+
Non-visual commerce utilities for Codex client-owned storefronts.
|
|
4
|
+
|
|
5
|
+
This package is intentionally not an RR7 storefront and does not own client UI. It should expose typed data helpers for Shopify, carts, catalog/search, images, money, errors, and connector mapping.
|
|
6
|
+
|
|
7
|
+
## Boundary
|
|
8
|
+
|
|
9
|
+
Allowed here:
|
|
10
|
+
|
|
11
|
+
- Types for products, collections, carts, money, images, and catalog results
|
|
12
|
+
- Pure money formatting helpers
|
|
13
|
+
- Generic image URL helpers
|
|
14
|
+
- Generic route/error classification and safe logging helpers
|
|
15
|
+
- Connector-specific taxonomy helpers, starting with Pinnacle
|
|
16
|
+
- Explicit runtime config builders
|
|
17
|
+
|
|
18
|
+
Not allowed here:
|
|
19
|
+
|
|
20
|
+
- JSX, React components, CSS, routes, layouts, page composition, static pages, product cards, mega menus, brand assets, client copy, tenant navigation, or generated client configs
|
|
21
|
+
|
|
22
|
+
## Imports
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { formatMoney } from "@codextech/commerce-platform/money";
|
|
26
|
+
import { classifyRouteError } from "@codextech/commerce-platform/errors";
|
|
27
|
+
import type { StorefrontProduct } from "@codextech/commerce-platform/types";
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Root exports are also available:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { formatMoney, classifyRouteError } from "@codextech/commerce-platform";
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Client storefronts may temporarily alias this package as `@codex/commerce-platform` in `package.json`
|
|
37
|
+
to avoid broad import churn while moving away from local `file:` dependencies.
|
|
38
|
+
|
|
39
|
+
## Runtime Config
|
|
40
|
+
|
|
41
|
+
The package should receive explicit config from the app:
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
createShopifyStorefrontConfig({
|
|
45
|
+
storeDomain,
|
|
46
|
+
storefrontAccessToken,
|
|
47
|
+
apiVersion,
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
It must not read hidden tenant config, generated site config, or app globals.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { StorefrontApiError, type ShopifyStorefrontClient } from "../shopify/index.js";
|
|
2
|
+
import type { Cart, CartInput, CartLine, CartLineInput, CartLineUpdateInput, CartUserError } from "../types/index.js";
|
|
3
|
+
export type { Cart, CartCost, CartInput, CartLine, CartLineCost, CartLineInput, CartLineMerchandise, CartLineUpdateInput, CartUserError, } from "../types/index.js";
|
|
4
|
+
export interface CartServiceConfig {
|
|
5
|
+
shopify: ShopifyStorefrontClient;
|
|
6
|
+
}
|
|
7
|
+
export interface CartService {
|
|
8
|
+
getCart(cartId: string): Promise<Cart | null>;
|
|
9
|
+
getCartSafely(cartId: string): Promise<Cart | null>;
|
|
10
|
+
createCart(input?: CartInput): Promise<Cart>;
|
|
11
|
+
addCartLines(cartId: string, lines: CartLineInput[]): Promise<Cart>;
|
|
12
|
+
updateCartLines(cartId: string, lines: CartLineUpdateInput[]): Promise<Cart>;
|
|
13
|
+
removeCartLines(cartId: string, lineIds: string[]): Promise<Cart>;
|
|
14
|
+
}
|
|
15
|
+
export interface Connection<TNode> {
|
|
16
|
+
nodes?: TNode[] | null;
|
|
17
|
+
edges?: Array<{
|
|
18
|
+
node: TNode;
|
|
19
|
+
}> | null;
|
|
20
|
+
}
|
|
21
|
+
export interface CartResponse extends Omit<Cart, "lines"> {
|
|
22
|
+
lines?: Connection<CartLine> | null;
|
|
23
|
+
}
|
|
24
|
+
export interface CartMutationPayload {
|
|
25
|
+
cart: CartResponse | null;
|
|
26
|
+
userErrors: CartUserError[];
|
|
27
|
+
}
|
|
28
|
+
export declare function createCartService(config: CartServiceConfig): CartService;
|
|
29
|
+
export declare function getCart(shopify: ShopifyStorefrontClient, cartId: string): Promise<Cart | null>;
|
|
30
|
+
export declare function getCartSafely(shopify: ShopifyStorefrontClient, cartId: string): Promise<Cart | null>;
|
|
31
|
+
export declare function createCart(shopify: ShopifyStorefrontClient, input?: CartInput): Promise<Cart>;
|
|
32
|
+
export declare function addCartLines(shopify: ShopifyStorefrontClient, cartId: string, lines: CartLineInput[]): Promise<Cart>;
|
|
33
|
+
export declare function updateCartLines(shopify: ShopifyStorefrontClient, cartId: string, lines: CartLineUpdateInput[]): Promise<Cart>;
|
|
34
|
+
export declare function removeCartLines(shopify: ShopifyStorefrontClient, cartId: string, lineIds: string[]): Promise<Cart>;
|
|
35
|
+
export declare function requireCart(payload: CartMutationPayload, operation: string): Cart;
|
|
36
|
+
export declare function cartUserErrorsToMessage(errors: readonly CartUserError[]): string;
|
|
37
|
+
export declare function isRecoverableCartError(error: unknown): error is StorefrontApiError;
|
|
38
|
+
export declare function getCartCheckoutUrl(cart: Cart | null | undefined): string | null;
|
|
39
|
+
export declare function normalizeCart(cart: CartResponse): Cart;
|
|
40
|
+
export declare function connectionNodes<TNode>(connection: Connection<TNode> | null | undefined): TNode[];
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cart/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { StorefrontApiError } from "../shopify/index.js";
|
|
2
|
+
export function createCartService(config) {
|
|
3
|
+
return {
|
|
4
|
+
getCart(cartId) {
|
|
5
|
+
return getCart(config.shopify, cartId);
|
|
6
|
+
},
|
|
7
|
+
getCartSafely(cartId) {
|
|
8
|
+
return getCartSafely(config.shopify, cartId);
|
|
9
|
+
},
|
|
10
|
+
createCart(input) {
|
|
11
|
+
return createCart(config.shopify, input);
|
|
12
|
+
},
|
|
13
|
+
addCartLines(cartId, lines) {
|
|
14
|
+
return addCartLines(config.shopify, cartId, lines);
|
|
15
|
+
},
|
|
16
|
+
updateCartLines(cartId, lines) {
|
|
17
|
+
return updateCartLines(config.shopify, cartId, lines);
|
|
18
|
+
},
|
|
19
|
+
removeCartLines(cartId, lineIds) {
|
|
20
|
+
return removeCartLines(config.shopify, cartId, lineIds);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function getCart(shopify, cartId) {
|
|
25
|
+
const data = await shopify.request(CART_QUERY, { cartId });
|
|
26
|
+
return data.cart ? normalizeCart(data.cart) : null;
|
|
27
|
+
}
|
|
28
|
+
export async function getCartSafely(shopify, cartId) {
|
|
29
|
+
try {
|
|
30
|
+
return await getCart(shopify, cartId);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (isRecoverableCartError(error)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function createCart(shopify, input) {
|
|
40
|
+
const data = await shopify.request(CART_CREATE_MUTATION, {
|
|
41
|
+
input: input ?? {},
|
|
42
|
+
});
|
|
43
|
+
return requireCart(data.cartCreate, "cartCreate");
|
|
44
|
+
}
|
|
45
|
+
export async function addCartLines(shopify, cartId, lines) {
|
|
46
|
+
if (lines.length === 0) {
|
|
47
|
+
throw new Error("addCartLines requires at least one line");
|
|
48
|
+
}
|
|
49
|
+
const data = await shopify.request(CART_LINES_ADD_MUTATION, {
|
|
50
|
+
cartId,
|
|
51
|
+
lines,
|
|
52
|
+
});
|
|
53
|
+
return requireCart(data.cartLinesAdd, "cartLinesAdd");
|
|
54
|
+
}
|
|
55
|
+
export async function updateCartLines(shopify, cartId, lines) {
|
|
56
|
+
if (lines.length === 0) {
|
|
57
|
+
throw new Error("updateCartLines requires at least one line");
|
|
58
|
+
}
|
|
59
|
+
const data = await shopify.request(CART_LINES_UPDATE_MUTATION, {
|
|
60
|
+
cartId,
|
|
61
|
+
lines,
|
|
62
|
+
});
|
|
63
|
+
return requireCart(data.cartLinesUpdate, "cartLinesUpdate");
|
|
64
|
+
}
|
|
65
|
+
export async function removeCartLines(shopify, cartId, lineIds) {
|
|
66
|
+
if (lineIds.length === 0) {
|
|
67
|
+
throw new Error("removeCartLines requires at least one line id");
|
|
68
|
+
}
|
|
69
|
+
const data = await shopify.request(CART_LINES_REMOVE_MUTATION, {
|
|
70
|
+
cartId,
|
|
71
|
+
lineIds,
|
|
72
|
+
});
|
|
73
|
+
return requireCart(data.cartLinesRemove, "cartLinesRemove");
|
|
74
|
+
}
|
|
75
|
+
export function requireCart(payload, operation) {
|
|
76
|
+
if (payload.userErrors.length) {
|
|
77
|
+
throw new StorefrontApiError(`${operation} failed: ${cartUserErrorsToMessage(payload.userErrors)}`);
|
|
78
|
+
}
|
|
79
|
+
if (!payload.cart) {
|
|
80
|
+
throw new StorefrontApiError(`${operation} did not return a cart`);
|
|
81
|
+
}
|
|
82
|
+
return normalizeCart(payload.cart);
|
|
83
|
+
}
|
|
84
|
+
export function cartUserErrorsToMessage(errors) {
|
|
85
|
+
return errors.map((error) => error.message).join("; ");
|
|
86
|
+
}
|
|
87
|
+
export function isRecoverableCartError(error) {
|
|
88
|
+
if (!(error instanceof StorefrontApiError))
|
|
89
|
+
return false;
|
|
90
|
+
const message = error.message.toLowerCase();
|
|
91
|
+
return message.includes("cart") || message.includes("checkout") || message.includes("verification") || message.includes("invalid");
|
|
92
|
+
}
|
|
93
|
+
export function getCartCheckoutUrl(cart) {
|
|
94
|
+
return cart?.checkoutUrl || null;
|
|
95
|
+
}
|
|
96
|
+
export function normalizeCart(cart) {
|
|
97
|
+
return {
|
|
98
|
+
...cart,
|
|
99
|
+
lines: connectionNodes(cart.lines),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function connectionNodes(connection) {
|
|
103
|
+
if (!connection) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
if (connection.nodes) {
|
|
107
|
+
return connection.nodes.filter((node) => node !== null && node !== undefined);
|
|
108
|
+
}
|
|
109
|
+
return (connection.edges ?? [])
|
|
110
|
+
.map((edge) => edge.node)
|
|
111
|
+
.filter((node) => node !== null && node !== undefined);
|
|
112
|
+
}
|
|
113
|
+
const MONEY_FRAGMENT = `#graphql
|
|
114
|
+
fragment MoneyFields on MoneyV2 {
|
|
115
|
+
amount
|
|
116
|
+
currencyCode
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
const IMAGE_FRAGMENT = `#graphql
|
|
120
|
+
fragment ImageFields on Image {
|
|
121
|
+
url
|
|
122
|
+
smallUrl: url(transform: {maxWidth: 480})
|
|
123
|
+
thumbnailUrl: url(transform: {maxWidth: 240})
|
|
124
|
+
altText
|
|
125
|
+
width
|
|
126
|
+
height
|
|
127
|
+
}
|
|
128
|
+
`;
|
|
129
|
+
const CART_VARIANT_FRAGMENT = `#graphql
|
|
130
|
+
fragment CartVariantFields on ProductVariant {
|
|
131
|
+
id
|
|
132
|
+
title
|
|
133
|
+
availableForSale
|
|
134
|
+
sku
|
|
135
|
+
selectedOptions {
|
|
136
|
+
name
|
|
137
|
+
value
|
|
138
|
+
}
|
|
139
|
+
price {
|
|
140
|
+
...MoneyFields
|
|
141
|
+
}
|
|
142
|
+
compareAtPrice {
|
|
143
|
+
...MoneyFields
|
|
144
|
+
}
|
|
145
|
+
image {
|
|
146
|
+
...ImageFields
|
|
147
|
+
}
|
|
148
|
+
product {
|
|
149
|
+
id
|
|
150
|
+
handle
|
|
151
|
+
title
|
|
152
|
+
featuredImage {
|
|
153
|
+
...ImageFields
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
const CART_FRAGMENT = `#graphql
|
|
159
|
+
fragment CartFields on Cart {
|
|
160
|
+
id
|
|
161
|
+
checkoutUrl
|
|
162
|
+
totalQuantity
|
|
163
|
+
cost {
|
|
164
|
+
subtotalAmount {
|
|
165
|
+
...MoneyFields
|
|
166
|
+
}
|
|
167
|
+
totalAmount {
|
|
168
|
+
...MoneyFields
|
|
169
|
+
}
|
|
170
|
+
totalTaxAmount {
|
|
171
|
+
...MoneyFields
|
|
172
|
+
}
|
|
173
|
+
totalDutyAmount {
|
|
174
|
+
...MoneyFields
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
lines(first: 100) {
|
|
178
|
+
nodes {
|
|
179
|
+
id
|
|
180
|
+
quantity
|
|
181
|
+
cost {
|
|
182
|
+
amountPerQuantity {
|
|
183
|
+
...MoneyFields
|
|
184
|
+
}
|
|
185
|
+
compareAtAmountPerQuantity {
|
|
186
|
+
...MoneyFields
|
|
187
|
+
}
|
|
188
|
+
subtotalAmount {
|
|
189
|
+
...MoneyFields
|
|
190
|
+
}
|
|
191
|
+
totalAmount {
|
|
192
|
+
...MoneyFields
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
merchandise {
|
|
196
|
+
... on ProductVariant {
|
|
197
|
+
...CartVariantFields
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
`;
|
|
204
|
+
const CART_FRAGMENTS = [MONEY_FRAGMENT, IMAGE_FRAGMENT, CART_VARIANT_FRAGMENT, CART_FRAGMENT].join("\n");
|
|
205
|
+
const CART_QUERY = `#graphql
|
|
206
|
+
${CART_FRAGMENTS}
|
|
207
|
+
|
|
208
|
+
query Cart($cartId: ID!) {
|
|
209
|
+
cart(id: $cartId) {
|
|
210
|
+
...CartFields
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
`;
|
|
214
|
+
const CART_CREATE_MUTATION = `#graphql
|
|
215
|
+
${CART_FRAGMENTS}
|
|
216
|
+
|
|
217
|
+
mutation CartCreate($input: CartInput) {
|
|
218
|
+
cartCreate(input: $input) {
|
|
219
|
+
cart {
|
|
220
|
+
...CartFields
|
|
221
|
+
}
|
|
222
|
+
userErrors {
|
|
223
|
+
field
|
|
224
|
+
message
|
|
225
|
+
code
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
`;
|
|
230
|
+
const CART_LINES_ADD_MUTATION = `#graphql
|
|
231
|
+
${CART_FRAGMENTS}
|
|
232
|
+
|
|
233
|
+
mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
|
|
234
|
+
cartLinesAdd(cartId: $cartId, lines: $lines) {
|
|
235
|
+
cart {
|
|
236
|
+
...CartFields
|
|
237
|
+
}
|
|
238
|
+
userErrors {
|
|
239
|
+
field
|
|
240
|
+
message
|
|
241
|
+
code
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
`;
|
|
246
|
+
const CART_LINES_UPDATE_MUTATION = `#graphql
|
|
247
|
+
${CART_FRAGMENTS}
|
|
248
|
+
|
|
249
|
+
mutation CartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
|
|
250
|
+
cartLinesUpdate(cartId: $cartId, lines: $lines) {
|
|
251
|
+
cart {
|
|
252
|
+
...CartFields
|
|
253
|
+
}
|
|
254
|
+
userErrors {
|
|
255
|
+
field
|
|
256
|
+
message
|
|
257
|
+
code
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
`;
|
|
262
|
+
const CART_LINES_REMOVE_MUTATION = `#graphql
|
|
263
|
+
${CART_FRAGMENTS}
|
|
264
|
+
|
|
265
|
+
mutation CartLinesRemove($cartId: ID!, $lineIds: [ID!]!) {
|
|
266
|
+
cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
|
|
267
|
+
cart {
|
|
268
|
+
...CartFields
|
|
269
|
+
}
|
|
270
|
+
userErrors {
|
|
271
|
+
field
|
|
272
|
+
message
|
|
273
|
+
code
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
`;
|
|
278
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cart/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { CatalogFacetOption, PinnacleCatalogFacets, PinnacleCatalogState, ProductSearchInput } from "../connectors/pinnacle/catalog.js";
|
|
2
|
+
export { buildPinnacleCatalogFacets, buildPinnacleCatalogHref, buildPinnaclePaginationHrefs, categoryParamFromLabel, parsePinnacleCatalogState, pinnacleSearchInputFromState, PINNACLE_CATALOG_PAGE_SIZE, } from "../connectors/pinnacle/catalog.js";
|
|
3
|
+
export type { CatalogFilter, CatalogFilterValue, PageInfo, ProductCatalogResult } from "../types/index.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC7I,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { buildPinnacleCatalogFacets, buildPinnacleCatalogHref, buildPinnaclePaginationHrefs, categoryParamFromLabel, parsePinnacleCatalogState, pinnacleSearchInputFromState, PINNACLE_CATALOG_PAGE_SIZE, } from "../connectors/pinnacle/catalog.js";
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PageInfo, ProductCatalogResult } from "../../types/index.js";
|
|
2
|
+
import { categoryLabelFromSlug, categorySlugFromLabel, slugifyCatalogValue, type PinnacleProductLike } from "./taxonomy.js";
|
|
3
|
+
export declare const PINNACLE_CATALOG_PAGE_SIZE = 24;
|
|
4
|
+
export interface CatalogFacetOption {
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
count: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PinnacleCatalogFacets {
|
|
10
|
+
makeOptions: CatalogFacetOption[];
|
|
11
|
+
modelOptions: CatalogFacetOption[];
|
|
12
|
+
yearOptions: CatalogFacetOption[];
|
|
13
|
+
priceBounds: {
|
|
14
|
+
min: number;
|
|
15
|
+
max: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface PinnacleCatalogState {
|
|
19
|
+
categorySlug: string | null;
|
|
20
|
+
categoryLabel: string;
|
|
21
|
+
q: string;
|
|
22
|
+
sort: string;
|
|
23
|
+
makes: string[];
|
|
24
|
+
models: string[];
|
|
25
|
+
years: string[];
|
|
26
|
+
minPrice: string | null;
|
|
27
|
+
maxPrice: string | null;
|
|
28
|
+
available: boolean;
|
|
29
|
+
after: string | null;
|
|
30
|
+
before: string | null;
|
|
31
|
+
pageSize: number;
|
|
32
|
+
}
|
|
33
|
+
export interface ProductSearchInput {
|
|
34
|
+
query?: string | null;
|
|
35
|
+
rawQueryParts?: readonly string[];
|
|
36
|
+
minPrice?: string | null;
|
|
37
|
+
maxPrice?: string | null;
|
|
38
|
+
available?: boolean | null;
|
|
39
|
+
first?: number | null;
|
|
40
|
+
last?: number | null;
|
|
41
|
+
after?: string | null;
|
|
42
|
+
before?: string | null;
|
|
43
|
+
sortMode?: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface PinnacleFacetedProductLike extends PinnacleProductLike {
|
|
46
|
+
priceRange: {
|
|
47
|
+
minVariantPrice: {
|
|
48
|
+
amount: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
type CatalogHrefValue = string | number | boolean | readonly string[] | null | undefined;
|
|
53
|
+
export declare function parsePinnacleCatalogState(searchParams: URLSearchParams, routeCategorySlug?: string | null): PinnacleCatalogState;
|
|
54
|
+
export declare function pinnacleSearchInputFromState(state: PinnacleCatalogState): ProductSearchInput;
|
|
55
|
+
export declare function buildPinnacleCatalogFacets<TProduct extends PinnacleFacetedProductLike>(products: readonly TProduct[], state: PinnacleCatalogState, shopifyFilters?: ProductCatalogResult<TProduct>["filters"]): PinnacleCatalogFacets;
|
|
56
|
+
export declare function buildPinnacleCatalogHref(requestUrl: string, updates: Record<string, CatalogHrefValue>): string;
|
|
57
|
+
export declare function buildPinnaclePaginationHrefs(requestUrl: string, pageInfo: PageInfo): {
|
|
58
|
+
previousHref: string | null;
|
|
59
|
+
nextHref: string | null;
|
|
60
|
+
};
|
|
61
|
+
export declare function categoryParamFromLabel(category: string): string | null;
|
|
62
|
+
export { categoryLabelFromSlug, categorySlugFromLabel, slugifyCatalogValue };
|
|
63
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/connectors/pinnacle/catalog.ts"],"names":[],"mappings":"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"}
|