@numueg/theme-sdk 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/index-CGx6FNqb.d.ts +167 -0
- package/dist/index-zSb0FIyh.d.mts +167 -0
- package/dist/index.cjs +2751 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +1645 -0
- package/dist/index.d.ts +1645 -0
- package/dist/index.mjs +2669 -0
- package/dist/index.mjs.map +1 -0
- package/dist/normalize.cjs +96 -0
- package/dist/normalize.cjs.map +1 -0
- package/dist/normalize.d.mts +15 -0
- package/dist/normalize.d.ts +15 -0
- package/dist/normalize.mjs +94 -0
- package/dist/normalize.mjs.map +1 -0
- package/dist/theme-NWJAU9jd.d.mts +128 -0
- package/dist/theme-NWJAU9jd.d.ts +128 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +81 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@numueg/theme-sdk` are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - 2026-05-11
|
|
8
|
+
|
|
9
|
+
First public release. Full surface documented at [numueg.app/docs/sdk/overview](https://numueg.app/docs/sdk/overview).
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **25+ hooks**: `useShop`, `useThemeSettings`, `useLocalization`, `useDirection`, `useTranslation`, `useCurrency`, `usePage`, `useProduct(Optional)`, `useProducts`, `useCollection(Optional)`, `useCollections`, `useVariantSelection`, `useRelatedProducts`, `useCart`, `useCustomer`, `useCustomerActions`, `useCustomerAddresses`, `useOrders`, `useOrder`, `useReorder`, `useGiftCardBalance`, `useCheckout`, `useShippingRates`, `useSearch`, `useNavigation`, `useAnalytics`, `useApp`, `useWishlist`, `useSection(Optional)`, `useImage`, `useMoney`.
|
|
14
|
+
- **15+ components**: `NuMuProvider`, `ProductProvider`, `CollectionProvider`, `Section`, `Block`, `Image`, `Money`, `Link`, `Form`, `AddToCartButton`, `ProductCard`, `CollectionCard`, `RichText`, `CurrencySwitcher`, `LocaleSwitcher`, `CookieConsent`.
|
|
15
|
+
- **Variant helpers**: `findVariantByOptions`, `defaultVariant`, `availableValues`.
|
|
16
|
+
- **Federation runtime helpers**: `registerSdkSingleton`, `getSdkSingleton`, `registerReactSingleton`, `getReactSingleton`, `isSdkAvailable`.
|
|
17
|
+
- **Asset + format helpers**: `assetUrl`, `sanitizeHtml`, `resolveThemeSettings`.
|
|
18
|
+
- Dual ESM + CJS build via `tsup` with full `.d.ts` types.
|
|
19
|
+
- React 18 + 19 supported via `peerDependencies`.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 NUMU
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @numueg/theme-sdk
|
|
2
|
+
|
|
3
|
+
> React hooks + components + helpers for building NUMU storefront themes.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@numueg/theme-sdk)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
The SDK every NUMU theme consumes. 25+ hooks (`useCart`, `useProduct`, `useCheckout`, `useVariantSelection`, `useGiftCardBalance`, …), 15+ components (`AddToCartButton`, `ProductCard`, `Money`, `Section`, `NuMuProvider`, …), and helpers for variant resolution, asset URLs, and federation singletons.
|
|
9
|
+
|
|
10
|
+
Themes import via the bare specifier `@numueg/theme-sdk` — at runtime the storefront's import map resolves it to the host-loaded singleton so every theme on the platform shares one React identity.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install --save-peer @numueg/theme-sdk react react-dom
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Then externalize all three in `vite.config.ts`:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
export default defineConfig({
|
|
22
|
+
build: {
|
|
23
|
+
rollupOptions: {
|
|
24
|
+
external: ["react", "react-dom", "react/jsx-runtime", "react-dom/client", "@numueg/theme-sdk"],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The `@numueg/theme-plugin` Vite plugin does this for you automatically.
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { createRoot } from "react-dom/client";
|
|
36
|
+
import { NuMuProvider, useCart, AddToCartButton } from "@numueg/theme-sdk";
|
|
37
|
+
import type { MountContext } from "@numueg/theme-sdk";
|
|
38
|
+
|
|
39
|
+
function App() {
|
|
40
|
+
const { cart } = useCart();
|
|
41
|
+
return <p>Items in cart: {cart.item_count}</p>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function mount(ctx: MountContext) {
|
|
45
|
+
const root = createRoot(document.getElementById("numu-root")!);
|
|
46
|
+
root.render(<NuMuProvider {...ctx}><App /></NuMuProvider>);
|
|
47
|
+
return () => root.unmount();
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Docs
|
|
52
|
+
|
|
53
|
+
- [SDK Overview](https://numueg.app/docs/sdk/overview)
|
|
54
|
+
- [Hooks Reference](https://numueg.app/docs/sdk/hooks)
|
|
55
|
+
- [Components Reference](https://numueg.app/docs/sdk/components)
|
|
56
|
+
- [Type Definitions](https://numueg.app/docs/sdk/types)
|
|
57
|
+
|
|
58
|
+
## React versions
|
|
59
|
+
|
|
60
|
+
Supports React 18 and 19. Declared via `peerDependencies`.
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import './theme-NWJAU9jd.js';
|
|
2
|
+
|
|
3
|
+
/** Core store entity */
|
|
4
|
+
interface Store {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
domain?: string;
|
|
9
|
+
subdomain?: string;
|
|
10
|
+
logo_url?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
currency: string;
|
|
13
|
+
default_language: string;
|
|
14
|
+
use_nextjs_storefront: boolean;
|
|
15
|
+
social_links?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/** Product entity */
|
|
18
|
+
interface Product {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
price: number;
|
|
24
|
+
compare_at_price?: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
images: ProductImage[];
|
|
27
|
+
/** Option axes (Size / Color / Material / ...). Phase 8.1. */
|
|
28
|
+
options?: ProductOption[];
|
|
29
|
+
variants: ProductVariant[];
|
|
30
|
+
category?: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
in_stock: boolean;
|
|
33
|
+
seo_title?: string;
|
|
34
|
+
seo_description?: string;
|
|
35
|
+
}
|
|
36
|
+
interface ProductImage {
|
|
37
|
+
id: string;
|
|
38
|
+
url: string;
|
|
39
|
+
alt?: string;
|
|
40
|
+
position: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* One option axis declared on a product — Phase 8.1.
|
|
44
|
+
*
|
|
45
|
+
* Variants reference these by `name`, picking one value per axis to
|
|
46
|
+
* form their `option_values` map. A T-shirt with options
|
|
47
|
+
* `[{name:"Size",values:["S","M","L"]}, {name:"Color",values:["Red","Blue"]}]`
|
|
48
|
+
* has 6 variants, one per (Size, Color) pair.
|
|
49
|
+
*/
|
|
50
|
+
interface ProductOption {
|
|
51
|
+
name: string;
|
|
52
|
+
position: number;
|
|
53
|
+
values: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* One purchasable variant — Phase 8.1.
|
|
57
|
+
*
|
|
58
|
+
* Themes render a variant picker by mapping each `ProductOption` to a
|
|
59
|
+
* set of radio buttons / swatches, then finding the matching variant
|
|
60
|
+
* via `option_values`. The matching variant's `id` is what
|
|
61
|
+
* `add-to-cart` sends. Use the SDK helper `findVariantByOptions()` to
|
|
62
|
+
* pick the right row given a partial selection.
|
|
63
|
+
*
|
|
64
|
+
* Note: `price` and `compare_at_price` are cents (integers), not
|
|
65
|
+
* decimal — the backend ships these as string-decimals; the SDK
|
|
66
|
+
* parses them to numbers when hydrating.
|
|
67
|
+
*/
|
|
68
|
+
interface ProductVariant {
|
|
69
|
+
id: string;
|
|
70
|
+
position: number;
|
|
71
|
+
/** Axis-name → chosen-value map. Single-variant products have `{}`. */
|
|
72
|
+
option_values: Record<string, string>;
|
|
73
|
+
price: number;
|
|
74
|
+
price_currency?: string;
|
|
75
|
+
compare_at_price?: number | null;
|
|
76
|
+
sku?: string | null;
|
|
77
|
+
barcode?: string | null;
|
|
78
|
+
inventory_quantity: number;
|
|
79
|
+
is_in_stock: boolean;
|
|
80
|
+
image_url?: string | null;
|
|
81
|
+
weight?: number | null;
|
|
82
|
+
/** Legacy field — kept for backward compat with pre-Phase-8.1 themes
|
|
83
|
+
* that read `variant.name`. The backend stops setting this in 8.1;
|
|
84
|
+
* themes should switch to formatting `option_values` themselves. */
|
|
85
|
+
name?: string;
|
|
86
|
+
/** Alias for `is_in_stock`; preserved for backward compat. */
|
|
87
|
+
in_stock?: boolean;
|
|
88
|
+
/** Alias for `option_values`; preserved for backward compat. */
|
|
89
|
+
options?: Record<string, string>;
|
|
90
|
+
}
|
|
91
|
+
/** Collection entity */
|
|
92
|
+
interface Collection {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
slug: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
image_url?: string;
|
|
98
|
+
product_count: number;
|
|
99
|
+
products?: Product[];
|
|
100
|
+
}
|
|
101
|
+
/** Cart entity */
|
|
102
|
+
interface Cart {
|
|
103
|
+
id: string;
|
|
104
|
+
items: CartItem[];
|
|
105
|
+
subtotal: number;
|
|
106
|
+
total: number;
|
|
107
|
+
currency: string;
|
|
108
|
+
discount_code?: string;
|
|
109
|
+
discount_amount?: number;
|
|
110
|
+
note?: string;
|
|
111
|
+
}
|
|
112
|
+
interface CartItem {
|
|
113
|
+
id: string;
|
|
114
|
+
product_id: string;
|
|
115
|
+
variant_id?: string;
|
|
116
|
+
name: string;
|
|
117
|
+
image_url?: string;
|
|
118
|
+
price: number;
|
|
119
|
+
quantity: number;
|
|
120
|
+
variant_name?: string;
|
|
121
|
+
}
|
|
122
|
+
/** Customer entity */
|
|
123
|
+
interface Customer {
|
|
124
|
+
id: string;
|
|
125
|
+
email: string;
|
|
126
|
+
first_name?: string;
|
|
127
|
+
last_name?: string;
|
|
128
|
+
phone?: string;
|
|
129
|
+
avatar_url?: string;
|
|
130
|
+
orders_count: number;
|
|
131
|
+
total_spent: number;
|
|
132
|
+
}
|
|
133
|
+
/** Order entity */
|
|
134
|
+
interface Order {
|
|
135
|
+
id: string;
|
|
136
|
+
order_number: string;
|
|
137
|
+
status: string;
|
|
138
|
+
total: number;
|
|
139
|
+
currency: string;
|
|
140
|
+
items: OrderItem[];
|
|
141
|
+
created_at: string;
|
|
142
|
+
shipping_address?: Address;
|
|
143
|
+
}
|
|
144
|
+
interface OrderItem {
|
|
145
|
+
product_id: string;
|
|
146
|
+
variant_id?: string;
|
|
147
|
+
name: string;
|
|
148
|
+
quantity: number;
|
|
149
|
+
price: number;
|
|
150
|
+
}
|
|
151
|
+
interface Address {
|
|
152
|
+
line1: string;
|
|
153
|
+
line2?: string;
|
|
154
|
+
city: string;
|
|
155
|
+
state?: string;
|
|
156
|
+
postal_code?: string;
|
|
157
|
+
country: string;
|
|
158
|
+
}
|
|
159
|
+
/** Page entity */
|
|
160
|
+
interface Page {
|
|
161
|
+
type: string;
|
|
162
|
+
title: string;
|
|
163
|
+
handle?: string;
|
|
164
|
+
data?: Record<string, any>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { Address as A, Collection as C, Order as O, Product as P, Store as S, Cart as a, Customer as b, Page as c, ProductVariant as d, CartItem as e, OrderItem as f, ProductImage as g, ProductOption as h };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import './theme-NWJAU9jd.mjs';
|
|
2
|
+
|
|
3
|
+
/** Core store entity */
|
|
4
|
+
interface Store {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
domain?: string;
|
|
9
|
+
subdomain?: string;
|
|
10
|
+
logo_url?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
currency: string;
|
|
13
|
+
default_language: string;
|
|
14
|
+
use_nextjs_storefront: boolean;
|
|
15
|
+
social_links?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/** Product entity */
|
|
18
|
+
interface Product {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
price: number;
|
|
24
|
+
compare_at_price?: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
images: ProductImage[];
|
|
27
|
+
/** Option axes (Size / Color / Material / ...). Phase 8.1. */
|
|
28
|
+
options?: ProductOption[];
|
|
29
|
+
variants: ProductVariant[];
|
|
30
|
+
category?: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
in_stock: boolean;
|
|
33
|
+
seo_title?: string;
|
|
34
|
+
seo_description?: string;
|
|
35
|
+
}
|
|
36
|
+
interface ProductImage {
|
|
37
|
+
id: string;
|
|
38
|
+
url: string;
|
|
39
|
+
alt?: string;
|
|
40
|
+
position: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* One option axis declared on a product — Phase 8.1.
|
|
44
|
+
*
|
|
45
|
+
* Variants reference these by `name`, picking one value per axis to
|
|
46
|
+
* form their `option_values` map. A T-shirt with options
|
|
47
|
+
* `[{name:"Size",values:["S","M","L"]}, {name:"Color",values:["Red","Blue"]}]`
|
|
48
|
+
* has 6 variants, one per (Size, Color) pair.
|
|
49
|
+
*/
|
|
50
|
+
interface ProductOption {
|
|
51
|
+
name: string;
|
|
52
|
+
position: number;
|
|
53
|
+
values: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* One purchasable variant — Phase 8.1.
|
|
57
|
+
*
|
|
58
|
+
* Themes render a variant picker by mapping each `ProductOption` to a
|
|
59
|
+
* set of radio buttons / swatches, then finding the matching variant
|
|
60
|
+
* via `option_values`. The matching variant's `id` is what
|
|
61
|
+
* `add-to-cart` sends. Use the SDK helper `findVariantByOptions()` to
|
|
62
|
+
* pick the right row given a partial selection.
|
|
63
|
+
*
|
|
64
|
+
* Note: `price` and `compare_at_price` are cents (integers), not
|
|
65
|
+
* decimal — the backend ships these as string-decimals; the SDK
|
|
66
|
+
* parses them to numbers when hydrating.
|
|
67
|
+
*/
|
|
68
|
+
interface ProductVariant {
|
|
69
|
+
id: string;
|
|
70
|
+
position: number;
|
|
71
|
+
/** Axis-name → chosen-value map. Single-variant products have `{}`. */
|
|
72
|
+
option_values: Record<string, string>;
|
|
73
|
+
price: number;
|
|
74
|
+
price_currency?: string;
|
|
75
|
+
compare_at_price?: number | null;
|
|
76
|
+
sku?: string | null;
|
|
77
|
+
barcode?: string | null;
|
|
78
|
+
inventory_quantity: number;
|
|
79
|
+
is_in_stock: boolean;
|
|
80
|
+
image_url?: string | null;
|
|
81
|
+
weight?: number | null;
|
|
82
|
+
/** Legacy field — kept for backward compat with pre-Phase-8.1 themes
|
|
83
|
+
* that read `variant.name`. The backend stops setting this in 8.1;
|
|
84
|
+
* themes should switch to formatting `option_values` themselves. */
|
|
85
|
+
name?: string;
|
|
86
|
+
/** Alias for `is_in_stock`; preserved for backward compat. */
|
|
87
|
+
in_stock?: boolean;
|
|
88
|
+
/** Alias for `option_values`; preserved for backward compat. */
|
|
89
|
+
options?: Record<string, string>;
|
|
90
|
+
}
|
|
91
|
+
/** Collection entity */
|
|
92
|
+
interface Collection {
|
|
93
|
+
id: string;
|
|
94
|
+
name: string;
|
|
95
|
+
slug: string;
|
|
96
|
+
description?: string;
|
|
97
|
+
image_url?: string;
|
|
98
|
+
product_count: number;
|
|
99
|
+
products?: Product[];
|
|
100
|
+
}
|
|
101
|
+
/** Cart entity */
|
|
102
|
+
interface Cart {
|
|
103
|
+
id: string;
|
|
104
|
+
items: CartItem[];
|
|
105
|
+
subtotal: number;
|
|
106
|
+
total: number;
|
|
107
|
+
currency: string;
|
|
108
|
+
discount_code?: string;
|
|
109
|
+
discount_amount?: number;
|
|
110
|
+
note?: string;
|
|
111
|
+
}
|
|
112
|
+
interface CartItem {
|
|
113
|
+
id: string;
|
|
114
|
+
product_id: string;
|
|
115
|
+
variant_id?: string;
|
|
116
|
+
name: string;
|
|
117
|
+
image_url?: string;
|
|
118
|
+
price: number;
|
|
119
|
+
quantity: number;
|
|
120
|
+
variant_name?: string;
|
|
121
|
+
}
|
|
122
|
+
/** Customer entity */
|
|
123
|
+
interface Customer {
|
|
124
|
+
id: string;
|
|
125
|
+
email: string;
|
|
126
|
+
first_name?: string;
|
|
127
|
+
last_name?: string;
|
|
128
|
+
phone?: string;
|
|
129
|
+
avatar_url?: string;
|
|
130
|
+
orders_count: number;
|
|
131
|
+
total_spent: number;
|
|
132
|
+
}
|
|
133
|
+
/** Order entity */
|
|
134
|
+
interface Order {
|
|
135
|
+
id: string;
|
|
136
|
+
order_number: string;
|
|
137
|
+
status: string;
|
|
138
|
+
total: number;
|
|
139
|
+
currency: string;
|
|
140
|
+
items: OrderItem[];
|
|
141
|
+
created_at: string;
|
|
142
|
+
shipping_address?: Address;
|
|
143
|
+
}
|
|
144
|
+
interface OrderItem {
|
|
145
|
+
product_id: string;
|
|
146
|
+
variant_id?: string;
|
|
147
|
+
name: string;
|
|
148
|
+
quantity: number;
|
|
149
|
+
price: number;
|
|
150
|
+
}
|
|
151
|
+
interface Address {
|
|
152
|
+
line1: string;
|
|
153
|
+
line2?: string;
|
|
154
|
+
city: string;
|
|
155
|
+
state?: string;
|
|
156
|
+
postal_code?: string;
|
|
157
|
+
country: string;
|
|
158
|
+
}
|
|
159
|
+
/** Page entity */
|
|
160
|
+
interface Page {
|
|
161
|
+
type: string;
|
|
162
|
+
title: string;
|
|
163
|
+
handle?: string;
|
|
164
|
+
data?: Record<string, any>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { Address as A, Collection as C, Order as O, Product as P, Store as S, Cart as a, Customer as b, Page as c, ProductVariant as d, CartItem as e, OrderItem as f, ProductImage as g, ProductOption as h };
|