@nymbalhq/sdk 1.3.0 → 1.5.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/chunk-333Z6VKZ.js +133 -0
- package/dist/chunk-333Z6VKZ.js.map +1 -0
- package/dist/chunk-4GP43MKT.js +19 -0
- package/dist/chunk-4GP43MKT.js.map +1 -0
- package/dist/chunk-BAWTE4QS.js +113 -0
- package/dist/chunk-BAWTE4QS.js.map +1 -0
- package/dist/chunk-EFRWJT3L.js +520 -0
- package/dist/chunk-EFRWJT3L.js.map +1 -0
- package/dist/chunk-FWEQBOEX.js +92 -0
- package/dist/chunk-FWEQBOEX.js.map +1 -0
- package/dist/chunk-KRVUYBKB.js +118 -0
- package/dist/chunk-KRVUYBKB.js.map +1 -0
- package/dist/chunk-L7EZURSK.js +130 -0
- package/dist/chunk-L7EZURSK.js.map +1 -0
- package/dist/chunk-QUSTGYBM.js +52 -0
- package/dist/chunk-QUSTGYBM.js.map +1 -0
- package/dist/chunk-U6QF2DRY.js +30 -0
- package/dist/chunk-U6QF2DRY.js.map +1 -0
- package/dist/core-DCBjP2Ev.d.ts +523 -0
- package/dist/core.d.ts +2 -0
- package/dist/core.js +17 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +4 -429
- package/dist/index.js +32 -974
- package/dist/index.js.map +1 -1
- package/dist/ns/auth.d.ts +2 -0
- package/dist/ns/auth.js +4 -0
- package/dist/ns/auth.js.map +1 -0
- package/dist/ns/cart.d.ts +2 -0
- package/dist/ns/cart.js +4 -0
- package/dist/ns/cart.js.map +1 -0
- package/dist/ns/checkout.d.ts +2 -0
- package/dist/ns/checkout.js +5 -0
- package/dist/ns/checkout.js.map +1 -0
- package/dist/ns/product-list.d.ts +2 -0
- package/dist/ns/product-list.js +4 -0
- package/dist/ns/product-list.js.map +1 -0
- package/dist/ns/product.d.ts +2 -0
- package/dist/ns/product.js +4 -0
- package/dist/ns/product.js.map +1 -0
- package/dist/ns/search.d.ts +2 -0
- package/dist/ns/search.js +4 -0
- package/dist/ns/search.js.map +1 -0
- package/package.json +17 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStore
|
|
3
|
+
} from "./chunk-U6QF2DRY.js";
|
|
4
|
+
import {
|
|
5
|
+
defineNamespace
|
|
6
|
+
} from "./chunk-EFRWJT3L.js";
|
|
7
|
+
|
|
8
|
+
// src/store/search-store.ts
|
|
9
|
+
var INITIAL_STATE = {
|
|
10
|
+
query: "",
|
|
11
|
+
category: null,
|
|
12
|
+
results: [],
|
|
13
|
+
total: 0,
|
|
14
|
+
nextCursor: null,
|
|
15
|
+
facets: [],
|
|
16
|
+
loading: false
|
|
17
|
+
};
|
|
18
|
+
function createSearchStore(adapter) {
|
|
19
|
+
const store = createStore(INITIAL_STATE);
|
|
20
|
+
let generation = 0;
|
|
21
|
+
async function search(query, options) {
|
|
22
|
+
const run = ++generation;
|
|
23
|
+
if (!query.trim()) {
|
|
24
|
+
store.setState({ ...INITIAL_STATE });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const category = options?.category ?? null;
|
|
28
|
+
store.setState({ query, category, loading: true });
|
|
29
|
+
try {
|
|
30
|
+
const result = await (category === null ? adapter.products.search(query) : adapter.products.search(query, { category }));
|
|
31
|
+
if (run !== generation) return;
|
|
32
|
+
store.setState({
|
|
33
|
+
results: result.items,
|
|
34
|
+
total: result.total,
|
|
35
|
+
nextCursor: result.nextCursor,
|
|
36
|
+
facets: result.facets ?? [],
|
|
37
|
+
loading: false
|
|
38
|
+
});
|
|
39
|
+
} catch (err) {
|
|
40
|
+
if (run !== generation) return;
|
|
41
|
+
console.error("[SearchStore] search failed", err);
|
|
42
|
+
store.setState({ loading: false });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function loadMore() {
|
|
46
|
+
const { query, category, nextCursor, loading } = store.getState();
|
|
47
|
+
if (nextCursor === null || loading) return;
|
|
48
|
+
const run = generation;
|
|
49
|
+
store.setState({ loading: true });
|
|
50
|
+
try {
|
|
51
|
+
const result = await adapter.products.search(query, {
|
|
52
|
+
cursor: nextCursor,
|
|
53
|
+
...category !== null && { category }
|
|
54
|
+
});
|
|
55
|
+
if (run !== generation) return;
|
|
56
|
+
store.setState({
|
|
57
|
+
results: [...store.getState().results, ...result.items],
|
|
58
|
+
total: result.total,
|
|
59
|
+
nextCursor: result.nextCursor,
|
|
60
|
+
loading: false
|
|
61
|
+
});
|
|
62
|
+
} catch (err) {
|
|
63
|
+
if (run !== generation) return;
|
|
64
|
+
console.error("[SearchStore] load more failed", err);
|
|
65
|
+
store.setState({ loading: false });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function setCategory(category) {
|
|
69
|
+
return search(store.getState().query, { category });
|
|
70
|
+
}
|
|
71
|
+
function clearSearch() {
|
|
72
|
+
generation++;
|
|
73
|
+
store.setState({ ...INITIAL_STATE });
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
getState: store.getState,
|
|
77
|
+
subscribe: store.subscribe,
|
|
78
|
+
search,
|
|
79
|
+
loadMore,
|
|
80
|
+
setCategory,
|
|
81
|
+
clearSearch,
|
|
82
|
+
destroy: store.destroy
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/ns/search.ts
|
|
87
|
+
defineNamespace("search", ({ adapter }) => createSearchStore(adapter));
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
createSearchStore
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-FWEQBOEX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/search-store.ts","../src/ns/search.ts"],"sourcesContent":["import type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport type { SearchState } from '../types.js'\nimport { createStore } from './create-store.js'\n\nconst INITIAL_STATE: SearchState = {\n query: '',\n category: null,\n results: [],\n total: 0,\n nextCursor: null,\n facets: [],\n loading: false,\n}\n\nexport interface SearchStore {\n getState(): SearchState\n subscribe(listener: () => void): () => void\n /** Page 1 of `query`, in `options.category` (a slug) when given, otherwise in every category. */\n search(query: string, options?: { category?: string | null }): Promise<void>\n /** Appends the next page; a no-op when every match is loaded or a page is loading. */\n loadMore(): Promise<void>\n /** Page 1 of the current query in `category` (a slug), or in every category when null. */\n setCategory(category: string | null): Promise<void>\n clearSearch(): void\n destroy(): void\n}\n\nexport function createSearchStore(adapter: CommerceAdapter): SearchStore {\n const store = createStore<SearchState>(INITIAL_STATE)\n // Each search supersedes the last: an answer for an older one is dropped.\n let generation = 0\n\n async function search(query: string, options?: { category?: string | null }): Promise<void> {\n const run = ++generation\n if (!query.trim()) {\n store.setState({ ...INITIAL_STATE })\n return\n }\n const category = options?.category ?? null\n store.setState({ query, category, loading: true })\n try {\n const result = await (category === null\n ? adapter.products.search(query)\n : adapter.products.search(query, { category }))\n if (run !== generation) return\n store.setState({\n results: result.items,\n total: result.total,\n nextCursor: result.nextCursor,\n facets: result.facets ?? [],\n loading: false,\n })\n } catch (err) {\n if (run !== generation) return\n console.error('[SearchStore] search failed', err)\n store.setState({ loading: false })\n }\n }\n\n async function loadMore(): Promise<void> {\n const { query, category, nextCursor, loading } = store.getState()\n if (nextCursor === null || loading) return\n const run = generation\n store.setState({ loading: true })\n try {\n const result = await adapter.products.search(query, {\n cursor: nextCursor,\n ...(category !== null && { category }),\n })\n if (run !== generation) return\n store.setState({\n results: [...store.getState().results, ...result.items],\n total: result.total,\n nextCursor: result.nextCursor,\n loading: false,\n })\n } catch (err) {\n if (run !== generation) return\n console.error('[SearchStore] load more failed', err)\n store.setState({ loading: false })\n }\n }\n\n function setCategory(category: string | null): Promise<void> {\n return search(store.getState().query, { category })\n }\n\n function clearSearch(): void {\n generation++\n store.setState({ ...INITIAL_STATE })\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n search,\n loadMore,\n setCategory,\n clearSearch,\n destroy: store.destroy,\n }\n}\n","import { defineNamespace } from '../client.js'\nimport { createSearchStore } from '../store/search-store.js'\n\ndefineNamespace('search', ({ adapter }) => createSearchStore(adapter))\n"],"mappings":";;;;;;;;AAIA,IAAM,gBAA6B;AAAA,EACjC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS,CAAC;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQ,CAAC;AAAA,EACT,SAAS;AACX;AAeO,SAAS,kBAAkB,SAAuC;AACvE,QAAM,QAAQ,YAAyB,aAAa;AAEpD,MAAI,aAAa;AAEjB,iBAAe,OAAO,OAAe,SAAuD;AAC1F,UAAM,MAAM,EAAE;AACd,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,YAAM,SAAS,EAAE,GAAG,cAAc,CAAC;AACnC;AAAA,IACF;AACA,UAAM,WAAW,SAAS,YAAY;AACtC,UAAM,SAAS,EAAE,OAAO,UAAU,SAAS,KAAK,CAAC;AACjD,QAAI;AACF,YAAM,SAAS,OAAO,aAAa,OAC/B,QAAQ,SAAS,OAAO,KAAK,IAC7B,QAAQ,SAAS,OAAO,OAAO,EAAE,SAAS,CAAC;AAC/C,UAAI,QAAQ,WAAY;AACxB,YAAM,SAAS;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB,QAAQ,OAAO,UAAU,CAAC;AAAA,QAC1B,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAQ,WAAY;AACxB,cAAQ,MAAM,+BAA+B,GAAG;AAChD,YAAM,SAAS,EAAE,SAAS,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,iBAAe,WAA0B;AACvC,UAAM,EAAE,OAAO,UAAU,YAAY,QAAQ,IAAI,MAAM,SAAS;AAChE,QAAI,eAAe,QAAQ,QAAS;AACpC,UAAM,MAAM;AACZ,UAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AAChC,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,SAAS,OAAO,OAAO;AAAA,QAClD,QAAQ;AAAA,QACR,GAAI,aAAa,QAAQ,EAAE,SAAS;AAAA,MACtC,CAAC;AACD,UAAI,QAAQ,WAAY;AACxB,YAAM,SAAS;AAAA,QACb,SAAS,CAAC,GAAG,MAAM,SAAS,EAAE,SAAS,GAAG,OAAO,KAAK;AAAA,QACtD,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAQ,WAAY;AACxB,cAAQ,MAAM,kCAAkC,GAAG;AACnD,YAAM,SAAS,EAAE,SAAS,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,WAAS,YAAY,UAAwC;AAC3D,WAAO,OAAO,MAAM,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;AAAA,EACpD;AAEA,WAAS,cAAoB;AAC3B;AACA,UAAM,SAAS,EAAE,GAAG,cAAc,CAAC;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,EACjB;AACF;;;AClGA,gBAAgB,UAAU,CAAC,EAAE,QAAQ,MAAM,kBAAkB,OAAO,CAAC;","names":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStore
|
|
3
|
+
} from "./chunk-U6QF2DRY.js";
|
|
4
|
+
import {
|
|
5
|
+
defineNamespace
|
|
6
|
+
} from "./chunk-EFRWJT3L.js";
|
|
7
|
+
|
|
8
|
+
// src/store/product-list-store.ts
|
|
9
|
+
import { DEFAULT_PRODUCT_SORT } from "@nymbalhq/types";
|
|
10
|
+
var INITIAL_STATE = {
|
|
11
|
+
products: [],
|
|
12
|
+
facets: [],
|
|
13
|
+
filters: {},
|
|
14
|
+
sort: DEFAULT_PRODUCT_SORT,
|
|
15
|
+
pagination: { cursor: null, hasMore: false },
|
|
16
|
+
loading: false,
|
|
17
|
+
error: null
|
|
18
|
+
};
|
|
19
|
+
function createProductListStore(adapter) {
|
|
20
|
+
const store = createStore(INITIAL_STATE);
|
|
21
|
+
let lastLimit;
|
|
22
|
+
let generation = 0;
|
|
23
|
+
function buildParams() {
|
|
24
|
+
const state = store.getState();
|
|
25
|
+
const params = { sort: state.sort };
|
|
26
|
+
if (lastLimit !== void 0) params.limit = lastLimit;
|
|
27
|
+
const category = state.filters["category"];
|
|
28
|
+
if (typeof category === "string") {
|
|
29
|
+
params.category = category;
|
|
30
|
+
}
|
|
31
|
+
return params;
|
|
32
|
+
}
|
|
33
|
+
async function load(params) {
|
|
34
|
+
if (params !== void 0) {
|
|
35
|
+
if (params.limit !== void 0) lastLimit = params.limit;
|
|
36
|
+
const filters = { ...store.getState().filters };
|
|
37
|
+
if (params.category !== void 0) filters["category"] = params.category;
|
|
38
|
+
else delete filters["category"];
|
|
39
|
+
store.setState({ filters, sort: params.sort ?? DEFAULT_PRODUCT_SORT, loading: true });
|
|
40
|
+
}
|
|
41
|
+
const request = buildParams();
|
|
42
|
+
if (params?.cursor !== void 0) request.cursor = params.cursor;
|
|
43
|
+
const current = ++generation;
|
|
44
|
+
store.setState({ loading: true });
|
|
45
|
+
try {
|
|
46
|
+
const result = await adapter.products.list(request);
|
|
47
|
+
if (current !== generation) return;
|
|
48
|
+
store.setState({
|
|
49
|
+
products: result.items,
|
|
50
|
+
facets: result.facets ?? store.getState().facets,
|
|
51
|
+
pagination: { cursor: result.nextCursor, hasMore: result.nextCursor !== null },
|
|
52
|
+
loading: false,
|
|
53
|
+
error: null
|
|
54
|
+
});
|
|
55
|
+
} catch (err) {
|
|
56
|
+
if (current !== generation) return;
|
|
57
|
+
console.error("[ProductListStore] load failed", err);
|
|
58
|
+
store.setState({ loading: false, error: err instanceof Error ? err.message : String(err) });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function loadMore() {
|
|
62
|
+
const state = store.getState();
|
|
63
|
+
if (!state.pagination.hasMore || state.loading) return;
|
|
64
|
+
const current = ++generation;
|
|
65
|
+
store.setState({ loading: true });
|
|
66
|
+
try {
|
|
67
|
+
const params = buildParams();
|
|
68
|
+
if (state.pagination.cursor !== null) {
|
|
69
|
+
params.cursor = state.pagination.cursor;
|
|
70
|
+
}
|
|
71
|
+
const result = await adapter.products.list(params);
|
|
72
|
+
if (current !== generation) return;
|
|
73
|
+
store.setState({
|
|
74
|
+
products: [...state.products, ...result.items],
|
|
75
|
+
pagination: { cursor: result.nextCursor, hasMore: result.nextCursor !== null },
|
|
76
|
+
loading: false,
|
|
77
|
+
error: null
|
|
78
|
+
});
|
|
79
|
+
} catch (err) {
|
|
80
|
+
if (current !== generation) return;
|
|
81
|
+
console.error("[ProductListStore] loadMore failed", err);
|
|
82
|
+
store.setState({ loading: false, error: err instanceof Error ? err.message : String(err) });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function applyFilter(name, value) {
|
|
86
|
+
const filters = { ...store.getState().filters, [name]: value };
|
|
87
|
+
store.setState({ filters });
|
|
88
|
+
await load();
|
|
89
|
+
}
|
|
90
|
+
async function removeFilter(name) {
|
|
91
|
+
const filters = { ...store.getState().filters };
|
|
92
|
+
delete filters[name];
|
|
93
|
+
store.setState({ filters });
|
|
94
|
+
await load();
|
|
95
|
+
}
|
|
96
|
+
async function setSort(sort) {
|
|
97
|
+
store.setState({ sort });
|
|
98
|
+
await load();
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
getState: store.getState,
|
|
102
|
+
subscribe: store.subscribe,
|
|
103
|
+
load,
|
|
104
|
+
loadMore,
|
|
105
|
+
applyFilter,
|
|
106
|
+
removeFilter,
|
|
107
|
+
setSort,
|
|
108
|
+
destroy: store.destroy
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// src/ns/product-list.ts
|
|
113
|
+
defineNamespace("productList", ({ adapter }) => createProductListStore(adapter));
|
|
114
|
+
|
|
115
|
+
export {
|
|
116
|
+
createProductListStore
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=chunk-KRVUYBKB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/product-list-store.ts","../src/ns/product-list.ts"],"sourcesContent":["import { DEFAULT_PRODUCT_SORT, type ProductSortKey } from '@nymbalhq/types'\nimport type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport type { ProductListState, ProductListParams } from '../types.js'\nimport { createStore } from './create-store.js'\n\nconst INITIAL_STATE: ProductListState = {\n products: [],\n facets: [],\n filters: {},\n sort: DEFAULT_PRODUCT_SORT,\n pagination: { cursor: null, hasMore: false },\n loading: false,\n error: null,\n}\n\nexport interface ProductListStore {\n getState(): ProductListState\n subscribe(listener: () => void): () => void\n load(params?: ProductListParams): Promise<void>\n loadMore(): Promise<void>\n applyFilter(name: string, value: string | string[]): Promise<void>\n removeFilter(name: string): Promise<void>\n setSort(sort: ProductSortKey): Promise<void>\n destroy(): void\n}\n\nexport function createProductListStore(adapter: CommerceAdapter): ProductListStore {\n const store = createStore<ProductListState>(INITIAL_STATE)\n let lastLimit: number | undefined\n // Only the latest request's answer may reach the state: an older one carries another sort's items and cursor.\n let generation = 0\n\n function buildParams(): ProductListParams {\n const state = store.getState()\n const params: ProductListParams = { sort: state.sort }\n if (lastLimit !== undefined) params.limit = lastLimit\n const category = state.filters['category']\n if (typeof category === 'string') {\n params.category = category\n }\n return params\n }\n\n /** With params, they become the listing's category and sort, so `setSort` and `loadMore` keep them. */\n async function load(params?: ProductListParams): Promise<void> {\n if (params !== undefined) {\n if (params.limit !== undefined) lastLimit = params.limit\n const filters = { ...store.getState().filters }\n if (params.category !== undefined) filters['category'] = params.category\n else delete filters['category']\n // Loading from this update on: an update that is not loading is a settled answer, which a server-rendered\n // listing gives its cards way to.\n store.setState({ filters, sort: params.sort ?? DEFAULT_PRODUCT_SORT, loading: true })\n }\n const request = buildParams()\n if (params?.cursor !== undefined) request.cursor = params.cursor\n const current = ++generation\n store.setState({ loading: true })\n try {\n const result = await adapter.products.list(request)\n if (current !== generation) return\n store.setState({\n products: result.items,\n facets: result.facets ?? store.getState().facets,\n pagination: { cursor: result.nextCursor, hasMore: result.nextCursor !== null },\n loading: false,\n error: null,\n })\n } catch (err) {\n if (current !== generation) return\n console.error('[ProductListStore] load failed', err)\n store.setState({ loading: false, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function loadMore(): Promise<void> {\n const state = store.getState()\n if (!state.pagination.hasMore || state.loading) return\n const current = ++generation\n store.setState({ loading: true })\n try {\n const params = buildParams()\n if (state.pagination.cursor !== null) {\n params.cursor = state.pagination.cursor\n }\n const result = await adapter.products.list(params)\n if (current !== generation) return\n store.setState({\n products: [...state.products, ...result.items],\n pagination: { cursor: result.nextCursor, hasMore: result.nextCursor !== null },\n loading: false,\n error: null,\n })\n } catch (err) {\n if (current !== generation) return\n console.error('[ProductListStore] loadMore failed', err)\n store.setState({ loading: false, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function applyFilter(name: string, value: string | string[]): Promise<void> {\n const filters = { ...store.getState().filters, [name]: value }\n store.setState({ filters })\n await load()\n }\n\n async function removeFilter(name: string): Promise<void> {\n const filters = { ...store.getState().filters }\n delete filters[name]\n store.setState({ filters })\n await load()\n }\n\n async function setSort(sort: ProductSortKey): Promise<void> {\n store.setState({ sort })\n await load()\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n load,\n loadMore,\n applyFilter,\n removeFilter,\n setSort,\n destroy: store.destroy,\n }\n}\n","import { defineNamespace } from '../client.js'\nimport { createProductListStore } from '../store/product-list-store.js'\n\ndefineNamespace('productList', ({ adapter }) => createProductListStore(adapter))\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStore
|
|
3
|
+
} from "./chunk-U6QF2DRY.js";
|
|
4
|
+
import {
|
|
5
|
+
defineNamespace
|
|
6
|
+
} from "./chunk-EFRWJT3L.js";
|
|
7
|
+
|
|
8
|
+
// src/store/auth-store.ts
|
|
9
|
+
var INITIAL_STATE = {
|
|
10
|
+
customer: null,
|
|
11
|
+
isAuthenticated: false,
|
|
12
|
+
loading: false,
|
|
13
|
+
error: null
|
|
14
|
+
};
|
|
15
|
+
function createAuthStore(adapter, tokenManager) {
|
|
16
|
+
const store = createStore(INITIAL_STATE);
|
|
17
|
+
async function login(email, password) {
|
|
18
|
+
store.setState({ loading: true, error: null });
|
|
19
|
+
try {
|
|
20
|
+
const result = await adapter.customers.login(email, password);
|
|
21
|
+
tokenManager.setTokens(result.accessToken, result.expiresIn);
|
|
22
|
+
store.setState({
|
|
23
|
+
customer: result.customer,
|
|
24
|
+
isAuthenticated: true,
|
|
25
|
+
loading: false
|
|
26
|
+
});
|
|
27
|
+
} catch (err) {
|
|
28
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
29
|
+
store.setState({ loading: false, error: message });
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function register(params) {
|
|
34
|
+
store.setState({ loading: true, error: null });
|
|
35
|
+
try {
|
|
36
|
+
const result = await adapter.customers.register(params);
|
|
37
|
+
tokenManager.setTokens(result.accessToken, result.expiresIn);
|
|
38
|
+
store.setState({
|
|
39
|
+
customer: result.customer,
|
|
40
|
+
isAuthenticated: true,
|
|
41
|
+
loading: false
|
|
42
|
+
});
|
|
43
|
+
} catch (err) {
|
|
44
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
45
|
+
store.setState({ loading: false, error: message });
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function logout() {
|
|
50
|
+
store.setState({ loading: true, error: null });
|
|
51
|
+
try {
|
|
52
|
+
await adapter.customers.logout();
|
|
53
|
+
tokenManager.clear();
|
|
54
|
+
store.setState({
|
|
55
|
+
customer: null,
|
|
56
|
+
isAuthenticated: false,
|
|
57
|
+
loading: false
|
|
58
|
+
});
|
|
59
|
+
} catch (err) {
|
|
60
|
+
tokenManager.clear();
|
|
61
|
+
store.setState({
|
|
62
|
+
customer: null,
|
|
63
|
+
isAuthenticated: false,
|
|
64
|
+
loading: false,
|
|
65
|
+
error: err instanceof Error ? err.message : String(err)
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function refreshToken() {
|
|
70
|
+
try {
|
|
71
|
+
const result = await adapter.customers.refresh();
|
|
72
|
+
tokenManager.setTokens(result.accessToken, result.expiresIn);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
console.error("[AuthStore] token refresh failed, logging out", err);
|
|
75
|
+
tokenManager.clear();
|
|
76
|
+
store.setState({
|
|
77
|
+
customer: null,
|
|
78
|
+
isAuthenticated: false
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function updateProfile(updates) {
|
|
83
|
+
store.setState({ loading: true, error: null });
|
|
84
|
+
try {
|
|
85
|
+
const customer = await adapter.customers.updateProfile(updates);
|
|
86
|
+
store.setState({ customer, loading: false });
|
|
87
|
+
} catch (err) {
|
|
88
|
+
store.setState({
|
|
89
|
+
loading: false,
|
|
90
|
+
error: err instanceof Error ? err.message : String(err)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function loadProfile() {
|
|
95
|
+
if (!tokenManager.getAccessToken()) return;
|
|
96
|
+
store.setState({ loading: true, error: null });
|
|
97
|
+
try {
|
|
98
|
+
const customer = await adapter.customers.getProfile();
|
|
99
|
+
store.setState({
|
|
100
|
+
customer,
|
|
101
|
+
isAuthenticated: true,
|
|
102
|
+
loading: false
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
store.setState({
|
|
106
|
+
loading: false,
|
|
107
|
+
error: err instanceof Error ? err.message : String(err)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
getState: store.getState,
|
|
113
|
+
subscribe: store.subscribe,
|
|
114
|
+
login,
|
|
115
|
+
register,
|
|
116
|
+
logout,
|
|
117
|
+
refreshToken,
|
|
118
|
+
updateProfile,
|
|
119
|
+
loadProfile,
|
|
120
|
+
destroy: store.destroy
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/ns/auth.ts
|
|
125
|
+
defineNamespace("auth", ({ adapter, tokenManager }) => createAuthStore(adapter, tokenManager));
|
|
126
|
+
|
|
127
|
+
export {
|
|
128
|
+
createAuthStore
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=chunk-L7EZURSK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/auth-store.ts","../src/ns/auth.ts"],"sourcesContent":["import type { Customer } from '@nymbalhq/types'\nimport type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport type { TokenManager } from '../auth/token-manager.js'\nimport type { AuthState, RegisterParams } from '../types.js'\nimport { createStore } from './create-store.js'\n\nconst INITIAL_STATE: AuthState = {\n customer: null,\n isAuthenticated: false,\n loading: false,\n error: null,\n}\n\nexport interface AuthStore {\n getState(): AuthState\n subscribe(listener: () => void): () => void\n login(email: string, password: string): Promise<void>\n register(params: RegisterParams): Promise<void>\n logout(): Promise<void>\n refreshToken(): Promise<void>\n updateProfile(updates: Partial<Pick<Customer, 'firstName' | 'lastName' | 'phone'>>): Promise<void>\n loadProfile(): Promise<void>\n destroy(): void\n}\n\nexport function createAuthStore(\n adapter: CommerceAdapter,\n tokenManager: TokenManager,\n): AuthStore {\n const store = createStore<AuthState>(INITIAL_STATE)\n\n async function login(email: string, password: string): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const result = await adapter.customers.login(email, password)\n tokenManager.setTokens(result.accessToken, result.expiresIn)\n store.setState({\n customer: result.customer,\n isAuthenticated: true,\n loading: false,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n store.setState({ loading: false, error: message })\n throw err\n }\n }\n\n async function register(params: RegisterParams): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const result = await adapter.customers.register(params)\n tokenManager.setTokens(result.accessToken, result.expiresIn)\n store.setState({\n customer: result.customer,\n isAuthenticated: true,\n loading: false,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n store.setState({ loading: false, error: message })\n throw err\n }\n }\n\n async function logout(): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n await adapter.customers.logout()\n tokenManager.clear()\n store.setState({\n customer: null,\n isAuthenticated: false,\n loading: false,\n })\n } catch (err) {\n tokenManager.clear()\n store.setState({\n customer: null,\n isAuthenticated: false,\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n async function refreshToken(): Promise<void> {\n try {\n const result = await adapter.customers.refresh()\n tokenManager.setTokens(result.accessToken, result.expiresIn)\n } catch (err) {\n console.error('[AuthStore] token refresh failed, logging out', err)\n tokenManager.clear()\n store.setState({\n customer: null,\n isAuthenticated: false,\n })\n }\n }\n\n async function updateProfile(\n updates: Partial<Pick<Customer, 'firstName' | 'lastName' | 'phone'>>,\n ): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const customer = await adapter.customers.updateProfile(updates)\n store.setState({ customer, loading: false })\n } catch (err) {\n store.setState({\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n async function loadProfile(): Promise<void> {\n if (!tokenManager.getAccessToken()) return\n store.setState({ loading: true, error: null })\n try {\n const customer = await adapter.customers.getProfile()\n store.setState({\n customer,\n isAuthenticated: true,\n loading: false,\n })\n } catch (err) {\n store.setState({\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n login,\n register,\n logout,\n refreshToken,\n updateProfile,\n loadProfile,\n destroy: store.destroy,\n }\n}\n","import { defineNamespace } from '../client.js'\nimport { createAuthStore } from '../store/auth-store.js'\n\ndefineNamespace('auth', ({ adapter, tokenManager }) => createAuthStore(adapter, tokenManager))\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStore
|
|
3
|
+
} from "./chunk-U6QF2DRY.js";
|
|
4
|
+
import {
|
|
5
|
+
defineNamespace
|
|
6
|
+
} from "./chunk-EFRWJT3L.js";
|
|
7
|
+
|
|
8
|
+
// src/store/product-store.ts
|
|
9
|
+
var INITIAL_STATE = {
|
|
10
|
+
product: null,
|
|
11
|
+
selectedVariant: null,
|
|
12
|
+
loading: false,
|
|
13
|
+
error: null
|
|
14
|
+
};
|
|
15
|
+
function createProductStore(adapter) {
|
|
16
|
+
const store = createStore(INITIAL_STATE);
|
|
17
|
+
async function loadBySlug(slug) {
|
|
18
|
+
store.setState({ loading: true, error: null });
|
|
19
|
+
try {
|
|
20
|
+
const product = await adapter.products.getBySlug(slug);
|
|
21
|
+
const firstVariant = product.variants[0] ?? null;
|
|
22
|
+
store.setState({
|
|
23
|
+
product,
|
|
24
|
+
selectedVariant: firstVariant,
|
|
25
|
+
loading: false
|
|
26
|
+
});
|
|
27
|
+
} catch (err) {
|
|
28
|
+
store.setState({
|
|
29
|
+
loading: false,
|
|
30
|
+
error: err instanceof Error ? err.message : String(err)
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function selectVariant(variant) {
|
|
35
|
+
store.setState({ selectedVariant: variant });
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
getState: store.getState,
|
|
39
|
+
subscribe: store.subscribe,
|
|
40
|
+
loadBySlug,
|
|
41
|
+
selectVariant,
|
|
42
|
+
destroy: store.destroy
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/ns/product.ts
|
|
47
|
+
defineNamespace("product", ({ adapter }) => createProductStore(adapter));
|
|
48
|
+
|
|
49
|
+
export {
|
|
50
|
+
createProductStore
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=chunk-QUSTGYBM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/product-store.ts","../src/ns/product.ts"],"sourcesContent":["import type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport type { ProductState, DenormalisedVariant } from '../types.js'\nimport { createStore } from './create-store.js'\n\nconst INITIAL_STATE: ProductState = {\n product: null,\n selectedVariant: null,\n loading: false,\n error: null,\n}\n\nexport interface ProductStore {\n getState(): ProductState\n subscribe(listener: () => void): () => void\n loadBySlug(slug: string): Promise<void>\n selectVariant(variant: DenormalisedVariant | null): void\n destroy(): void\n}\n\nexport function createProductStore(adapter: CommerceAdapter): ProductStore {\n const store = createStore<ProductState>(INITIAL_STATE)\n\n async function loadBySlug(slug: string): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const product = await adapter.products.getBySlug(slug)\n const firstVariant = product.variants[0] ?? null\n store.setState({\n product,\n selectedVariant: firstVariant,\n loading: false,\n })\n } catch (err) {\n store.setState({\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n function selectVariant(variant: DenormalisedVariant | null): void {\n store.setState({ selectedVariant: variant })\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n loadBySlug,\n selectVariant,\n destroy: store.destroy,\n }\n}\n","import { defineNamespace } from '../client.js'\nimport { createProductStore } from '../store/product-store.js'\n\ndefineNamespace('product', ({ adapter }) => createProductStore(adapter))\n"],"mappings":";;;;;;;;AAIA,IAAM,gBAA8B;AAAA,EAClC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,OAAO;AACT;AAUO,SAAS,mBAAmB,SAAwC;AACzE,QAAM,QAAQ,YAA0B,aAAa;AAErD,iBAAe,WAAW,MAA6B;AACrD,UAAM,SAAS,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAC7C,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,SAAS,UAAU,IAAI;AACrD,YAAM,eAAe,QAAQ,SAAS,CAAC,KAAK;AAC5C,YAAM,SAAS;AAAA,QACb;AAAA,QACA,iBAAiB;AAAA,QACjB,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,SAAS;AAAA,QACb,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,cAAc,SAA2C;AAChE,UAAM,SAAS,EAAE,iBAAiB,QAAQ,CAAC;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,EACjB;AACF;;;AChDA,gBAAgB,WAAW,CAAC,EAAE,QAAQ,MAAM,mBAAmB,OAAO,CAAC;","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/store/create-store.ts
|
|
2
|
+
function createStore(initialState) {
|
|
3
|
+
let state = initialState;
|
|
4
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
5
|
+
function getState() {
|
|
6
|
+
return state;
|
|
7
|
+
}
|
|
8
|
+
function setState(partial) {
|
|
9
|
+
const next = typeof partial === "function" ? partial(state) : partial;
|
|
10
|
+
state = { ...state, ...next };
|
|
11
|
+
for (const listener of listeners) {
|
|
12
|
+
listener();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function subscribe(listener) {
|
|
16
|
+
listeners.add(listener);
|
|
17
|
+
return () => {
|
|
18
|
+
listeners.delete(listener);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function destroy() {
|
|
22
|
+
listeners.clear();
|
|
23
|
+
}
|
|
24
|
+
return { getState, setState, subscribe, destroy };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
createStore
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=chunk-U6QF2DRY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/create-store.ts"],"sourcesContent":["export type Listener = () => void\n\nexport interface Store<TState> {\n getState(): TState\n setState(partial: Partial<TState> | ((prev: TState) => Partial<TState>)): void\n subscribe(listener: Listener): () => void\n destroy(): void\n}\n\nexport function createStore<TState extends object>(\n initialState: TState,\n): Store<TState> {\n let state = initialState\n const listeners = new Set<Listener>()\n\n function getState(): TState {\n return state\n }\n\n function setState(partial: Partial<TState> | ((prev: TState) => Partial<TState>)): void {\n const next = typeof partial === 'function' ? partial(state) : partial\n state = { ...state, ...next }\n for (const listener of listeners) {\n listener()\n }\n }\n\n function subscribe(listener: Listener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n }\n\n function destroy(): void {\n listeners.clear()\n }\n\n return { getState, setState, subscribe, destroy }\n}\n"],"mappings":";AASO,SAAS,YACd,cACe;AACf,MAAI,QAAQ;AACZ,QAAM,YAAY,oBAAI,IAAc;AAEpC,WAAS,WAAmB;AAC1B,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,SAAsE;AACtF,UAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,KAAK,IAAI;AAC9D,YAAQ,EAAE,GAAG,OAAO,GAAG,KAAK;AAC5B,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,WAAS,UAAU,UAAgC;AACjD,cAAU,IAAI,QAAQ;AACtB,WAAO,MAAM;AACX,gBAAU,OAAO,QAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,WAAS,UAAgB;AACvB,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO,EAAE,UAAU,UAAU,WAAW,QAAQ;AAClD;","names":[]}
|