@businessdash/sdk 0.9.60 → 0.9.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +991 -295
- package/assets/biab-sw.js +92 -0
- package/dist/account-core/index.d.ts +126 -0
- package/dist/account-core/index.d.ts.map +1 -0
- package/dist/account-core/index.js +191 -0
- package/dist/account-core/index.js.map +1 -0
- package/dist/account.d.ts +11 -0
- package/dist/account.d.ts.map +1 -0
- package/dist/account.js +11 -0
- package/dist/account.js.map +1 -0
- package/dist/auth-handler.d.ts +1 -1
- package/dist/auth-links.d.ts +33 -0
- package/dist/auth-links.d.ts.map +1 -0
- package/dist/auth-links.js +64 -0
- package/dist/auth-links.js.map +1 -0
- package/dist/blog-core/index.d.ts +112 -0
- package/dist/blog-core/index.d.ts.map +1 -0
- package/dist/blog-core/index.js +330 -0
- package/dist/blog-core/index.js.map +1 -0
- package/dist/blog.d.ts +11 -0
- package/dist/blog.d.ts.map +1 -0
- package/dist/blog.js +11 -0
- package/dist/blog.js.map +1 -0
- package/dist/chat-core/index.d.ts +97 -0
- package/dist/chat-core/index.d.ts.map +1 -0
- package/dist/chat-core/index.js +237 -0
- package/dist/chat-core/index.js.map +1 -0
- package/dist/chat.d.ts +11 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/checkout-core/index.d.ts +65 -0
- package/dist/checkout-core/index.d.ts.map +1 -0
- package/dist/checkout-core/index.js +159 -0
- package/dist/checkout-core/index.js.map +1 -0
- package/dist/checkout.d.ts +10 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +10 -0
- package/dist/checkout.js.map +1 -0
- package/dist/cli.js +133 -25
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +622 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +888 -1
- package/dist/client.js.map +1 -1
- package/dist/consent-core/index.cjs +107 -0
- package/dist/consent-core/index.d.ts +103 -0
- package/dist/consent-core/index.d.ts.map +1 -0
- package/dist/consent-core/index.js +157 -0
- package/dist/consent-core/index.js.map +1 -0
- package/dist/contracts.d.ts +3526 -767
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +571 -4
- package/dist/contracts.js.map +1 -1
- package/dist/data-model-schema.d.ts +1 -1
- package/dist/data-model-schema.d.ts.map +1 -1
- package/dist/element.d.ts +30 -0
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +56 -0
- package/dist/element.js.map +1 -1
- package/dist/embed-protocol.d.ts +86 -0
- package/dist/embed-protocol.d.ts.map +1 -0
- package/dist/embed-protocol.js +60 -0
- package/dist/embed-protocol.js.map +1 -0
- package/dist/framework-support.d.ts +122 -0
- package/dist/framework-support.d.ts.map +1 -0
- package/dist/framework-support.js +323 -0
- package/dist/framework-support.js.map +1 -0
- package/dist/index.cjs +1355 -24
- package/dist/legal-core/index.cjs +115 -0
- package/dist/legal-core/index.d.ts +160 -0
- package/dist/legal-core/index.d.ts.map +1 -0
- package/dist/legal-core/index.js +220 -0
- package/dist/legal-core/index.js.map +1 -0
- package/dist/marketing-core/index.d.ts +66 -0
- package/dist/marketing-core/index.d.ts.map +1 -0
- package/dist/marketing-core/index.js +154 -0
- package/dist/marketing-core/index.js.map +1 -0
- package/dist/marketing.d.ts +7 -0
- package/dist/marketing.d.ts.map +1 -0
- package/dist/marketing.js +7 -0
- package/dist/marketing.js.map +1 -0
- package/dist/mcp-adapters/index.d.ts +135 -0
- package/dist/mcp-adapters/index.d.ts.map +1 -0
- package/dist/mcp-adapters/index.js +187 -0
- package/dist/mcp-adapters/index.js.map +1 -0
- package/dist/mcp-adapters.d.ts +7 -0
- package/dist/mcp-adapters.d.ts.map +1 -0
- package/dist/mcp-adapters.js +7 -0
- package/dist/mcp-adapters.js.map +1 -0
- package/dist/model3d-core/index.cjs +95 -0
- package/dist/model3d-core/index.d.ts +167 -0
- package/dist/model3d-core/index.d.ts.map +1 -0
- package/dist/model3d-core/index.js +158 -0
- package/dist/model3d-core/index.js.map +1 -0
- package/dist/notifications-core/index.cjs +315 -0
- package/dist/notifications-core/index.d.ts +229 -0
- package/dist/notifications-core/index.d.ts.map +1 -0
- package/dist/notifications-core/index.js +445 -0
- package/dist/notifications-core/index.js.map +1 -0
- package/dist/portal-core/index.d.ts +451 -0
- package/dist/portal-core/index.d.ts.map +1 -0
- package/dist/portal-core/index.js +819 -0
- package/dist/portal-core/index.js.map +1 -0
- package/dist/portal.d.ts +7 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +7 -0
- package/dist/portal.js.map +1 -0
- package/dist/push-core/index.cjs +171 -0
- package/dist/push-core/index.d.ts +149 -0
- package/dist/push-core/index.d.ts.map +1 -0
- package/dist/push-core/index.js +231 -0
- package/dist/push-core/index.js.map +1 -0
- package/dist/react-marketing.d.ts +1 -17
- package/dist/react-marketing.d.ts.map +1 -1
- package/dist/react-marketing.js +4 -0
- package/dist/react-marketing.js.map +1 -1
- package/dist/react.d.ts +294 -101
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +302 -246
- package/dist/react.js.map +1 -1
- package/dist/seed-core/index.d.ts +354 -0
- package/dist/seed-core/index.d.ts.map +1 -0
- package/dist/seed-core/index.js +420 -0
- package/dist/seed-core/index.js.map +1 -0
- package/dist/seed.d.ts +7 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +7 -0
- package/dist/seed.js.map +1 -0
- package/dist/seo-core/blog.d.ts +94 -0
- package/dist/seo-core/blog.d.ts.map +1 -0
- package/dist/seo-core/blog.js +149 -0
- package/dist/seo-core/blog.js.map +1 -0
- package/dist/seo-core/commerce.d.ts +64 -0
- package/dist/seo-core/commerce.d.ts.map +1 -0
- package/dist/seo-core/commerce.js +87 -0
- package/dist/seo-core/commerce.js.map +1 -0
- package/dist/seo-core/index.cjs +751 -0
- package/dist/seo-core/index.d.ts +226 -0
- package/dist/seo-core/index.d.ts.map +1 -0
- package/dist/seo-core/index.js +455 -0
- package/dist/seo-core/index.js.map +1 -0
- package/dist/seo-core/local.d.ts +181 -0
- package/dist/seo-core/local.d.ts.map +1 -0
- package/dist/seo-core/local.js +193 -0
- package/dist/seo-core/local.js.map +1 -0
- package/dist/sitemap-core/index.cjs +167 -0
- package/dist/sitemap-core/index.d.ts +155 -0
- package/dist/sitemap-core/index.d.ts.map +1 -0
- package/dist/sitemap-core/index.js +195 -0
- package/dist/sitemap-core/index.js.map +1 -0
- package/dist/social-core/index.d.ts +74 -0
- package/dist/social-core/index.d.ts.map +1 -0
- package/dist/social-core/index.js +72 -0
- package/dist/social-core/index.js.map +1 -0
- package/dist/social.d.ts +7 -0
- package/dist/social.d.ts.map +1 -0
- package/dist/social.js +7 -0
- package/dist/social.js.map +1 -0
- package/dist/solid-compat.d.ts +204 -0
- package/dist/solid-compat.d.ts.map +1 -0
- package/dist/solid-compat.js +221 -0
- package/dist/solid-compat.js.map +1 -0
- package/dist/store-core/index.d.ts +141 -0
- package/dist/store-core/index.d.ts.map +1 -0
- package/dist/store-core/index.js +277 -0
- package/dist/store-core/index.js.map +1 -0
- package/dist/store.d.ts +12 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +12 -0
- package/dist/store.js.map +1 -0
- package/dist/vanilla.d.ts +111 -0
- package/dist/vanilla.d.ts.map +1 -1
- package/dist/vanilla.js +206 -0
- package/dist/vanilla.js.map +1 -1
- package/dist/verify-core/index.d.ts +98 -0
- package/dist/verify-core/index.d.ts.map +1 -0
- package/dist/verify-core/index.js +186 -0
- package/dist/verify-core/index.js.map +1 -0
- package/dist/verify.d.ts +8 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +8 -0
- package/dist/verify.js.map +1 -0
- package/openapi.json +4516 -1311
- package/package.json +128 -11
- package/src/account-core/index.ts +309 -0
- package/src/account.ts +11 -0
- package/src/angular/headless.ts +519 -0
- package/src/angular/index.ts +3 -0
- package/src/auth-links.ts +76 -0
- package/src/blog-core/index.ts +423 -0
- package/src/blog.ts +11 -0
- package/src/chat-core/index.ts +335 -0
- package/src/chat.ts +11 -0
- package/src/checkout-core/index.ts +225 -0
- package/src/checkout.ts +10 -0
- package/src/cli.ts +184 -28
- package/src/client.ts +1097 -0
- package/src/consent-core/index.ts +213 -0
- package/src/contracts.ts +768 -11
- package/src/data-model-schema.ts +1 -1
- package/src/element.ts +102 -0
- package/src/embed-protocol.ts +100 -0
- package/src/framework-support.ts +440 -0
- package/src/legal-core/index.ts +276 -0
- package/src/marketing-core/index.ts +209 -0
- package/src/marketing.ts +7 -0
- package/src/mcp-adapters/index.ts +264 -0
- package/src/mcp-adapters.ts +7 -0
- package/src/model3d-core/index.ts +248 -0
- package/src/notifications-core/index.ts +650 -0
- package/src/portal-core/index.ts +1564 -0
- package/src/portal.ts +7 -0
- package/src/push-core/index.ts +335 -0
- package/src/qwik.tsx +602 -2
- package/src/react-marketing.tsx +5 -0
- package/src/react.tsx +434 -319
- package/src/seed-core/index.ts +735 -0
- package/src/seed.ts +7 -0
- package/src/seo-core/blog.ts +216 -0
- package/src/seo-core/commerce.ts +138 -0
- package/src/seo-core/index.ts +605 -0
- package/src/seo-core/local.ts +333 -0
- package/src/sitemap-core/index.ts +296 -0
- package/src/social-core/index.ts +103 -0
- package/src/social.ts +7 -0
- package/src/solid-compat.tsx +347 -0
- package/src/solid-surfaces.tsx +1311 -0
- package/src/solid.tsx +82 -60
- package/src/store-core/index.ts +426 -0
- package/src/store.ts +12 -0
- package/src/svelte/SocialLinks.svelte +84 -0
- package/src/svelte/headless.ts +435 -0
- package/src/svelte/index.ts +9 -0
- package/src/vanilla.ts +367 -0
- package/src/verify-core/index.ts +288 -0
- package/src/verify.ts +8 -0
- package/src/vue/headless.ts +527 -0
- package/src/vue/index.ts +3 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@businessdash/sdk/svelte` — headless storefront + chat.
|
|
3
|
+
*
|
|
4
|
+
* `<Storefront>` and `<Chatbot>` are hosted pages in a sandboxed iframe. These
|
|
5
|
+
* are the native path: all behaviour, no markup.
|
|
6
|
+
*
|
|
7
|
+
* Everything real lives in `store-core` / `chat-core`, shared with every other
|
|
8
|
+
* binding. This file bridges a controller's subscribe/snapshot observable into
|
|
9
|
+
* a Svelte store.
|
|
10
|
+
*
|
|
11
|
+
* Stores rather than runes on purpose: runes are a compiler feature that only
|
|
12
|
+
* exists inside `.svelte` / `.svelte.ts` files, and these have to be callable
|
|
13
|
+
* from a plain `.ts` module too. `$store` auto-subscription in a component
|
|
14
|
+
* reads identically either way.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { type Readable, readable } from "svelte/store";
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
type BlogController,
|
|
23
|
+
type BlogSnapshot,
|
|
24
|
+
createBlogController,
|
|
25
|
+
} from "../blog-core/index.js";
|
|
26
|
+
import {
|
|
27
|
+
type ChatController,
|
|
28
|
+
type ChatSnapshot,
|
|
29
|
+
createChatController,
|
|
30
|
+
} from "../chat-core/index.js";
|
|
31
|
+
import { BiabDevClient } from "../client.js";
|
|
32
|
+
import {
|
|
33
|
+
createPortalController,
|
|
34
|
+
type PortalSnapshot,
|
|
35
|
+
} from "../portal-core/index.js";
|
|
36
|
+
|
|
37
|
+
import {
|
|
38
|
+
createMarketingController,
|
|
39
|
+
type MarketingController,
|
|
40
|
+
type MarketingSnapshot,
|
|
41
|
+
} from "../marketing-core/index.js";
|
|
42
|
+
import {
|
|
43
|
+
createVerifyController,
|
|
44
|
+
type CreateVerifyControllerOptions,
|
|
45
|
+
type VerifyController,
|
|
46
|
+
type VerifySnapshot,
|
|
47
|
+
} from "../verify-core/index.js";
|
|
48
|
+
|
|
49
|
+
import {
|
|
50
|
+
createFollowersController,
|
|
51
|
+
createUserController,
|
|
52
|
+
type FollowersController,
|
|
53
|
+
type FollowersSnapshot,
|
|
54
|
+
type UserController,
|
|
55
|
+
type UserSnapshot,
|
|
56
|
+
} from "../account-core/index.js";
|
|
57
|
+
import {
|
|
58
|
+
type CheckoutController,
|
|
59
|
+
type CheckoutSnapshot,
|
|
60
|
+
createCheckoutController,
|
|
61
|
+
} from "../checkout-core/index.js";
|
|
62
|
+
import { createBiabClient } from "../sdk.js";
|
|
63
|
+
|
|
64
|
+
import type {
|
|
65
|
+
BlogCommentPostInput,
|
|
66
|
+
CartAddItemInput,
|
|
67
|
+
ChatbotFormSubmitInput,
|
|
68
|
+
ChatbotRequestHumanInput,
|
|
69
|
+
CustomerPortalMessagePostInput,
|
|
70
|
+
} from "../contracts.js";
|
|
71
|
+
import {
|
|
72
|
+
createStoreController,
|
|
73
|
+
type StoreController,
|
|
74
|
+
type StoreSnapshot,
|
|
75
|
+
} from "../store-core/index.js";
|
|
76
|
+
|
|
77
|
+
type Observable<TSnapshot> = {
|
|
78
|
+
snapshot(): TSnapshot;
|
|
79
|
+
subscribe(cb: (s: TSnapshot) => void): () => void;
|
|
80
|
+
destroy(): void;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Wrap a controller as a readable store.
|
|
85
|
+
*
|
|
86
|
+
* `readable`'s start function runs on the FIRST subscriber and its return value
|
|
87
|
+
* runs when the LAST one goes away, which is exactly the controller's lifetime:
|
|
88
|
+
* a component that mounts, renders and unmounts destroys it, and one that never
|
|
89
|
+
* subscribes never opens a request.
|
|
90
|
+
*
|
|
91
|
+
* The initial value comes from `snapshot()` because the cores do not replay on
|
|
92
|
+
* subscribe.
|
|
93
|
+
*/
|
|
94
|
+
function toStore<TSnapshot>(
|
|
95
|
+
controller: Observable<TSnapshot>,
|
|
96
|
+
start?: () => void,
|
|
97
|
+
): Readable<TSnapshot> {
|
|
98
|
+
return readable(controller.snapshot(), (set) => {
|
|
99
|
+
const unsubscribe = controller.subscribe(set);
|
|
100
|
+
start?.();
|
|
101
|
+
return () => {
|
|
102
|
+
unsubscribe();
|
|
103
|
+
controller.destroy();
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type CreateStorefrontOptions = {
|
|
109
|
+
apiKey: string;
|
|
110
|
+
baseUrl: string;
|
|
111
|
+
pageSize?: number;
|
|
112
|
+
categoryId?: string | null;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export type StorefrontHandle = {
|
|
116
|
+
state: Readable<StoreSnapshot>;
|
|
117
|
+
} & Omit<StoreController, "snapshot" | "subscribe" | "destroy" | "load">;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Headless storefront + cart.
|
|
121
|
+
*
|
|
122
|
+
* ```svelte
|
|
123
|
+
* <script lang="ts">
|
|
124
|
+
* const { state, addToCart } = createStorefront({ apiKey, baseUrl });
|
|
125
|
+
* </script>
|
|
126
|
+
* {#each $state.products as product}
|
|
127
|
+
* <MyCard {product} />
|
|
128
|
+
* {/each}
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export function createStorefront(
|
|
132
|
+
options: CreateStorefrontOptions,
|
|
133
|
+
): StorefrontHandle {
|
|
134
|
+
const controller = createStoreController({
|
|
135
|
+
client: new BiabDevClient({
|
|
136
|
+
apiKey: options.apiKey,
|
|
137
|
+
baseUrl: options.baseUrl,
|
|
138
|
+
}),
|
|
139
|
+
...(options.pageSize ? { pageSize: options.pageSize } : {}),
|
|
140
|
+
...(options.categoryId ? { categoryId: options.categoryId } : {}),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
state: toStore(controller, () => void controller.load()),
|
|
145
|
+
loadMore: () => controller.loadMore(),
|
|
146
|
+
filterByCategory: (id: string | null) => controller.filterByCategory(id),
|
|
147
|
+
openProduct: (id: string) => controller.openProduct(id),
|
|
148
|
+
closeProduct: () => controller.closeProduct(),
|
|
149
|
+
addToCart: (input: CartAddItemInput) => controller.addToCart(input),
|
|
150
|
+
updateQuantity: (itemId: string, quantity: number) =>
|
|
151
|
+
controller.updateQuantity(itemId, quantity),
|
|
152
|
+
removeItem: (itemId: string) => controller.removeItem(itemId),
|
|
153
|
+
applyCoupon: (code: string) => controller.applyCoupon(code),
|
|
154
|
+
removeCoupon: () => controller.removeCoupon(),
|
|
155
|
+
clearCart: () => controller.clearCart(),
|
|
156
|
+
refreshCart: () => controller.refreshCart(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export type CreateChatOptions = { apiKey: string; baseUrl: string };
|
|
161
|
+
|
|
162
|
+
export type ChatHandle = {
|
|
163
|
+
state: Readable<ChatSnapshot>;
|
|
164
|
+
} & Omit<ChatController, "snapshot" | "subscribe" | "destroy">;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Headless Front Desk chat — the native alternative to `<Chatbot>`.
|
|
168
|
+
*
|
|
169
|
+
* ```svelte
|
|
170
|
+
* <script lang="ts">
|
|
171
|
+
* const { state, send } = createChat({ apiKey, baseUrl });
|
|
172
|
+
* </script>
|
|
173
|
+
* {#each $state.messages as message}
|
|
174
|
+
* <Bubble {message} />
|
|
175
|
+
* {/each}
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
export function createChat(options: CreateChatOptions): ChatHandle {
|
|
179
|
+
const controller = createChatController({
|
|
180
|
+
client: new BiabDevClient({
|
|
181
|
+
apiKey: options.apiKey,
|
|
182
|
+
baseUrl: options.baseUrl,
|
|
183
|
+
}),
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
state: toStore(controller),
|
|
188
|
+
send: (content: string) => controller.send(content),
|
|
189
|
+
reset: () => controller.reset(),
|
|
190
|
+
loadConfig: () => controller.loadConfig(),
|
|
191
|
+
refreshAvailability: () => controller.refreshAvailability(),
|
|
192
|
+
getForm: (slug: string) => controller.getForm(slug),
|
|
193
|
+
submitForm: (slug: string, input: ChatbotFormSubmitInput) =>
|
|
194
|
+
controller.submitForm(slug, input),
|
|
195
|
+
requestHuman: (input: ChatbotRequestHumanInput) =>
|
|
196
|
+
controller.requestHuman(input),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export type CreateBlogOptions = {
|
|
201
|
+
apiKey: string;
|
|
202
|
+
baseUrl: string;
|
|
203
|
+
pageSize?: number;
|
|
204
|
+
categoryId?: string | null;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
export type BlogHandle = {
|
|
208
|
+
state: Readable<BlogSnapshot>;
|
|
209
|
+
} & Omit<BlogController, "snapshot" | "subscribe" | "destroy" | "load">;
|
|
210
|
+
|
|
211
|
+
/** Headless blog — the native alternative to `<Blog>`. */
|
|
212
|
+
export function createBlog(options: CreateBlogOptions): BlogHandle {
|
|
213
|
+
const controller = createBlogController({
|
|
214
|
+
client: new BiabDevClient({
|
|
215
|
+
apiKey: options.apiKey,
|
|
216
|
+
baseUrl: options.baseUrl,
|
|
217
|
+
}),
|
|
218
|
+
...(options.pageSize ? { pageSize: options.pageSize } : {}),
|
|
219
|
+
...(options.categoryId ? { categoryId: options.categoryId } : {}),
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
state: toStore(controller, () => void controller.load()),
|
|
224
|
+
loadMore: () => controller.loadMore(),
|
|
225
|
+
filterByCategory: (id: string | null) => controller.filterByCategory(id),
|
|
226
|
+
openPost: (slug: string) => controller.openPost(slug),
|
|
227
|
+
closePost: () => controller.closePost(),
|
|
228
|
+
loadComments: () => controller.loadComments(),
|
|
229
|
+
loadMoreComments: () => controller.loadMoreComments(),
|
|
230
|
+
postComment: (input: BlogCommentPostInput) =>
|
|
231
|
+
controller.postComment(input),
|
|
232
|
+
toggleLike: () => controller.toggleLike(),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export type CreateCheckoutOptions = { apiKey: string; baseUrl: string };
|
|
237
|
+
export type CreateCheckoutResult = {
|
|
238
|
+
state: Readable<CheckoutSnapshot>;
|
|
239
|
+
} & Omit<CheckoutController, "snapshot" | "subscribe" | "destroy">;
|
|
240
|
+
|
|
241
|
+
/** Headless checkout. `start()` mints a session; `redirect()` navigates. */
|
|
242
|
+
export function createCheckout(options: CreateCheckoutOptions): CreateCheckoutResult {
|
|
243
|
+
const controller = createCheckoutController({
|
|
244
|
+
client: new BiabDevClient({
|
|
245
|
+
apiKey: options.apiKey,
|
|
246
|
+
baseUrl: options.baseUrl,
|
|
247
|
+
}),
|
|
248
|
+
});
|
|
249
|
+
const state = toStore(controller);
|
|
250
|
+
return {
|
|
251
|
+
state,
|
|
252
|
+
start: (input) => controller.start(input),
|
|
253
|
+
redirect: () => controller.redirect(),
|
|
254
|
+
resolve: (sessionId: string) => controller.resolve(sessionId),
|
|
255
|
+
reset: () => controller.reset(),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export type CreateUserResult = {
|
|
260
|
+
state: Readable<UserSnapshot>;
|
|
261
|
+
refresh: () => Promise<UserSnapshot>;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/** The signed-in customer, from the auth handler's `/me`. */
|
|
265
|
+
export function createUser(options: { basePath?: string } = {}): CreateUserResult {
|
|
266
|
+
const controller = createUserController(options);
|
|
267
|
+
const state = toStore(controller, () => controller.start());
|
|
268
|
+
return { state, refresh: () => controller.refresh() };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export type CreateFollowersOptions = {
|
|
272
|
+
token: string;
|
|
273
|
+
siteId: string;
|
|
274
|
+
baseUrl?: string;
|
|
275
|
+
};
|
|
276
|
+
export type CreateFollowersResult = {
|
|
277
|
+
state: Readable<FollowersSnapshot>;
|
|
278
|
+
} & Omit<FollowersController, "snapshot" | "subscribe" | "destroy">;
|
|
279
|
+
|
|
280
|
+
/** Newsletter / follower subscribe with the local already-subscribed hint. */
|
|
281
|
+
export function createFollowers(
|
|
282
|
+
options: CreateFollowersOptions,
|
|
283
|
+
): CreateFollowersResult {
|
|
284
|
+
const controller = createFollowersController({
|
|
285
|
+
client: createBiabClient({
|
|
286
|
+
apiKey: options.token,
|
|
287
|
+
siteId: options.siteId,
|
|
288
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
289
|
+
}),
|
|
290
|
+
siteId: options.siteId,
|
|
291
|
+
});
|
|
292
|
+
const state = toStore(controller);
|
|
293
|
+
return {
|
|
294
|
+
state,
|
|
295
|
+
join: (input) => controller.join(input),
|
|
296
|
+
leave: (email: string) => controller.leave(email),
|
|
297
|
+
me: (email: string) => controller.me(email),
|
|
298
|
+
edit: (email: string, patch: { name?: string; source?: string }) =>
|
|
299
|
+
controller.edit(email, patch),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export {
|
|
304
|
+
signIn,
|
|
305
|
+
signInHref,
|
|
306
|
+
signOut,
|
|
307
|
+
signOutHref,
|
|
308
|
+
signUp,
|
|
309
|
+
signUpHref,
|
|
310
|
+
} from "../account-core/index.js";
|
|
311
|
+
|
|
312
|
+
export type CreateMarketingOptions = {
|
|
313
|
+
token: string;
|
|
314
|
+
siteId: string;
|
|
315
|
+
baseUrl?: string;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/** Headless marketing pages — the index, plus one page at a time. */
|
|
319
|
+
export function createMarketing(options: CreateMarketingOptions) {
|
|
320
|
+
const controller = createMarketingController({
|
|
321
|
+
client: createBiabClient({
|
|
322
|
+
apiKey: options.token,
|
|
323
|
+
siteId: options.siteId,
|
|
324
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
325
|
+
}),
|
|
326
|
+
});
|
|
327
|
+
const state = toStore(controller, () => void controller.load());
|
|
328
|
+
return {
|
|
329
|
+
state,
|
|
330
|
+
open: (pageKey?: string, opts?: { skipCache?: boolean }) =>
|
|
331
|
+
controller.open(pageKey, opts),
|
|
332
|
+
prefetch: (pageKey?: string) => controller.prefetch(pageKey),
|
|
333
|
+
close: () => controller.close(),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export type CreateVerifyOptions = {
|
|
338
|
+
apiKey: string;
|
|
339
|
+
baseUrl: string;
|
|
340
|
+
} & Omit<CreateVerifyControllerOptions, "client">;
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Headless email / phone verification.
|
|
344
|
+
*
|
|
345
|
+
* Read `state.flow` before rendering: `otp` wants a code field, `link` wants a
|
|
346
|
+
* "check your email" message and no field at all.
|
|
347
|
+
*/
|
|
348
|
+
export function createVerify(options: CreateVerifyOptions) {
|
|
349
|
+
const { apiKey, baseUrl, ...rest } = options;
|
|
350
|
+
const controller = createVerifyController({
|
|
351
|
+
client: new BiabDevClient({ apiKey, baseUrl }),
|
|
352
|
+
...rest,
|
|
353
|
+
});
|
|
354
|
+
const state = toStore(controller);
|
|
355
|
+
return {
|
|
356
|
+
state,
|
|
357
|
+
start: (destination: string) => controller.start(destination),
|
|
358
|
+
resend: () => controller.resend(),
|
|
359
|
+
confirm: (token: string) => controller.confirm(token),
|
|
360
|
+
canResend: (now?: number) => controller.canResend(now),
|
|
361
|
+
reset: () => controller.reset(),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export type CreatePortalOptions = {
|
|
366
|
+
apiKey: string;
|
|
367
|
+
baseUrl: string;
|
|
368
|
+
sessionToken: string;
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* The signed-in customer's portal — work, quotes, contracts, invoices, orders,
|
|
373
|
+
* downloads, shipping, reviews, referrals, profile and notification settings.
|
|
374
|
+
*
|
|
375
|
+
* `sessionToken` is required: every portal route is scoped to the signed-in
|
|
376
|
+
* customer, and without one the portal renders empty rather than signed-out.
|
|
377
|
+
*
|
|
378
|
+
* Note two things the API itself imposes. There are no list endpoints for
|
|
379
|
+
* invoices, quotes, contracts or shipments — `state.work` carries the counts
|
|
380
|
+
* and you open each by id. And a submitted review is queued for staff approval,
|
|
381
|
+
* so it will not appear in `state.reviews`; watch `reviewAwaitingModeration`.
|
|
382
|
+
*/
|
|
383
|
+
export function createPortal(options: CreatePortalOptions) {
|
|
384
|
+
const controller = createPortalController({
|
|
385
|
+
client: new BiabDevClient({
|
|
386
|
+
apiKey: options.apiKey,
|
|
387
|
+
baseUrl: options.baseUrl,
|
|
388
|
+
}),
|
|
389
|
+
sessionToken: options.sessionToken,
|
|
390
|
+
});
|
|
391
|
+
const state: Readable<PortalSnapshot> = toStore(controller, () => void controller.load());
|
|
392
|
+
return {
|
|
393
|
+
state,
|
|
394
|
+
load: () => controller.load(),
|
|
395
|
+
loadOrders: (opts?: { limit?: number }) => controller.loadOrders(opts),
|
|
396
|
+
loadInvoices: (opts?: {
|
|
397
|
+
limit?: number;
|
|
398
|
+
status?: string;
|
|
399
|
+
unpaid?: boolean;
|
|
400
|
+
}) => controller.loadInvoices(opts),
|
|
401
|
+
loadQuotes: (opts?: { limit?: number; status?: string }) =>
|
|
402
|
+
controller.loadQuotes(opts),
|
|
403
|
+
loadContracts: (opts?: { limit?: number; status?: string }) =>
|
|
404
|
+
controller.loadContracts(opts),
|
|
405
|
+
loadShipments: (opts?: { limit?: number; active?: boolean }) =>
|
|
406
|
+
controller.loadShipments(opts),
|
|
407
|
+
loadMessages: (opts?: { limit?: number; jobId?: string }) =>
|
|
408
|
+
controller.loadMessages(opts),
|
|
409
|
+
postMessage: (input: CustomerPortalMessagePostInput) =>
|
|
410
|
+
controller.postMessage(input),
|
|
411
|
+
markMessagesRead: () => controller.markMessagesRead(),
|
|
412
|
+
loadPayments: (opts?: { limit?: number }) => controller.loadPayments(opts),
|
|
413
|
+
loadReviews: () => controller.loadReviews(),
|
|
414
|
+
loadReferrals: () => controller.loadReferrals(),
|
|
415
|
+
loadNotificationPreferences: () => controller.loadNotificationPreferences(),
|
|
416
|
+
loadOtherOrgs: () => controller.loadOtherOrgs(),
|
|
417
|
+
openJob: (id: string) => controller.openJob(id),
|
|
418
|
+
openOrder: (id: string) => controller.openOrder(id),
|
|
419
|
+
openInvoice: (id: string) => controller.openInvoice(id),
|
|
420
|
+
openQuote: (id: string) => controller.openQuote(id),
|
|
421
|
+
openContract: (id: string) => controller.openContract(id),
|
|
422
|
+
trackShipment: (id: string) => controller.trackShipment(id),
|
|
423
|
+
closeDetail: () => controller.closeDetail(),
|
|
424
|
+
postJobComment: controller.postJobComment,
|
|
425
|
+
acceptQuote: (id: string) => controller.acceptQuote(id),
|
|
426
|
+
rejectQuote: (id: string) => controller.rejectQuote(id),
|
|
427
|
+
signContract: (id: string) => controller.signContract(id),
|
|
428
|
+
payInvoice: controller.payInvoice,
|
|
429
|
+
updateProfile: controller.updateProfile,
|
|
430
|
+
updateNotificationPreferences: controller.updateNotificationPreferences,
|
|
431
|
+
submitReview: controller.submitReview,
|
|
432
|
+
submitReturnRequest: controller.submitReturnRequest,
|
|
433
|
+
contactCompany: controller.contactCompany,
|
|
434
|
+
};
|
|
435
|
+
}
|
package/src/svelte/index.ts
CHANGED
|
@@ -77,3 +77,12 @@ export type {
|
|
|
77
77
|
FormsResource,
|
|
78
78
|
} from "../forms-core/index.js";
|
|
79
79
|
export type { BiabClient } from "../sdk.js";
|
|
80
|
+
|
|
81
|
+
// Headless storefront + chat — the native (non-iframe) surfaces.
|
|
82
|
+
export * from "./headless.js";
|
|
83
|
+
|
|
84
|
+
// The social-links block. Markup lives in an SFC because Svelte has no
|
|
85
|
+
// render-function escape hatch; everything that could drift is in `social-core`.
|
|
86
|
+
export { default as SocialLinks } from "./SocialLinks.svelte";
|
|
87
|
+
export { resolveSocialLinks } from "../social-core/index.js";
|
|
88
|
+
export type { SocialLinkRow } from "../social-core/index.js";
|