@nymbalhq/sdk 0.0.0-stage → 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter/fetch-client.ts","../src/adapter/nymbal-api-adapter.ts","../src/auth/token-manager.ts","../src/store/create-store.ts","../src/store/cart-store.ts","../src/store/product-store.ts","../src/store/product-list-store.ts","../src/store/search-store.ts","../src/store/checkout-store.ts","../src/store/auth-store.ts","../src/client.ts"],"sourcesContent":["export class NymbalApiError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly status: number,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'NymbalApiError'\n }\n}\n\nexport interface FetchClientOptions {\n baseUrl: string\n credentials?: RequestCredentials\n getAccessToken?: () => string | null\n getCartToken?: () => string | null\n onUnauthorized?: () => Promise<void>\n}\n\nconst CSRF_HEADER = 'x-csrf-token'\nconst UNSAFE_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE'])\n\ninterface Envelope<T> {\n data?: T\n meta?: Record<string, unknown>\n error?: { code: string; message: string; context?: Record<string, unknown> }\n}\n\nexport class FetchClient {\n private readonly baseUrl: string\n private readonly credentials: RequestCredentials\n private readonly getAccessToken: () => string | null\n private readonly getCartToken: (() => string | null) | undefined\n private readonly onUnauthorized: (() => Promise<void>) | undefined\n private handlingUnauthorized = false\n /** The token `GET /api/csrf` answered: the API's `nymbal.csrf` cookie, which this origin may not be able to read. */\n private csrfToken: Promise<string> | null = null\n\n constructor(options: FetchClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.credentials = options.credentials ?? 'include'\n this.getAccessToken = options.getAccessToken ?? (() => null)\n this.getCartToken = options.getCartToken\n this.onUnauthorized = options.onUnauthorized\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n return (await this.requestWithMeta<T>(method, path, body)).data\n }\n\n /** Like `request`, keeping the envelope's `meta` (pagination cursors live there). */\n async requestWithMeta<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<{ data: T; meta: Record<string, unknown> }> {\n let response = await this.doFetch(method, path, body)\n\n // A stale token (the cookie was replaced or expired) is fetched again once; a second refusal is thrown.\n if (await this.isCsrfRejection(response)) {\n this.csrfToken = null\n response = await this.doFetch(method, path, body)\n }\n\n if (response.status === 401 && this.onUnauthorized && !this.handlingUnauthorized) {\n this.handlingUnauthorized = true\n try {\n await this.onUnauthorized()\n } finally {\n this.handlingUnauthorized = false\n }\n const retry = await this.doFetch(method, path, body)\n return this.parseResponse<T>(retry)\n }\n\n return this.parseResponse<T>(response)\n }\n\n private csrf(): Promise<string> {\n this.csrfToken ??= this.fetchCsrfToken().catch((err: unknown) => {\n this.csrfToken = null\n throw err\n })\n return this.csrfToken\n }\n\n private async fetchCsrfToken(): Promise<string> {\n const response = await globalThis.fetch(`${this.baseUrl}/api/csrf`, {\n method: 'GET',\n credentials: this.credentials,\n })\n const { data } = await this.parseResponse<{ token: string }>(response)\n return data.token\n }\n\n private async isCsrfRejection(response: Response): Promise<boolean> {\n if (response.status !== 403) return false\n const text = await response.clone().text()\n try {\n return (JSON.parse(text) as Envelope<unknown>).error?.code === 'csrf.invalid'\n } catch {\n return false\n }\n }\n\n private async doFetch(method: string, path: string, body?: unknown): Promise<Response> {\n const headers: Record<string, string> = {}\n const cookies: string[] = []\n\n if (UNSAFE_METHODS.has(method.toUpperCase())) {\n const csrf = await this.csrf()\n headers[CSRF_HEADER] = csrf\n // Outside a browser there is no cookie jar to send the pair's cookie half; a browser drops this header.\n cookies.push(`nymbal.csrf=${csrf}`)\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n const token = this.getAccessToken()\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n\n const cartToken = this.getCartToken?.()\n if (cartToken) {\n cookies.unshift(`nymbal.cart=${cartToken}`)\n }\n if (cookies.length > 0) {\n headers['Cookie'] = cookies.join('; ')\n }\n\n return globalThis.fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n credentials: this.credentials,\n ...(body !== undefined && { body: JSON.stringify(body) }),\n })\n }\n\n private async parseResponse<T>(\n response: Response,\n ): Promise<{ data: T; meta: Record<string, unknown> }> {\n const text = await response.text()\n if (!text) {\n return { data: undefined as T, meta: {} }\n }\n\n const envelope = JSON.parse(text) as Envelope<T>\n\n if (envelope.error) {\n throw new NymbalApiError(\n envelope.error.code,\n envelope.error.message,\n response.status,\n envelope.error.context,\n )\n }\n\n return { data: envelope.data as T, meta: envelope.meta ?? {} }\n }\n}\n","import type {\n Cart,\n Customer,\n CustomerAddress,\n Order,\n ReviewsResult,\n ReviewResult,\n} from '@nymbalhq/types'\nimport type { CommerceAdapter } from './commerce-adapter.js'\nimport type { FetchClient } from './fetch-client.js'\nimport type {\n DenormalisedProduct,\n ProductListParams,\n ProductListResult,\n CheckoutDetails,\n CheckoutResult,\n RegisterParams,\n AuthResult,\n NewAddress,\n OrderPage,\n} from '../types.js'\n\nexport function createNymbalApiAdapter(fetchClient: FetchClient): CommerceAdapter {\n return {\n cart: {\n get() {\n return fetchClient.request<Cart>('GET', '/api/cart')\n },\n addItem(variantId: string, qty: number) {\n return fetchClient.request<Cart>('POST', '/api/cart/items', { variantId, qty })\n },\n removeItem(variantId: string) {\n return fetchClient.request<Cart>(\n 'DELETE',\n `/api/cart/items/${encodeURIComponent(variantId)}`,\n )\n },\n updateQuantity(variantId: string, qty: number) {\n return fetchClient.request<Cart>(\n 'PATCH',\n `/api/cart/items/${encodeURIComponent(variantId)}`,\n { qty },\n )\n },\n clear() {\n return fetchClient.request<Cart>('DELETE', '/api/cart')\n },\n },\n\n products: {\n getBySlug(slug: string) {\n return fetchClient.request<DenormalisedProduct>(\n 'GET',\n `/api/products/${encodeURIComponent(slug)}`,\n )\n },\n list(params?: ProductListParams) {\n const search = new URLSearchParams()\n if (params?.limit !== undefined) search.set('limit', String(params.limit))\n if (params?.cursor !== undefined) search.set('cursor', params.cursor)\n if (params?.category !== undefined) search.set('category', params.category)\n if (params?.sort !== undefined) search.set('sort', params.sort)\n const qs = search.toString()\n return fetchClient.request<ProductListResult>('GET', `/api/products${qs ? `?${qs}` : ''}`)\n },\n search(query: string, params?: { limit?: number; cursor?: string }) {\n const search = new URLSearchParams()\n search.set('q', query)\n if (params?.limit !== undefined) search.set('limit', String(params.limit))\n if (params?.cursor !== undefined) search.set('cursor', params.cursor)\n return fetchClient.request<ProductListResult>(\n 'GET',\n `/api/products/search?${search.toString()}`,\n )\n },\n },\n\n checkout: {\n create(details: CheckoutDetails) {\n return fetchClient.request<CheckoutResult>('POST', '/api/checkout', details)\n },\n },\n\n customers: {\n register(params: RegisterParams) {\n return fetchClient.request<AuthResult>('POST', '/api/auth/register', params)\n },\n login(email: string, password: string) {\n return fetchClient.request<AuthResult>('POST', '/api/auth/login', { email, password })\n },\n async logout() {\n await fetchClient.request<{ ok: boolean }>('POST', '/api/auth/logout')\n },\n refresh() {\n return fetchClient.request<{ accessToken: string; expiresIn: number }>(\n 'POST',\n '/api/auth/refresh',\n )\n },\n getProfile() {\n return fetchClient.request<Customer>('GET', '/api/customers/me')\n },\n updateProfile(updates: Partial<Pick<Customer, 'firstName' | 'lastName' | 'phone'>>) {\n return fetchClient.request<Customer>('PATCH', '/api/customers/me', updates)\n },\n listAddresses() {\n return fetchClient.request<CustomerAddress[]>('GET', '/api/customers/me/addresses')\n },\n addAddress(address: NewAddress) {\n return fetchClient.request<CustomerAddress>('POST', '/api/customers/me/addresses', address)\n },\n async removeAddress(id: string) {\n await fetchClient.request<{ ok: boolean }>(\n 'DELETE',\n `/api/customers/me/addresses/${encodeURIComponent(id)}`,\n )\n },\n async listOrders(params?: { cursor?: string }): Promise<OrderPage> {\n const qs =\n params?.cursor !== undefined ? `?cursor=${encodeURIComponent(params.cursor)}` : ''\n const { data, meta } = await fetchClient.requestWithMeta<Order[]>('GET', `/api/orders${qs}`)\n const nextCursor = typeof meta.nextCursor === 'string' ? meta.nextCursor : null\n return { items: data ?? [], nextCursor }\n },\n getOrder(orderNumber: string) {\n return fetchClient.request<Order>('GET', `/api/orders/${encodeURIComponent(orderNumber)}`)\n },\n },\n\n reviews: {\n getForProduct(productId: string, params?: { limit?: number; cursor?: string }) {\n const search = new URLSearchParams()\n if (params?.limit !== undefined) search.set('limit', String(params.limit))\n if (params?.cursor !== undefined) search.set('cursor', params.cursor)\n const qs = search.toString()\n return fetchClient.request<ReviewsResult>(\n 'GET',\n `/api/products/${encodeURIComponent(productId)}/reviews${qs ? `?${qs}` : ''}`,\n )\n },\n submit(review: { productId: string; rating: number; title: string; body: string }) {\n return fetchClient.request<ReviewResult>('POST', '/api/reviews', review)\n },\n },\n }\n}\n","export interface TokenManagerOptions {\n storage?: 'memory' | 'localStorage'\n storageKey?: string\n}\n\nexport interface TokenManager {\n getAccessToken(): string | null\n setTokens(accessToken: string, expiresIn: number): void\n clear(): void\n scheduleRefresh(refreshFn: () => Promise<{ accessToken: string; expiresIn: number }>): void\n destroy(): void\n}\n\nconst DEFAULT_STORAGE_KEY = 'nymbal.auth.accessToken'\n\nexport function createTokenManager(options?: TokenManagerOptions): TokenManager {\n const storageMode = options?.storage ?? 'memory'\n const storageKey = options?.storageKey ?? DEFAULT_STORAGE_KEY\n\n let memoryToken: string | null = null\n let refreshTimer: ReturnType<typeof setTimeout> | null = null\n let refreshFn: (() => Promise<{ accessToken: string; expiresIn: number }>) | null = null\n\n function getAccessToken(): string | null {\n if (storageMode === 'localStorage' && typeof globalThis.localStorage !== 'undefined') {\n return globalThis.localStorage.getItem(storageKey)\n }\n return memoryToken\n }\n\n function setAccessToken(token: string | null): void {\n memoryToken = token\n if (storageMode === 'localStorage' && typeof globalThis.localStorage !== 'undefined') {\n if (token) {\n globalThis.localStorage.setItem(storageKey, token)\n } else {\n globalThis.localStorage.removeItem(storageKey)\n }\n }\n }\n\n function setTokens(accessToken: string, expiresIn: number): void {\n setAccessToken(accessToken)\n scheduleAutoRefresh(expiresIn)\n }\n\n function clear(): void {\n setAccessToken(null)\n if (refreshTimer !== null) {\n clearTimeout(refreshTimer)\n refreshTimer = null\n }\n }\n\n function scheduleAutoRefresh(expiresIn: number): void {\n if (refreshTimer !== null) {\n clearTimeout(refreshTimer)\n }\n const delayMs = Math.max(1000, expiresIn * 0.8 * 1000)\n refreshTimer = setTimeout(async () => {\n if (!refreshFn) return\n try {\n const result = await refreshFn()\n setTokens(result.accessToken, result.expiresIn)\n } catch (err) {\n console.error('[TokenManager] auto-refresh failed, clearing session', err)\n clear()\n }\n }, delayMs)\n }\n\n function scheduleRefresh(\n fn: () => Promise<{ accessToken: string; expiresIn: number }>,\n ): void {\n refreshFn = fn\n }\n\n function destroy(): void {\n clear()\n refreshFn = null\n }\n\n return { getAccessToken, setTokens, clear, scheduleRefresh, destroy }\n}\n","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","import type { CartItem } from '@nymbalhq/types'\nimport type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport type { CartState } from '../types.js'\nimport { createStore } from './create-store.js'\n\nfunction deriveItemCount(items: CartItem[]): number {\n let count = 0\n for (const item of items) {\n count += item.qty\n }\n return count\n}\n\nconst INITIAL_STATE: CartState = {\n items: [],\n subtotalMinor: 0,\n currency: 'USD',\n itemCount: 0,\n loading: false,\n error: null,\n}\n\nexport interface CartStore {\n getState(): CartState\n subscribe(listener: () => void): () => void\n addItem(variantId: string, qty?: number): Promise<void>\n removeItem(variantId: string): Promise<void>\n updateQuantity(variantId: string, qty: number): Promise<void>\n clear(): Promise<void>\n load(): Promise<void>\n destroy(): void\n}\n\nexport function createCartStore(adapter: CommerceAdapter): CartStore {\n const store = createStore<CartState>(INITIAL_STATE)\n\n async function load(): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const cart = await adapter.cart.get()\n store.setState({\n items: cart.items,\n subtotalMinor: cart.subtotalMinor,\n currency: cart.currency,\n itemCount: deriveItemCount(cart.items),\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 async function addItem(variantId: string, qty = 1): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const cart = await adapter.cart.addItem(variantId, qty)\n store.setState({\n items: cart.items,\n subtotalMinor: cart.subtotalMinor,\n currency: cart.currency,\n itemCount: deriveItemCount(cart.items),\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 async function removeItem(variantId: string): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const cart = await adapter.cart.removeItem(variantId)\n store.setState({\n items: cart.items,\n subtotalMinor: cart.subtotalMinor,\n currency: cart.currency,\n itemCount: deriveItemCount(cart.items),\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 async function updateQuantity(variantId: string, qty: number): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n const cart = await adapter.cart.updateQuantity(variantId, qty)\n store.setState({\n items: cart.items,\n subtotalMinor: cart.subtotalMinor,\n currency: cart.currency,\n itemCount: deriveItemCount(cart.items),\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 async function clear(): Promise<void> {\n store.setState({ loading: true, error: null })\n try {\n await adapter.cart.clear()\n store.setState({\n items: [],\n subtotalMinor: 0,\n itemCount: 0,\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 addItem,\n removeItem,\n updateQuantity,\n clear,\n load,\n destroy: store.destroy,\n }\n}\n","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 { 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 store.setState({ filters, sort: params.sort ?? DEFAULT_PRODUCT_SORT })\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 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 results: [],\n total: 0,\n loading: false,\n}\n\nexport interface SearchStore {\n getState(): SearchState\n subscribe(listener: () => void): () => void\n search(query: string): Promise<void>\n clearSearch(): void\n destroy(): void\n}\n\nexport function createSearchStore(adapter: CommerceAdapter): SearchStore {\n const store = createStore<SearchState>(INITIAL_STATE)\n\n async function search(query: string): Promise<void> {\n if (!query.trim()) {\n store.setState({ query: '', results: [], total: 0, loading: false })\n return\n }\n store.setState({ query, loading: true })\n try {\n const result = await adapter.products.search(query)\n store.setState({\n results: result.items,\n total: result.items.length,\n loading: false,\n })\n } catch (err) {\n console.error('[SearchStore] search failed', err)\n store.setState({ loading: false })\n }\n }\n\n function clearSearch(): void {\n store.setState({ query: '', results: [], total: 0, loading: false })\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n search,\n clearSearch,\n destroy: store.destroy,\n }\n}\n","import type { Address } from '@nymbalhq/types'\nimport type { CommerceAdapter } from '../adapter/commerce-adapter.js'\nimport { NymbalApiError } from '../adapter/fetch-client.js'\nimport type { CartStore } from './cart-store.js'\nimport type { CheckoutResult, CheckoutState, ShippingMethod } from '../types.js'\nimport { createStore } from './create-store.js'\n\nconst INITIAL_STATE: CheckoutState = {\n step: 'contact',\n email: '',\n shippingAddress: null,\n billingAddress: null,\n shippingMethod: null,\n paymentStatus: 'idle',\n error: null,\n order: null,\n placedOrderNumber: null,\n}\n\n/** The order a refused resubmit names (409 `checkout.cart_empty` or `checkout.payment_in_progress`), if any. */\nfunction namedOrder(err: unknown): string | null {\n if (!(err instanceof NymbalApiError)) return null\n const orderNumber = err.context?.['orderNumber']\n return typeof orderNumber === 'string' ? orderNumber : null\n}\n\nexport interface CheckoutStore {\n getState(): CheckoutState\n subscribe(listener: () => void): () => void\n setEmail(email: string): void\n setShippingAddress(address: Address): void\n setBillingAddress(address: Address): void\n setShippingMethod(method: ShippingMethod): void\n /** Places the order; resolves to the server's result, or null when there is none. */\n submitPayment(): Promise<CheckoutResult | null>\n /** The provider confirmed the payment on the client (Stripe's `confirmCardPayment`). */\n markConfirmed(): void\n reset(): void\n destroy(): void\n}\n\n/**\n * `cart`, when given, is loaded again once the server has answered a submit: placing an order changes the cart on the\n * server (emptied when confirmed, kept while awaiting payment), and whatever renders the cart store must show that.\n */\nexport function createCheckoutStore(adapter: CommerceAdapter, cart?: CartStore): CheckoutStore {\n const store = createStore<CheckoutState>(INITIAL_STATE)\n\n function setEmail(email: string): void {\n store.setState({ email, step: 'shipping' })\n }\n\n function setShippingAddress(address: Address): void {\n store.setState({ shippingAddress: address })\n }\n\n function setBillingAddress(address: Address): void {\n store.setState({ billingAddress: address })\n }\n\n function setShippingMethod(method: ShippingMethod): void {\n store.setState({ shippingMethod: method, step: 'payment' })\n }\n\n async function submitPayment(): Promise<CheckoutResult | null> {\n const state = store.getState()\n if (!state.shippingAddress || !state.billingAddress) {\n store.setState({ error: 'Shipping and billing addresses are required' })\n return null\n }\n store.setState({ paymentStatus: 'processing', error: null, placedOrderNumber: null })\n try {\n const result = await adapter.checkout.create({\n email: state.email,\n billingAddress: state.billingAddress,\n shippingAddress: state.shippingAddress,\n })\n const { status, reason } = result.payment\n store.setState({\n paymentStatus: status,\n order: {\n orderId: result.orderId,\n orderNumber: result.orderNumber,\n paymentIntent: result.paymentIntent,\n },\n error:\n status === 'failed'\n ? `Your payment did not go through${reason ? ` (${reason})` : ''}. Please try again.`\n : null,\n ...(status === 'succeeded' && { step: 'confirmation' as const }),\n })\n await cart?.load()\n return result\n } catch (err) {\n const placedOrderNumber = namedOrder(err)\n store.setState({\n paymentStatus: 'failed',\n error: err instanceof Error ? err.message : String(err),\n placedOrderNumber,\n })\n // A refusal naming an order: the cart became (or is becoming) that order on the server.\n if (placedOrderNumber !== null) await cart?.load()\n return null\n }\n }\n\n function markConfirmed(): void {\n store.setState({ paymentStatus: 'succeeded', step: 'confirmation' })\n }\n\n function reset(): void {\n store.setState(INITIAL_STATE)\n }\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n setEmail,\n setShippingAddress,\n setBillingAddress,\n setShippingMethod,\n submitPayment,\n markConfirmed,\n reset,\n destroy: store.destroy,\n }\n}\n","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 type { CommerceAdapter } from './adapter/commerce-adapter.js'\nimport { FetchClient } from './adapter/fetch-client.js'\nimport { createNymbalApiAdapter } from './adapter/nymbal-api-adapter.js'\nimport { createTokenManager } from './auth/token-manager.js'\nimport { createCartStore, type CartStore } from './store/cart-store.js'\nimport { createProductStore, type ProductStore } from './store/product-store.js'\nimport { createProductListStore, type ProductListStore } from './store/product-list-store.js'\nimport { createSearchStore, type SearchStore } from './store/search-store.js'\nimport { createCheckoutStore, type CheckoutStore } from './store/checkout-store.js'\nimport { createAuthStore, type AuthStore } from './store/auth-store.js'\nimport type { CustomerAddress, Order } from '@nymbalhq/types'\nimport type { NewAddress, OrderPage } from './types.js'\n\nexport interface NymbalClientOptions {\n baseUrl: string\n adapter?: CommerceAdapter\n tokenStorage?: 'memory' | 'localStorage'\n credentials?: RequestCredentials\n getCartToken?: () => string | null\n}\n\n/** The signed-in customer's own account; every call sends the session's bearer token. */\nexport interface CustomerAccount {\n addresses: {\n list(): Promise<CustomerAddress[]>\n create(address: NewAddress): Promise<CustomerAddress>\n remove(id: string): Promise<void>\n }\n orders: {\n list(opts?: { cursor?: string }): Promise<OrderPage>\n get(orderNumber: string): Promise<Order>\n }\n}\n\nexport interface NymbalClient {\n cart: CartStore\n product: ProductStore\n productList: ProductListStore\n search: SearchStore\n checkout: CheckoutStore\n auth: AuthStore\n customer: CustomerAccount\n adapter: CommerceAdapter\n destroy(): void\n}\n\nexport function createNymbalClient(options: NymbalClientOptions): NymbalClient {\n const tokenManager = createTokenManager({\n ...(options.tokenStorage !== undefined && { storage: options.tokenStorage }),\n })\n\n let adapter: CommerceAdapter\n\n if (options.adapter) {\n adapter = options.adapter\n } else {\n const fetchClient = new FetchClient({\n baseUrl: options.baseUrl,\n ...(options.credentials !== undefined && { credentials: options.credentials }),\n getAccessToken: () => tokenManager.getAccessToken(),\n ...(options.getCartToken !== undefined && { getCartToken: options.getCartToken }),\n onUnauthorized: async () => {\n try {\n const result = await adapter.customers.refresh()\n tokenManager.setTokens(result.accessToken, result.expiresIn)\n } catch (err) {\n // Token refresh failure is expected when the user session has expired.\n console.warn('[NymbalClient] token refresh on unauthorized failed', err)\n tokenManager.clear()\n }\n },\n })\n adapter = createNymbalApiAdapter(fetchClient)\n }\n\n const cart = createCartStore(adapter)\n const product = createProductStore(adapter)\n const productList = createProductListStore(adapter)\n const search = createSearchStore(adapter)\n const checkout = createCheckoutStore(adapter, cart)\n const auth = createAuthStore(adapter, tokenManager)\n\n const customer: CustomerAccount = {\n addresses: {\n list: () => adapter.customers.listAddresses(),\n create: (address) => adapter.customers.addAddress(address),\n remove: (id) => adapter.customers.removeAddress(id),\n },\n orders: {\n list: (opts) => adapter.customers.listOrders(opts),\n get: (orderNumber) => adapter.customers.getOrder(orderNumber),\n },\n }\n\n tokenManager.scheduleRefresh(() => adapter.customers.refresh())\n\n function destroy(): void {\n cart.destroy()\n product.destroy()\n productList.destroy()\n search.destroy()\n checkout.destroy()\n auth.destroy()\n tokenManager.destroy()\n }\n\n return { cart, product, productList, search, checkout, auth, customer, adapter, destroy }\n}\n"],"mappings":"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","names":["INITIAL_STATE","INITIAL_STATE","INITIAL_STATE","INITIAL_STATE","INITIAL_STATE"]}
package/package.json CHANGED
@@ -1,6 +1,41 @@
1
1
  {
2
2
  "name": "@nymbalhq/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Framework-agnostic commerce SDK with pub/sub stores and adapter interface",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/nymbalhq/nymbal.git",
9
+ "directory": "packages/sdk"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "type": "module",
15
+ "engines": {
16
+ "node": ">=22"
17
+ },
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "dependencies": {
30
+ "@nymbalhq/types": "0.2.0"
31
+ },
32
+ "devDependencies": {
33
+ "tsup": "^8.3.5",
34
+ "typescript": "^5.6.3"
35
+ },
36
+ "scripts": {
37
+ "build": "tsup",
38
+ "dev": "tsup --watch",
39
+ "typecheck": "tsc -p tsconfig.json --noEmit"
40
+ }
6
41
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.