@shopbb/helium 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 ADDED
@@ -0,0 +1,50 @@
1
+ # @shopbb/helium
2
+
3
+ The storefront framework for [shopbb](https://oxygen-demo.cloudc.top). Use it inside a Cloudflare Worker to talk to the shopbb Storefront API.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @shopbb/helium
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```ts
14
+ import { createHeliumContext, cartGetIdDefault, cartSetIdDefault } from '@shopbb/helium';
15
+
16
+ export default {
17
+ async fetch(request: Request, env: Env, ctx: ExecutionContext) {
18
+ const ctx = createHeliumContext({
19
+ request,
20
+ env,
21
+ executionContext: ctx,
22
+ storefront: {
23
+ apiUrl: env.PUBLIC_STOREFRONT_API_URL,
24
+ publicAccessToken: request.headers.get('X-Public-Storefront-Token')!,
25
+ privateAccessToken: request.headers.get('X-Private-Storefront-Token') ?? undefined,
26
+ storeId: request.headers.get('X-Store-Id')!,
27
+ },
28
+ cart: {
29
+ getId: cartGetIdDefault(request.headers),
30
+ setId: cartSetIdDefault({ maxage: 60 * 60 * 24 * 365 }),
31
+ },
32
+ });
33
+
34
+ const { products } = await ctx.storefront.query(
35
+ `{ products(first: 10) { nodes { id title } } }`,
36
+ { cache: ctx.storefront.CacheShort() },
37
+ );
38
+
39
+ return new Response(JSON.stringify(products), {
40
+ headers: { ...Object.fromEntries(ctx.responseHeaders), 'content-type': 'application/json' },
41
+ });
42
+ },
43
+ };
44
+ ```
45
+
46
+ See the full docs at [oxygen-demo.cloudc.top/docs/helium](https://oxygen-demo.cloudc.top/docs/helium).
47
+
48
+ ## License
49
+
50
+ MIT
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Cache strategies.
3
+ *
4
+ * Use with storefront.query({ cache: CacheLong() }).
5
+ *
6
+ * Mirrors Shopify Hydrogen's cache strategies API.
7
+ */
8
+ import type { CacheStrategy } from './types';
9
+ export declare function CacheNone(): CacheStrategy;
10
+ export declare function CacheShort(): CacheStrategy;
11
+ export declare function CacheLong(): CacheStrategy;
12
+ /**
13
+ * Custom cache TTL in seconds.
14
+ */
15
+ export declare function CacheCustom(seconds: number): CacheStrategy;
16
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,wBAAgB,SAAS,IAAI,aAAa,CAEzC;AAED,wBAAgB,UAAU,IAAI,aAAa,CAE1C;AAED,wBAAgB,SAAS,IAAI,aAAa,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAK1D"}
package/dist/cache.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Cache strategies.
3
+ *
4
+ * Use with storefront.query({ cache: CacheLong() }).
5
+ *
6
+ * Mirrors Shopify Hydrogen's cache strategies API.
7
+ */
8
+ export function CacheNone() {
9
+ return { mode: 'NONE', maxAge: 0 };
10
+ }
11
+ export function CacheShort() {
12
+ return { mode: 'PUBLIC', maxAge: 60, staleWhileRevalidate: 600 };
13
+ }
14
+ export function CacheLong() {
15
+ return { mode: 'PUBLIC', maxAge: 3600, staleWhileRevalidate: 82800 };
16
+ }
17
+ /**
18
+ * Custom cache TTL in seconds.
19
+ */
20
+ export function CacheCustom(seconds) {
21
+ return {
22
+ mode: seconds > 0 ? 'PUBLIC' : 'NONE',
23
+ maxAge: Math.max(0, seconds),
24
+ };
25
+ }
26
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO;QACL,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QACrC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Cart ID helpers.
3
+ *
4
+ * Cookie name: "cart"
5
+ * - cartGetIdDefault: parse "cart=<id>" from request cookie
6
+ * - cartSetIdDefault: returns a function that appends Set-Cookie to response headers
7
+ *
8
+ * 命名/行为对齐 Shopify Hydrogen (`cartGetIdDefault` / `cartSetIdDefault`).
9
+ */
10
+ import type { CartIdGetter, CartIdSetter } from './types';
11
+ export interface CartSetIdOptions {
12
+ /** Cookie path (default '/') */
13
+ path?: string;
14
+ /** Cookie max-age in seconds (default 1 year) */
15
+ maxage?: number;
16
+ /** SameSite policy (default 'Lax') */
17
+ sameSite?: 'Lax' | 'Strict' | 'None';
18
+ /** Secure flag (default true) */
19
+ secure?: boolean;
20
+ /** HttpOnly flag (default true) */
21
+ httpOnly?: boolean;
22
+ /** Optional domain */
23
+ domain?: string;
24
+ }
25
+ /**
26
+ * Returns a getter that reads `cart=<id>` from request cookies.
27
+ */
28
+ export declare function cartGetIdDefault(requestHeaders: Headers): CartIdGetter;
29
+ /**
30
+ * Returns a setter that appends `Set-Cookie: cart=<id>; ...` to response headers.
31
+ */
32
+ export declare function cartSetIdDefault(options?: CartSetIdOptions): CartIdSetter;
33
+ //# sourceMappingURL=cart-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart-id.d.ts","sourceRoot":"","sources":["../src/cart-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,OAAO,GAAG,YAAY,CAMtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,YAAY,CAmB7E"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Cart ID helpers.
3
+ *
4
+ * Cookie name: "cart"
5
+ * - cartGetIdDefault: parse "cart=<id>" from request cookie
6
+ * - cartSetIdDefault: returns a function that appends Set-Cookie to response headers
7
+ *
8
+ * 命名/行为对齐 Shopify Hydrogen (`cartGetIdDefault` / `cartSetIdDefault`).
9
+ */
10
+ const COOKIE_NAME = 'cart';
11
+ /**
12
+ * Returns a getter that reads `cart=<id>` from request cookies.
13
+ */
14
+ export function cartGetIdDefault(requestHeaders) {
15
+ return () => {
16
+ const cookie = requestHeaders.get('cookie') || '';
17
+ const match = cookie.match(/(?:^|; )cart=([^;]+)/);
18
+ return match ? decodeURIComponent(match[1]) : null;
19
+ };
20
+ }
21
+ /**
22
+ * Returns a setter that appends `Set-Cookie: cart=<id>; ...` to response headers.
23
+ */
24
+ export function cartSetIdDefault(options = {}) {
25
+ const path = options.path ?? '/';
26
+ const maxage = options.maxage ?? 60 * 60 * 24 * 365;
27
+ const sameSite = options.sameSite ?? 'Lax';
28
+ const secure = options.secure !== false;
29
+ const httpOnly = options.httpOnly !== false;
30
+ const domainPart = options.domain ? `; Domain=${options.domain}` : '';
31
+ return (cartId, headers) => {
32
+ const cookie = `${COOKIE_NAME}=${encodeURIComponent(cartId)}` +
33
+ `; Path=${path}` +
34
+ `; Max-Age=${maxage}` +
35
+ `; SameSite=${sameSite}` +
36
+ (secure ? '; Secure' : '') +
37
+ (httpOnly ? '; HttpOnly' : '') +
38
+ domainPart;
39
+ headers.append('Set-Cookie', cookie);
40
+ };
41
+ }
42
+ //# sourceMappingURL=cart-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart-id.js","sourceRoot":"","sources":["../src/cart-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,MAAM,WAAW,GAAG,MAAM,CAAC;AAE3B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAuB;IACtD,OAAO,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA4B,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtE,OAAO,CAAC,MAAc,EAAE,OAAgB,EAAE,EAAE;QAC1C,MAAM,MAAM,GACV,GAAG,WAAW,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE;YAC9C,UAAU,IAAI,EAAE;YAChB,aAAa,MAAM,EAAE;YACrB,cAAc,QAAQ,EAAE;YACxB,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * createCartHandler
3
+ *
4
+ * High-level cart API that wraps the storefront GraphQL mutations.
5
+ * Behavior aligned with Shopify Hydrogen:
6
+ * - get(): returns null if no cart cookie or cart doesn't exist
7
+ * - addLines(): if no cart exists, calls cartCreate first
8
+ * - All mutations: auto setCookie when a new cart is created
9
+ *
10
+ * The handler operates on Cart GIDs internally; callers pass merchandiseIds
11
+ * (ProductVariant GIDs) and line IDs (cart line IDs).
12
+ */
13
+ import type { CartHandler, CartHandlerOptions } from './types';
14
+ /** Default cart return fragment. Can be overridden by caller. */
15
+ export declare const DEFAULT_CART_FRAGMENT = "\n fragment CartReturn on Cart {\n id\n createdAt\n updatedAt\n totalQuantity\n cost {\n subtotalAmount { amount currencyCode }\n totalAmount { amount currencyCode }\n }\n lines(first: 50) {\n nodes {\n id\n quantity\n cost {\n totalAmount { amount currencyCode }\n amountPerQuantity { amount currencyCode }\n }\n merchandise {\n ... on ProductVariant {\n id\n title\n sku\n availableForSale\n price { amount currencyCode }\n image { url altText }\n product { id handle title }\n }\n }\n }\n }\n checkoutUrl\n }\n";
16
+ export declare function createCartHandler(options: CartHandlerOptions): CartHandler;
17
+ //# sourceMappingURL=createCartHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCartHandler.d.ts","sourceRoot":"","sources":["../src/createCartHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAInB,MAAM,SAAS,CAAC;AAEjB,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,ktBAiCjC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAmI1E"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * createCartHandler
3
+ *
4
+ * High-level cart API that wraps the storefront GraphQL mutations.
5
+ * Behavior aligned with Shopify Hydrogen:
6
+ * - get(): returns null if no cart cookie or cart doesn't exist
7
+ * - addLines(): if no cart exists, calls cartCreate first
8
+ * - All mutations: auto setCookie when a new cart is created
9
+ *
10
+ * The handler operates on Cart GIDs internally; callers pass merchandiseIds
11
+ * (ProductVariant GIDs) and line IDs (cart line IDs).
12
+ */
13
+ /** Default cart return fragment. Can be overridden by caller. */
14
+ export const DEFAULT_CART_FRAGMENT = /* GraphQL */ `
15
+ fragment CartReturn on Cart {
16
+ id
17
+ createdAt
18
+ updatedAt
19
+ totalQuantity
20
+ cost {
21
+ subtotalAmount { amount currencyCode }
22
+ totalAmount { amount currencyCode }
23
+ }
24
+ lines(first: 50) {
25
+ nodes {
26
+ id
27
+ quantity
28
+ cost {
29
+ totalAmount { amount currencyCode }
30
+ amountPerQuantity { amount currencyCode }
31
+ }
32
+ merchandise {
33
+ ... on ProductVariant {
34
+ id
35
+ title
36
+ sku
37
+ availableForSale
38
+ price { amount currencyCode }
39
+ image { url altText }
40
+ product { id handle title }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ checkoutUrl
46
+ }
47
+ `;
48
+ export function createCartHandler(options) {
49
+ const { storefront, getCartId, setCartId: rawSetId, responseHeaders } = options;
50
+ // Set the cart ID (delegate to options.setCartId, which writes Set-Cookie)
51
+ function setCartId(cartId) {
52
+ rawSetId(cartId, responseHeaders);
53
+ }
54
+ // ----- GraphQL operations -----
55
+ const CART_QUERY = /* GraphQL */ `
56
+ ${DEFAULT_CART_FRAGMENT}
57
+ query Cart($id: ID!) {
58
+ cart(id: $id) { ...CartReturn }
59
+ }
60
+ `;
61
+ const CART_CREATE = /* GraphQL */ `
62
+ ${DEFAULT_CART_FRAGMENT}
63
+ mutation CartCreate($input: CartInput) {
64
+ cartCreate(input: $input) {
65
+ cart { ...CartReturn }
66
+ userErrors { field message code }
67
+ }
68
+ }
69
+ `;
70
+ const CART_LINES_ADD = /* GraphQL */ `
71
+ ${DEFAULT_CART_FRAGMENT}
72
+ mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
73
+ cartLinesAdd(cartId: $cartId, lines: $lines) {
74
+ cart { ...CartReturn }
75
+ userErrors { field message code }
76
+ }
77
+ }
78
+ `;
79
+ const CART_LINES_UPDATE = /* GraphQL */ `
80
+ ${DEFAULT_CART_FRAGMENT}
81
+ mutation CartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
82
+ cartLinesUpdate(cartId: $cartId, lines: $lines) {
83
+ cart { ...CartReturn }
84
+ userErrors { field message code }
85
+ }
86
+ }
87
+ `;
88
+ const CART_LINES_REMOVE = /* GraphQL */ `
89
+ ${DEFAULT_CART_FRAGMENT}
90
+ mutation CartLinesRemove($cartId: ID!, $lineIds: [ID!]!) {
91
+ cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
92
+ cart { ...CartReturn }
93
+ userErrors { field message code }
94
+ }
95
+ }
96
+ `;
97
+ // ----- Handler methods -----
98
+ async function get() {
99
+ const cartId = getCartId();
100
+ if (!cartId)
101
+ return null;
102
+ const data = await storefront.query(CART_QUERY, {
103
+ variables: { id: cartId },
104
+ cache: storefront.CacheNone(),
105
+ });
106
+ return data.cart ?? null;
107
+ }
108
+ async function create(input) {
109
+ const data = await storefront.mutate(CART_CREATE, { variables: { input: input ?? {} } });
110
+ const result = data.cartCreate;
111
+ if (result.cart)
112
+ setCartId(result.cart.id);
113
+ return { cart: result.cart, userErrors: result.userErrors };
114
+ }
115
+ async function addLines(lines) {
116
+ const cartId = getCartId();
117
+ if (!cartId) {
118
+ // No existing cart → create with these lines
119
+ return create({ lines });
120
+ }
121
+ const data = await storefront.mutate(CART_LINES_ADD, { variables: { cartId, lines } });
122
+ return { cart: data.cartLinesAdd.cart, userErrors: data.cartLinesAdd.userErrors };
123
+ }
124
+ async function updateLines(lines) {
125
+ const cartId = getCartId();
126
+ if (!cartId) {
127
+ return {
128
+ cart: null,
129
+ userErrors: [{ message: 'No cart exists', code: 'NO_CART' }],
130
+ };
131
+ }
132
+ const data = await storefront.mutate(CART_LINES_UPDATE, { variables: { cartId, lines } });
133
+ return { cart: data.cartLinesUpdate.cart, userErrors: data.cartLinesUpdate.userErrors };
134
+ }
135
+ async function removeLines(lineIds) {
136
+ const cartId = getCartId();
137
+ if (!cartId) {
138
+ return {
139
+ cart: null,
140
+ userErrors: [{ message: 'No cart exists', code: 'NO_CART' }],
141
+ };
142
+ }
143
+ const data = await storefront.mutate(CART_LINES_REMOVE, { variables: { cartId, lineIds } });
144
+ return { cart: data.cartLinesRemove.cart, userErrors: data.cartLinesRemove.userErrors };
145
+ }
146
+ return {
147
+ get,
148
+ getCartId,
149
+ setCartId,
150
+ create,
151
+ addLines,
152
+ updateLines,
153
+ removeLines,
154
+ };
155
+ }
156
+ //# sourceMappingURL=createCartHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCartHandler.js","sourceRoot":"","sources":["../src/createCartHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * createHeliumContext
3
+ *
4
+ * Entry-point factory that assembles a storefront client and a cart handler
5
+ * into a single context object that loaders/actions can consume.
6
+ *
7
+ * Usage:
8
+ * const context = createHeliumContext({ request, env, executionContext,
9
+ * storefront: { apiUrl, publicAccessToken, storeId },
10
+ * cart: { getId: cartGetIdDefault(request.headers),
11
+ * setId: cartSetIdDefault({ maxage: ... }) }
12
+ * });
13
+ *
14
+ * // Then:
15
+ * const data = await context.storefront.query(QUERY);
16
+ * const result = await context.cart.addLines([...]);
17
+ *
18
+ * // When responding:
19
+ * return new Response(html, { headers: context.responseHeaders });
20
+ */
21
+ import type { HeliumContext, HeliumContextOptions } from './types';
22
+ export declare function createHeliumContext(options: HeliumContextOptions): HeliumContext;
23
+ //# sourceMappingURL=createHeliumContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHeliumContext.d.ts","sourceRoot":"","sources":["../src/createHeliumContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAInE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA8ChF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * createHeliumContext
3
+ *
4
+ * Entry-point factory that assembles a storefront client and a cart handler
5
+ * into a single context object that loaders/actions can consume.
6
+ *
7
+ * Usage:
8
+ * const context = createHeliumContext({ request, env, executionContext,
9
+ * storefront: { apiUrl, publicAccessToken, storeId },
10
+ * cart: { getId: cartGetIdDefault(request.headers),
11
+ * setId: cartSetIdDefault({ maxage: ... }) }
12
+ * });
13
+ *
14
+ * // Then:
15
+ * const data = await context.storefront.query(QUERY);
16
+ * const result = await context.cart.addLines([...]);
17
+ *
18
+ * // When responding:
19
+ * return new Response(html, { headers: context.responseHeaders });
20
+ */
21
+ import { createStorefrontClient } from './createStorefrontClient';
22
+ import { createCartHandler } from './createCartHandler';
23
+ export function createHeliumContext(options) {
24
+ const { request, env, executionContext, storefront: storefrontOpts, cart: cartOpts } = options;
25
+ // Mutable headers that will be merged into the eventual response
26
+ // (used for Set-Cookie when cart cookie needs to be written).
27
+ const responseHeaders = new Headers();
28
+ // 1. Build storefront client
29
+ const storefront = createStorefrontClient({
30
+ apiUrl: storefrontOpts.apiUrl,
31
+ publicAccessToken: storefrontOpts.publicAccessToken,
32
+ privateAccessToken: storefrontOpts.privateAccessToken,
33
+ storeId: storefrontOpts.storeId,
34
+ request,
35
+ cache: storefrontOpts.cache,
36
+ waitUntil: storefrontOpts.waitUntil ??
37
+ executionContext.waitUntil.bind(executionContext),
38
+ });
39
+ // 2. Build cart handler (if cart options provided)
40
+ let cart;
41
+ if (cartOpts) {
42
+ cart = createCartHandler({
43
+ storefront,
44
+ getCartId: cartOpts.getId,
45
+ setCartId: cartOpts.setId,
46
+ responseHeaders,
47
+ });
48
+ }
49
+ else {
50
+ // No cart options provided → no-op cart handler
51
+ cart = createCartHandler({
52
+ storefront,
53
+ getCartId: () => null,
54
+ setCartId: () => { },
55
+ responseHeaders,
56
+ });
57
+ }
58
+ return {
59
+ env,
60
+ request,
61
+ storefront,
62
+ cart,
63
+ responseHeaders,
64
+ };
65
+ }
66
+ //# sourceMappingURL=createHeliumContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHeliumContext.js","sourceRoot":"","sources":["../src/createHeliumContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE/F,iEAAiE;IACjE,8DAA8D;IAC9D,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;IAEtC,6BAA6B;IAC7B,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;QACnD,kBAAkB,EAAE,cAAc,CAAC,kBAAkB;QACrD,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,OAAO;QACP,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,SAAS,EACP,cAAc,CAAC,SAAS;YACxB,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;KACpD,CAAC,CAAC;IAEH,mDAAmD;IACnD,IAAI,IAAI,CAAC;IACT,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,iBAAiB,CAAC;YACvB,UAAU;YACV,SAAS,EAAE,QAAQ,CAAC,KAAK;YACzB,SAAS,EAAE,QAAQ,CAAC,KAAK;YACzB,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,gDAAgD;QAChD,IAAI,GAAG,iBAAiB,CAAC;YACvB,UAAU;YACV,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;YACrB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;YACnB,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,GAAG;QACH,OAAO;QACP,UAAU;QACV,IAAI;QACJ,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * createStorefrontClient
3
+ *
4
+ * A thin GraphQL client wrapper around fetch(), with caching.
5
+ *
6
+ * 行为对齐 Shopify Hydrogen 的 storefront client:
7
+ * - query() 可缓存(CacheLong / CacheShort / etc.)
8
+ * - mutate() 不缓存
9
+ * - 自动注入 X-Storefront-Access-Token header
10
+ * - GraphQL errors 非空时抛出
11
+ *
12
+ * 内部缓存策略:
13
+ * - 用 caches.default 或传入的 cache 对象(Cache API)
14
+ * - cache key = SHA256(query + variables + storeId)
15
+ * - 命中 / SWR / MISS 模式区分
16
+ */
17
+ import type { StorefrontClient, StorefrontClientOptions } from './types';
18
+ export declare function createStorefrontClient(options: StorefrontClientOptions): StorefrontClient;
19
+ //# sourceMappingURL=createStorefrontClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStorefrontClient.d.ts","sourceRoot":"","sources":["../src/createStorefrontClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EAIxB,MAAM,SAAS,CAAC;AAGjB,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CAyIzF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * createStorefrontClient
3
+ *
4
+ * A thin GraphQL client wrapper around fetch(), with caching.
5
+ *
6
+ * 行为对齐 Shopify Hydrogen 的 storefront client:
7
+ * - query() 可缓存(CacheLong / CacheShort / etc.)
8
+ * - mutate() 不缓存
9
+ * - 自动注入 X-Storefront-Access-Token header
10
+ * - GraphQL errors 非空时抛出
11
+ *
12
+ * 内部缓存策略:
13
+ * - 用 caches.default 或传入的 cache 对象(Cache API)
14
+ * - cache key = SHA256(query + variables + storeId)
15
+ * - 命中 / SWR / MISS 模式区分
16
+ */
17
+ import { CacheNone, CacheShort, CacheLong, CacheCustom } from './cache';
18
+ export function createStorefrontClient(options) {
19
+ const { apiUrl, publicAccessToken, privateAccessToken, storeId, cache, waitUntil, } = options;
20
+ const headers = () => ({
21
+ 'Content-Type': 'application/json',
22
+ Accept: 'application/json',
23
+ 'X-Storefront-Access-Token': privateAccessToken || publicAccessToken,
24
+ 'X-Store-Id': storeId,
25
+ });
26
+ /**
27
+ * Compute a stable cache key for a query + variables.
28
+ */
29
+ async function cacheKeyFor(query, variables) {
30
+ const payload = JSON.stringify({ q: query, v: variables ?? {}, s: storeId });
31
+ const hashBuf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(payload));
32
+ const hashHex = Array.from(new Uint8Array(hashBuf))
33
+ .map((b) => b.toString(16).padStart(2, '0'))
34
+ .join('');
35
+ return new Request(`https://helium-cache.invalid/${storeId}/${hashHex}`, { method: 'GET' });
36
+ }
37
+ async function executeGraphQL(query, variables) {
38
+ const body = JSON.stringify({ query, variables });
39
+ const res = await fetch(apiUrl, {
40
+ method: 'POST',
41
+ headers: headers(),
42
+ body,
43
+ });
44
+ if (!res.ok) {
45
+ throw new Error(`Storefront API HTTP ${res.status}: ${await res.text()}`);
46
+ }
47
+ const json = await res.json();
48
+ if (json.errors && json.errors.length > 0) {
49
+ const messages = json.errors.map((e) => e.message).join('; ');
50
+ throw new Error(`Storefront GraphQL errors: ${messages}`);
51
+ }
52
+ return json.data;
53
+ }
54
+ async function query(q, opts = {}) {
55
+ const cacheStrategy = opts.cache ?? CacheNone();
56
+ // No caching → direct call
57
+ if (cacheStrategy.mode === 'NONE' || !cache) {
58
+ return executeGraphQL(q, opts.variables);
59
+ }
60
+ const key = await cacheKeyFor(q, opts.variables);
61
+ const cached = await cache.match(key);
62
+ const now = Date.now();
63
+ if (cached) {
64
+ const ttl = Number(cached.headers.get('helium-ttl') ?? '0');
65
+ const cachedAt = Number(cached.headers.get('helium-cached-at') ?? '0');
66
+ const age = (now - cachedAt) / 1000;
67
+ if (age < ttl) {
68
+ // Fresh
69
+ return (await cached.json());
70
+ }
71
+ // Stale, return stale-while-revalidate if configured
72
+ const swr = cacheStrategy.staleWhileRevalidate ?? 0;
73
+ if (age < ttl + swr) {
74
+ // Trigger background revalidation
75
+ if (waitUntil) {
76
+ waitUntil(refreshCache(q, opts.variables, key, cacheStrategy));
77
+ }
78
+ return (await cached.json());
79
+ }
80
+ // Expired
81
+ }
82
+ const data = await executeGraphQL(q, opts.variables);
83
+ // Async write to cache
84
+ if (waitUntil) {
85
+ waitUntil(writeCache(key, data, cacheStrategy));
86
+ }
87
+ else {
88
+ // Best-effort sync
89
+ await writeCache(key, data, cacheStrategy);
90
+ }
91
+ return data;
92
+ }
93
+ async function refreshCache(q, variables, key, strategy) {
94
+ try {
95
+ const data = await executeGraphQL(q, variables);
96
+ await writeCache(key, data, strategy);
97
+ }
98
+ catch (e) {
99
+ // Swallow errors during background refresh
100
+ console.error('[helium] cache refresh failed', e);
101
+ }
102
+ }
103
+ async function writeCache(key, data, strategy) {
104
+ if (!cache)
105
+ return;
106
+ const ttl = strategy.maxAge;
107
+ const swr = strategy.staleWhileRevalidate ?? 0;
108
+ const totalAge = ttl + swr;
109
+ const resp = new Response(JSON.stringify(data), {
110
+ headers: {
111
+ 'Content-Type': 'application/json',
112
+ 'Cache-Control': `public, max-age=${totalAge}`,
113
+ 'helium-ttl': String(ttl),
114
+ 'helium-cached-at': String(Date.now()),
115
+ },
116
+ });
117
+ await cache.put(key, resp);
118
+ }
119
+ async function mutate(m, opts = {}) {
120
+ return executeGraphQL(m, opts.variables);
121
+ }
122
+ return {
123
+ query,
124
+ mutate,
125
+ CacheNone,
126
+ CacheShort,
127
+ CacheLong,
128
+ CacheCustom,
129
+ };
130
+ }
131
+ //# sourceMappingURL=createStorefrontClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStorefrontClient.js","sourceRoot":"","sources":["../src/createStorefrontClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @shopbb/helium
3
+ *
4
+ * shopbb's storefront framework. Hydrogen-equivalent for the shopbb platform.
5
+ *
6
+ * Public API:
7
+ *
8
+ * - createHeliumContext Top-level factory
9
+ * - createStorefrontClient GraphQL client (used by createHeliumContext)
10
+ * - createCartHandler Cart operations (used by createHeliumContext)
11
+ * - cartGetIdDefault Default cart ID getter (reads cookie)
12
+ * - cartSetIdDefault Default cart ID setter (writes Set-Cookie)
13
+ * - CacheNone / CacheShort / CacheLong / CacheCustom
14
+ */
15
+ export { createHeliumContext } from './createHeliumContext';
16
+ export { createStorefrontClient } from './createStorefrontClient';
17
+ export { createCartHandler, DEFAULT_CART_FRAGMENT } from './createCartHandler';
18
+ export { cartGetIdDefault, cartSetIdDefault } from './cart-id';
19
+ export type { CartSetIdOptions } from './cart-id';
20
+ export { CacheNone, CacheShort, CacheLong, CacheCustom } from './cache';
21
+ export type { CacheStrategy, StorefrontClient, StorefrontClientOptions, QueryOptions, MutateOptions, CartHandler, CartHandlerOptions, CartLineInput, CartLineUpdateInput, CartUserError, CartResult, CartIdGetter, CartIdSetter, HeliumContext, HeliumContextOptions, } from './types';
22
+ //# sourceMappingURL=index.d.ts.map