codex-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.
Files changed (50) hide show
  1. package/README.md +51 -0
  2. package/dist/cart/index.d.ts +41 -0
  3. package/dist/cart/index.d.ts.map +1 -0
  4. package/dist/cart/index.js +278 -0
  5. package/dist/cart/index.js.map +1 -0
  6. package/dist/catalog/index.d.ts +4 -0
  7. package/dist/catalog/index.d.ts.map +1 -0
  8. package/dist/catalog/index.js +2 -0
  9. package/dist/catalog/index.js.map +1 -0
  10. package/dist/connectors/pinnacle/catalog.d.ts +63 -0
  11. package/dist/connectors/pinnacle/catalog.d.ts.map +1 -0
  12. package/dist/connectors/pinnacle/catalog.js +238 -0
  13. package/dist/connectors/pinnacle/catalog.js.map +1 -0
  14. package/dist/connectors/pinnacle/index.d.ts +3 -0
  15. package/dist/connectors/pinnacle/index.d.ts.map +1 -0
  16. package/dist/connectors/pinnacle/index.js +3 -0
  17. package/dist/connectors/pinnacle/index.js.map +1 -0
  18. package/dist/connectors/pinnacle/taxonomy.d.ts +53 -0
  19. package/dist/connectors/pinnacle/taxonomy.d.ts.map +1 -0
  20. package/dist/connectors/pinnacle/taxonomy.js +206 -0
  21. package/dist/connectors/pinnacle/taxonomy.js.map +1 -0
  22. package/dist/errors/index.d.ts +47 -0
  23. package/dist/errors/index.d.ts.map +1 -0
  24. package/dist/errors/index.js +257 -0
  25. package/dist/errors/index.js.map +1 -0
  26. package/dist/images/index.d.ts +31 -0
  27. package/dist/images/index.d.ts.map +1 -0
  28. package/dist/images/index.js +39 -0
  29. package/dist/images/index.js.map +1 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +9 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/money/index.d.ts +5 -0
  35. package/dist/money/index.d.ts.map +1 -0
  36. package/dist/money/index.js +29 -0
  37. package/dist/money/index.js.map +1 -0
  38. package/dist/react-router/index.d.ts +3 -0
  39. package/dist/react-router/index.d.ts.map +1 -0
  40. package/dist/react-router/index.js +2 -0
  41. package/dist/react-router/index.js.map +1 -0
  42. package/dist/shopify/index.d.ts +107 -0
  43. package/dist/shopify/index.d.ts.map +1 -0
  44. package/dist/shopify/index.js +524 -0
  45. package/dist/shopify/index.js.map +1 -0
  46. package/dist/types/index.d.ts +172 -0
  47. package/dist/types/index.d.ts.map +1 -0
  48. package/dist/types/index.js +2 -0
  49. package/dist/types/index.js.map +1 -0
  50. package/package.json +72 -0
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # codex-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 "codex-commerce-platform/money";
26
+ import { classifyRouteError } from "codex-commerce-platform/errors";
27
+ import type { StorefrontProduct } from "codex-commerce-platform/types";
28
+ ```
29
+
30
+ Root exports are also available:
31
+
32
+ ```ts
33
+ import { formatMoney, classifyRouteError } from "codex-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":"AAAA,OAAO,EAAE,kBAAkB,EAAgC,MAAM,qBAAqB,CAAC;AAqEvF,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,OAAO;QACL,OAAO,CAAC,MAAM;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,aAAa,CAAC,MAAM;YAClB,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,UAAU,CAAC,KAAK;YACd,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,KAAK;YACxB,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,eAAe,CAAC,MAAM,EAAE,KAAK;YAC3B,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,eAAe,CAAC,MAAM,EAAE,OAAO;YAC7B,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAgC,EAAE,MAAc;IAC5E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAoB,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgC,EAAE,MAAc;IAClF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgC,EAAE,KAAiB;IAClF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAqB,oBAAoB,EAAE;QAC3E,KAAK,EAAE,KAAK,IAAI,EAAE;KACnB,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgC,EAChC,MAAc,EACd,KAAsB;IAEtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAuB,uBAAuB,EAAE;QAChF,MAAM;QACN,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgC,EAChC,MAAc,EACd,KAA4B;IAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAA0B,0BAA0B,EAAE;QACtF,MAAM;QACN,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgC,EAChC,MAAc,EACd,OAAiB;IAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAA0B,0BAA0B,EAAE;QACtF,MAAM;QACN,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA4B,EAAE,SAAiB;IACzE,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,kBAAkB,CAAC,GAAG,SAAS,YAAY,uBAAuB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,kBAAkB,CAAC,GAAG,SAAS,wBAAwB,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAgC;IACtE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,CAAC,KAAK,YAAY,kBAAkB,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACrI,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAA6B;IAC9D,OAAO,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,OAAO;QACL,GAAG,IAAI;QACP,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAQ,UAAgD;IACrF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAiB,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAiB,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;CAStB,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B7B,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CrB,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEzG,MAAM,UAAU,GAAG;GAChB,cAAc;;;;;;;CAOhB,CAAC;AAEF,MAAM,oBAAoB,GAAG;GAC1B,cAAc;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,uBAAuB,GAAG;GAC7B,cAAc;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,0BAA0B,GAAG;GAChC,cAAc;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,0BAA0B,GAAG;GAChC,cAAc;;;;;;;;;;;;;;CAchB,CAAC"}
@@ -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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"}