@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.
Files changed (44) hide show
  1. package/dist/chunk-333Z6VKZ.js +133 -0
  2. package/dist/chunk-333Z6VKZ.js.map +1 -0
  3. package/dist/chunk-4GP43MKT.js +19 -0
  4. package/dist/chunk-4GP43MKT.js.map +1 -0
  5. package/dist/chunk-BAWTE4QS.js +113 -0
  6. package/dist/chunk-BAWTE4QS.js.map +1 -0
  7. package/dist/chunk-EFRWJT3L.js +520 -0
  8. package/dist/chunk-EFRWJT3L.js.map +1 -0
  9. package/dist/chunk-FWEQBOEX.js +92 -0
  10. package/dist/chunk-FWEQBOEX.js.map +1 -0
  11. package/dist/chunk-KRVUYBKB.js +118 -0
  12. package/dist/chunk-KRVUYBKB.js.map +1 -0
  13. package/dist/chunk-L7EZURSK.js +130 -0
  14. package/dist/chunk-L7EZURSK.js.map +1 -0
  15. package/dist/chunk-QUSTGYBM.js +52 -0
  16. package/dist/chunk-QUSTGYBM.js.map +1 -0
  17. package/dist/chunk-U6QF2DRY.js +30 -0
  18. package/dist/chunk-U6QF2DRY.js.map +1 -0
  19. package/dist/core-DCBjP2Ev.d.ts +523 -0
  20. package/dist/core.d.ts +2 -0
  21. package/dist/core.js +17 -0
  22. package/dist/core.js.map +1 -0
  23. package/dist/index.d.ts +4 -429
  24. package/dist/index.js +32 -974
  25. package/dist/index.js.map +1 -1
  26. package/dist/ns/auth.d.ts +2 -0
  27. package/dist/ns/auth.js +4 -0
  28. package/dist/ns/auth.js.map +1 -0
  29. package/dist/ns/cart.d.ts +2 -0
  30. package/dist/ns/cart.js +4 -0
  31. package/dist/ns/cart.js.map +1 -0
  32. package/dist/ns/checkout.d.ts +2 -0
  33. package/dist/ns/checkout.js +5 -0
  34. package/dist/ns/checkout.js.map +1 -0
  35. package/dist/ns/product-list.d.ts +2 -0
  36. package/dist/ns/product-list.js +4 -0
  37. package/dist/ns/product-list.js.map +1 -0
  38. package/dist/ns/product.d.ts +2 -0
  39. package/dist/ns/product.js +4 -0
  40. package/dist/ns/product.js.map +1 -0
  41. package/dist/ns/search.d.ts +2 -0
  42. package/dist/ns/search.js +4 -0
  43. package/dist/ns/search.js.map +1 -0
  44. 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":[]}