@onlive.ai/flow-client 0.1.38 → 0.1.40

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.
@@ -1,724 +1,2 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
-
5
- // client/client.service.ts
6
- import { merge as merge2 } from "@onlive.ai/common-121/utils/merge.js";
7
-
8
- // tracking/tracking.service.ts
9
- import { Session, Tracker } from "@onlive.ai/tracker";
10
- import { merge } from "@onlive.ai/common-121/utils/merge.js";
11
- import { browserPreferences } from "@onlive.ai/common-121/utils/browser-preferences.js";
12
-
13
- // tracking/tracking.types.ts
14
- import { z } from "zod";
15
- var ONLIVE_FLOW_FORM_NAME = "flow_form";
16
- var ONLIVE_ANALYTICS_EVENT = "onlive-analytics-event";
17
- var TrackingOptionsSchema = z.object({
18
- enabled: z.boolean().default(false).optional(),
19
- data: z.custom().optional(),
20
- removeExtraneousValues: z.boolean().default(true).optional(),
21
- allowBotTraffic: z.boolean().default(false).optional(),
22
- adapters: z.array(z.string()).default([]).optional(),
23
- apiUrl: z.string().url().optional(),
24
- emitters: z.object({
25
- windowEvent: z.boolean().optional(),
26
- dataLayer: z.boolean().optional(),
27
- windowPostMessage: z.boolean().optional()
28
- }).optional()
29
- });
30
-
31
- // tracking/tracking.service.ts
32
- var TrackingService = class {
33
- /**
34
- * Creates a new TrackingService instance.
35
- * @param organizationId - The ID of the organization
36
- * @param flowId - The ID of the flow being tracked
37
- * @param options - Configuration options for the tracking service
38
- * @param devMode - Flag indicating whether to run in development mode
39
- */
40
- constructor(organizationId, flowId, options, devMode) {
41
- /**
42
- * Configuration options for the tracking service.
43
- */
44
- __publicField(this, "options");
45
- /**
46
- * The tracker instance used to send events.
47
- */
48
- __publicField(this, "tracker");
49
- /**
50
- * List of event listeners for tracking events.
51
- */
52
- __publicField(this, "eventListeners", []);
53
- this.options = TrackingOptionsSchema.parse(options);
54
- this.tracker = new Tracker({
55
- apiUrl: this.options.apiUrl,
56
- removeExtraneousValues: this.options.removeExtraneousValues,
57
- allowBotTraffic: this.options.allowBotTraffic,
58
- adapters: this.options.adapters,
59
- dryRun: devMode
60
- });
61
- this.tracker.setBase(
62
- merge(
63
- {},
64
- {
65
- organization_id: organizationId,
66
- page_url: window.location.href,
67
- page_referrer: document.referrer,
68
- origin_medium: "web",
69
- guest_id: Session.id,
70
- interaction_id: Session.interactionId,
71
- extra: {
72
- flow_id: flowId
73
- }
74
- },
75
- this.options.data
76
- )
77
- );
78
- window.addEventListener(
79
- ONLIVE_ANALYTICS_EVENT,
80
- ({ detail }) => this.emit(detail.event, detail.data)
81
- );
82
- }
83
- /**
84
- * Returns the tracker instance used for sending events.
85
- * @returns {Tracker} The tracker instance
86
- */
87
- getTracker() {
88
- return this.tracker;
89
- }
90
- /**
91
- * Returns tracking-related user preferences and session information.
92
- *
93
- * This method combines browser preferences with session identification data
94
- * that can be used for tracking and analytics purposes.
95
- *
96
- * @returns {Object} An object containing browser preferences and session identifiers
97
- * @property {string} interactionId - The current session interaction identifier
98
- * @property {string} guestId - The unique identifier for the current guest/user
99
- */
100
- preferences() {
101
- return {
102
- ...browserPreferences(),
103
- interactionId: Session.interactionId,
104
- guestId: Session.id
105
- };
106
- }
107
- /**
108
- * Analyzes a request and generates tracking events based on the provided trigger and options.
109
- *
110
- * @param {GetStepTrigger | { stepId?: string }} trigger - The trigger for the step, which can be either a `GetStepTrigger` or an object containing an optional `stepId`.
111
- * @param {GetStepOptions} options - The options for getting the step, including fields for form data.
112
- */
113
- analyzeRequest(trigger, options) {
114
- if ("currentStepId" in trigger) {
115
- if (trigger.actionId) {
116
- this.tracker.send("element_click", {
117
- element_label: trigger.actionId,
118
- element_type: "button",
119
- form_name: Object.keys(options.fields || {}).length ? ONLIVE_FLOW_FORM_NAME : void 0,
120
- step_name: trigger.currentStepId
121
- });
122
- }
123
- if (options.fields) {
124
- this.tracker.send("form_submit", {
125
- form_name: ONLIVE_FLOW_FORM_NAME,
126
- form_data: options.fields,
127
- step_name: trigger.currentStepId
128
- });
129
- }
130
- }
131
- }
132
- /**
133
- * Analyzes the response based on the provided trigger and flow context, and generates tracking events.
134
- *
135
- * @param {GetStepTrigger | { stepId?: string }} trigger - The trigger for the step, which can be either a `GetStepTrigger` or an object containing an optional `stepId`.
136
- * @param {FlowContext} flowContext - The context of the flow, containing information about the current step and its result.
137
- */
138
- analyzeResponse(trigger, flowContext) {
139
- if ("currentStepId" in trigger) {
140
- if (flowContext.step.result?.pipelines) {
141
- flowContext.step.result.pipelines.forEach((pipeline) => {
142
- this.tracker.send("task_success", {
143
- task_name: pipeline.name,
144
- task_data: pipeline.data,
145
- step_name: flowContext.step.id
146
- });
147
- });
148
- }
149
- if (flowContext.step.error) {
150
- this.tracker.send("form_error", {
151
- form_name: ONLIVE_FLOW_FORM_NAME,
152
- form_error: flowContext.step.error.code,
153
- step_name: flowContext.step.id
154
- });
155
- }
156
- }
157
- this.tracker.send("impression", {
158
- impression_type: "step",
159
- form_name: void 0,
160
- step_name: flowContext.step.id,
161
- step_initial: !("currentStepId" in trigger) || void 0,
162
- step_final: flowContext.step.isFinal
163
- });
164
- this.tracker.setBase({
165
- form_name: ONLIVE_FLOW_FORM_NAME,
166
- step_name: flowContext.step.id,
167
- step_initial: !("currentStepId" in trigger) || void 0,
168
- step_final: flowContext.step.isFinal,
169
- ...flowContext.step.result?.tracking
170
- });
171
- }
172
- /**
173
- * Sends an event to the tracker.
174
- *
175
- * This method dispatches an event with the provided name and data to the tracking system.
176
- * Events represent user interactions or system occurrences that should be recorded for analytics.
177
- *
178
- * @param eventName - The name of the event to send
179
- * @param eventData - The data associated with the event
180
- */
181
- send(eventName, eventData) {
182
- this.tracker.send(eventName, eventData);
183
- }
184
- /**
185
- * Sets base data for the tracker that will be included in all future events.
186
- *
187
- * This method defines default properties that will be automatically included
188
- * in every tracking event sent after this call. This is useful for setting
189
- * context information that remains constant across multiple events.
190
- *
191
- * @param data - The base data to set for the tracker
192
- */
193
- setData(data) {
194
- this.tracker.setBase(data);
195
- }
196
- /**
197
- * Registers an event listener to be notified when tracking events are emitted.
198
- *
199
- * @param {function} listener - The callback function to execute when an event is emitted
200
- */
201
- onEvent(listener) {
202
- this.eventListeners.push(listener);
203
- }
204
- /**
205
- * Emits an event to all registered listeners for the specified event name.
206
- *
207
- * @param {EventName} eventName - The name of the event to emit
208
- * @param {EventData} eventData - The data associated with the event
209
- */
210
- emit(eventName, eventData) {
211
- this.eventListeners.forEach((listener) => listener({ event: eventName, data: eventData }));
212
- }
213
- };
214
- var tracking_service_default = TrackingService;
215
-
216
- // client/client.types.ts
217
- import { GetAvailabilityFilters, GetAvailabilityOptions } from "@onlive.ai/calendar";
218
- import { z as z2 } from "zod";
219
- var DEFAULT_CLIENT_OPTIONS = {
220
- tracking: {
221
- removeExtraneousValues: true,
222
- apiUrl: "https://srvless.onlive.site/tracking",
223
- data: {
224
- widget_type: "OnliveAppFlow"
225
- }
226
- }
227
- };
228
- var StepId = z2.string().nonempty();
229
- var ClientOptions = z2.object({
230
- baseUrl: z2.string().url().nonempty(),
231
- flowId: z2.string().length(24).nonempty(),
232
- organizationId: z2.string().uuid().nonempty(),
233
- lang: z2.string().length(2).nonempty(),
234
- tracking: TrackingOptionsSchema.optional(),
235
- devMode: z2.boolean().default(false).optional()
236
- });
237
- var GetStepOptions = z2.object({
238
- state: z2.record(z2.string(), z2.any()).optional(),
239
- fields: z2.record(z2.string(), z2.any()).optional()
240
- });
241
- var GetStepTrigger = z2.object({
242
- currentStepId: z2.string().nonempty(),
243
- actionId: z2.string().nonempty()
244
- });
245
- var FieldType = z2.enum([
246
- "text",
247
- "boolean",
248
- "number",
249
- "email",
250
- "phone",
251
- "mobile_phone",
252
- "date",
253
- "time",
254
- "datetime",
255
- "password",
256
- "url",
257
- "color",
258
- "object",
259
- "void",
260
- "location",
261
- "availability"
262
- ]);
263
- var LocationProperty = z2.object({
264
- name: z2.string(),
265
- value: z2.string().optional(),
266
- icon: z2.string().optional(),
267
- type: z2.enum(["url", "email", "phone"]).optional()
268
- });
269
- var Location = z2.object({
270
- lat: z2.number().min(-90).max(90),
271
- lng: z2.number().min(-180).max(180),
272
- meta: z2.record(z2.string(), z2.any()).optional(),
273
- properties: z2.record(z2.string(), LocationProperty).optional(),
274
- attributes: z2.record(z2.string(), z2.any()).optional()
275
- });
276
- var Availability = z2.object({
277
- datetime: z2.string().datetime(),
278
- meta: z2.record(z2.string(), z2.any()).optional()
279
- });
280
- var FieldValue = z2.union([z2.string(), z2.number(), z2.boolean(), Location, Availability]);
281
- var MapPin = z2.object({
282
- content: z2.object({
283
- icon: z2.string().optional(),
284
- url: z2.string().url().optional(),
285
- width: z2.string().optional(),
286
- height: z2.string().optional(),
287
- scale: z2.number().optional()
288
- }).optional(),
289
- background: z2.string().optional(),
290
- glyph: z2.object({
291
- color: z2.string().optional(),
292
- url: z2.string().url().optional(),
293
- icon: z2.string().optional()
294
- }).optional(),
295
- borderColor: z2.string().optional(),
296
- scale: z2.number().optional()
297
- });
298
- var FormatDateString = z2.custom((val) => /^\d{4}-\d{2}-\d{2}$/.test(val), {
299
- message: "Date must be in 'YYYY-MM-DD' format"
300
- });
301
- var AffixSlot = z2.object({
302
- text: z2.string().optional(),
303
- icon: z2.string().optional()
304
- });
305
- var Field = z2.object({
306
- name: z2.string().nonempty(),
307
- label: z2.string().optional(),
308
- value: z2.union([FieldValue, z2.array(FieldValue)]).optional(),
309
- type: FieldType,
310
- component: z2.enum([
311
- "input",
312
- "textarea",
313
- "select",
314
- "radio",
315
- "checkbox",
316
- "switch",
317
- "rating",
318
- "carousel",
319
- "button",
320
- "label",
321
- "map",
322
- "calendar"
323
- ]).optional(),
324
- disabled: z2.boolean().optional(),
325
- readonly: z2.boolean().optional(),
326
- multiple: z2.boolean().optional(),
327
- placeholder: z2.string().optional(),
328
- options: z2.array(
329
- z2.object({
330
- label: z2.string().nonempty(),
331
- value: FieldValue.optional(),
332
- image: z2.string().url().optional(),
333
- description: z2.string().optional(),
334
- disabled: z2.boolean().optional()
335
- })
336
- ).optional(),
337
- required: z2.boolean().optional(),
338
- configuration: z2.object({
339
- input: z2.object({
340
- min: z2.number().optional(),
341
- max: z2.number().optional(),
342
- step: z2.number().optional(),
343
- pattern: z2.string().refine((val) => {
344
- try {
345
- new RegExp(val);
346
- return true;
347
- } catch {
348
- return false;
349
- }
350
- }, "Invalid regex pattern").optional(),
351
- minLength: z2.number().optional(),
352
- maxLength: z2.number().optional(),
353
- exactLength: z2.number().optional(),
354
- prefix: z2.object({
355
- default: AffixSlot.optional(),
356
- success: AffixSlot.optional(),
357
- error: AffixSlot.optional()
358
- }).optional(),
359
- suffix: z2.object({
360
- default: AffixSlot.optional(),
361
- success: AffixSlot.optional(),
362
- error: AffixSlot.optional()
363
- }).optional(),
364
- clearable: z2.boolean().optional(),
365
- floatingLabel: z2.boolean().optional()
366
- }).optional(),
367
- textarea: z2.object({
368
- rows: z2.number().optional()
369
- }).optional(),
370
- checkbox: z2.object({
371
- layout: z2.enum(["horizontal", "vertical"])
372
- }).optional(),
373
- rating: z2.object({
374
- icons: z2.array(z2.string()).optional(),
375
- color: z2.string().optional(),
376
- precision: z2.number().optional()
377
- }).optional(),
378
- map: z2.object({
379
- apiKey: z2.string().optional(),
380
- region: z2.string().length(2).optional(),
381
- center: z2.object({
382
- lat: z2.number().min(-90).max(90),
383
- lng: z2.number().min(-180).max(180)
384
- }).optional(),
385
- showMap: z2.enum(["always", "on-search"]).optional(),
386
- zoom: z2.object({
387
- initial: z2.number().optional(),
388
- focus: z2.number().optional(),
389
- max: z2.number().optional(),
390
- min: z2.number().optional()
391
- }).optional(),
392
- controls: z2.object({
393
- fullscreen: z2.boolean().optional(),
394
- mapType: z2.boolean().optional(),
395
- zoom: z2.boolean().optional(),
396
- rotate: z2.boolean().optional(),
397
- scale: z2.boolean().optional(),
398
- streetView: z2.boolean().optional()
399
- }).optional(),
400
- initialLocations: z2.number().optional(),
401
- maxLocations: z2.number().optional(),
402
- distanceUnit: z2.enum(["km", "mi"]).optional(),
403
- distanceFormat: z2.enum(["short", "long"]).optional(),
404
- options: z2.object({
405
- show: z2.enum(["always", "on-search", "never"]).optional(),
406
- component: z2.enum(["list-button", "list-radio", "carousel"]).optional(),
407
- searchLabel: z2.string().optional(),
408
- detailsLabel: z2.string().optional()
409
- }).optional(),
410
- search: z2.object({
411
- value: z2.string().optional(),
412
- button: z2.object({
413
- label: z2.string().optional(),
414
- position: z2.enum(["inside", "outside"]).optional()
415
- }).optional(),
416
- placeholder: z2.string().optional(),
417
- noResultsText: z2.string().optional(),
418
- autocomplete: z2.boolean().optional(),
419
- clearable: z2.boolean().optional(),
420
- mode: z2.enum(["address", "postcode"]).optional(),
421
- showLocationButton: z2.boolean().optional(),
422
- locationButton: z2.object({
423
- icon: z2.string().optional(),
424
- position: z2.enum(["left", "right"]).optional()
425
- }).optional()
426
- }).optional(),
427
- distanceRange: z2.object({
428
- initial: z2.number().optional(),
429
- min: z2.number().optional(),
430
- max: z2.number().optional(),
431
- step: z2.number().optional()
432
- }).optional(),
433
- mapRegion: z2.object({
434
- strokeColor: z2.string().optional(),
435
- fillColor: z2.string().optional(),
436
- fillOpacity: z2.number().optional()
437
- }).optional(),
438
- locationPin: MapPin.optional(),
439
- markerPin: z2.object({
440
- default: MapPin.optional(),
441
- hover: MapPin.optional(),
442
- selected: MapPin.optional()
443
- }).optional(),
444
- infoWindow: z2.object({
445
- button: z2.object({
446
- label: z2.string(),
447
- action: z2.string()
448
- }).optional()
449
- }).optional()
450
- }).optional(),
451
- calendar: z2.object({
452
- current: z2.object({
453
- month: z2.number().min(0).max(11).optional(),
454
- year: z2.number().optional()
455
- }).optional(),
456
- range: z2.object({
457
- min: FormatDateString.optional(),
458
- max: FormatDateString.optional(),
459
- enabled: z2.array(FormatDateString).optional(),
460
- disabled: z2.array(FormatDateString).optional()
461
- }).optional(),
462
- time: z2.object({
463
- label: z2.string().optional(),
464
- format: z2.enum(["12h", "24h"]).optional(),
465
- component: z2.enum(["carousel", "list"]).optional()
466
- }).optional(),
467
- api: z2.object({
468
- url: z2.string().url().nonempty(),
469
- organizationId: z2.string().nonempty(),
470
- availability: z2.object({
471
- filters: GetAvailabilityFilters,
472
- options: GetAvailabilityOptions.optional()
473
- }).optional()
474
- }).optional()
475
- }).optional()
476
- }).optional(),
477
- dependsOn: z2.array(
478
- z2.object({
479
- fieldName: z2.string().nonempty(),
480
- value: FieldValue.optional()
481
- })
482
- ).optional(),
483
- dependentBehavior: z2.enum(["hidden", "disabled"]).optional(),
484
- customError: z2.object({
485
- required: z2.string().optional(),
486
- invalid: z2.string().optional(),
487
- minLength: z2.string().optional(),
488
- maxLength: z2.string().optional(),
489
- minValue: z2.string().optional(),
490
- maxValue: z2.string().optional(),
491
- mismatch: z2.string().optional()
492
- }).optional()
493
- });
494
- var ActionScript = z2.object({
495
- src: z2.string().url(),
496
- preload: z2.boolean().optional(),
497
- name: z2.string().nonempty(),
498
- function: z2.string().nonempty(),
499
- params: z2.record(z2.string(), z2.any()).optional()
500
- });
501
- var ActionEvent = z2.object({
502
- name: z2.enum(["organization_call", "close_panel"]),
503
- params: z2.record(z2.string(), z2.any()).optional()
504
- });
505
- var Action = z2.object({
506
- id: z2.string().nonempty(),
507
- type: z2.enum(["submit", "navigate", "link", "back", "dispatcher", "script"]),
508
- label: z2.string().nonempty(),
509
- variant: z2.enum(["primary", "secondary", "success", "danger", "warning", "info"]),
510
- url: z2.string().url().optional(),
511
- scripts: ActionScript.array().optional(),
512
- events: ActionEvent.array().optional()
513
- });
514
- var ErrorCode = z2.enum([
515
- "INVALID_DATA",
516
- "INVALID_ACTION",
517
- "STEP_NOT_FOUND",
518
- "UNKNOWN_ERROR",
519
- "APPOINTMENT_INVALID_DATA",
520
- "APPOINTMENT_BUSY_SLOT",
521
- "APPOINTMENT_OUT_OF_DATE",
522
- "APPOINTMENT_UNKNOWN_ERROR",
523
- "LEAD_INVALID_DATA",
524
- "LEAD_UNKNOWN_ERROR",
525
- "CONTENT_INVALID_DATA",
526
- "CONTENT_UNKNOWN_ERROR",
527
- "CONTACT_INVALID_DATA",
528
- "CONTACT_UNKNOWN_ERROR",
529
- "LOST_OPPORTUNITY_INVALID_DATA",
530
- "LOST_OPPORTUNITY_UNKNOWN_ERROR"
531
- ]);
532
- var PostAction = z2.object({
533
- type: z2.enum(["redirect"]),
534
- params: z2.record(z2.string(), z2.any()).optional()
535
- });
536
- var Step = z2.object({
537
- id: z2.string().nonempty(),
538
- title: z2.string().optional(),
539
- description: z2.string().optional(),
540
- stageId: z2.string().optional(),
541
- state: z2.record(z2.string(), z2.any()).optional(),
542
- fields: z2.array(Field).optional(),
543
- actions: z2.array(Action).optional(),
544
- result: z2.object({
545
- postActions: z2.array(PostAction).optional(),
546
- pipelines: z2.array(z2.object({ name: z2.string(), data: z2.object({}) })).optional(),
547
- tracking: z2.record(z2.string(), z2.any()).optional()
548
- }).optional(),
549
- error: z2.object({
550
- code: ErrorCode,
551
- message: z2.string().optional(),
552
- fields: z2.array(
553
- z2.object({
554
- name: z2.string(),
555
- type: FieldType,
556
- value: z2.any(),
557
- error: z2.string()
558
- })
559
- ).optional()
560
- }).optional(),
561
- isFinal: z2.boolean().optional()
562
- });
563
- var Flow = z2.object({
564
- id: z2.string().length(24).nonempty(),
565
- organizationId: z2.string().uuid().nonempty(),
566
- updatedAt: z2.string().datetime().nonempty(),
567
- stages: z2.array(
568
- z2.object({
569
- id: z2.string().nonempty(),
570
- name: z2.string().nonempty()
571
- })
572
- )
573
- });
574
- var FlowContext = z2.object({
575
- status: z2.enum(["ok", "error"]),
576
- step: Step,
577
- flow: Flow
578
- });
579
- var EventType = z2.enum(["track"]);
580
-
581
- // client/client.service.ts
582
- var FlowClient = class {
583
- /**
584
- * Creates a new FlowClient instance.
585
- * @param _options - Configuration options for the client
586
- */
587
- constructor(_options) {
588
- /**
589
- * The base URL for API requests.
590
- */
591
- __publicField(this, "baseURL");
592
- /**
593
- * HTTP headers to be sent with each request.
594
- */
595
- __publicField(this, "headers");
596
- /**
597
- * The unique identifier of the flow.
598
- */
599
- __publicField(this, "flowId");
600
- /**
601
- * Service for tracking user interactions and events.
602
- * Only available if tracking is enabled in the options.
603
- */
604
- __publicField(this, "tracking");
605
- const options = merge2(
606
- {},
607
- DEFAULT_CLIENT_OPTIONS,
608
- ClientOptions.parse(_options)
609
- );
610
- this.flowId = options.flowId;
611
- this.baseURL = options.baseUrl;
612
- this.headers = new Headers({
613
- "Content-Type": "application/json",
614
- "X-Onlive-Organization-Id": options.organizationId,
615
- "X-Lang": options.lang
616
- });
617
- if (options.tracking?.enabled) {
618
- this.tracking = new tracking_service_default(
619
- options.organizationId,
620
- options.flowId,
621
- options.tracking,
622
- !!options.devMode
623
- );
624
- }
625
- }
626
- /**
627
- * Sends an HTTP request to the specified path and returns the response as a JSON object.
628
- *
629
- * @template T - The expected response type.
630
- * @param {string} path - The path to which the request is sent.
631
- * @param {RequestInit} [options={}] - Optional configuration for the request.
632
- * @returns {Promise<T>} - A promise that resolves to the response data.
633
- * @throws {Error} - Throws an error if the response status is not ok.
634
- */
635
- async request(path, options = {}) {
636
- const response = await fetch(`${this.baseURL}/${path}`, {
637
- ...options,
638
- headers: this.headers
639
- });
640
- if (!response?.ok) {
641
- throw new Error(`HTTP error! status: ${response?.status || "unknown"}`);
642
- }
643
- return response.json();
644
- }
645
- /**
646
- * Initiates the first step of the flow process.
647
- *
648
- * @param {GetStepOptions} options - Optional parameters for getting the step.
649
- * @returns {Promise<FlowContext>} A promise that resolves to the flow context.
650
- */
651
- async firstStep(options = {}) {
652
- this.tracking?.analyzeRequest({}, options);
653
- const preferences = this.tracking?.preferences();
654
- const flowContext = await this.request(`flow/${this.flowId}/first-step`, {
655
- method: "POST",
656
- body: JSON.stringify(
657
- GetStepOptions.parse({
658
- ...options,
659
- state: {
660
- preferences,
661
- ...options.state
662
- }
663
- })
664
- )
665
- });
666
- this.tracking?.analyzeResponse({}, flowContext);
667
- return flowContext;
668
- }
669
- /**
670
- * Retrieves a specific step in the flow based on the provided step ID.
671
- *
672
- * @param {string} stepId - The unique identifier of the step to retrieve.
673
- * @param {GetStepOptions} options - Optional parameters for customizing the step request.
674
- * @returns {Promise<FlowContext>} A promise that resolves to the flow context containing the requested step information.
675
- * @throws {Error} If the step ID is invalid or the step cannot be found.
676
- */
677
- async getStep(stepId, options = {}) {
678
- this.tracking?.analyzeRequest({ stepId }, options);
679
- const preferences = this.tracking?.preferences();
680
- const flowContext = await this.request(
681
- `flow/${this.flowId}/steps/${StepId.parse(stepId)}`,
682
- {
683
- method: "POST",
684
- body: JSON.stringify(
685
- GetStepOptions.parse({
686
- ...options,
687
- state: {
688
- preferences,
689
- ...options.state
690
- }
691
- })
692
- )
693
- }
694
- );
695
- this.tracking?.analyzeResponse({ stepId }, flowContext);
696
- return flowContext;
697
- }
698
- /**
699
- * Advances to the next step in the flow based on the provided trigger action.
700
- *
701
- * @param {GetStepTrigger} trigger - Contains the current step ID and action ID to determine the next step.
702
- * @param {GetStepOptions} options - Optional parameters to customize the step transition.
703
- * @returns {Promise<FlowContext>} A promise that resolves to the updated flow context containing the next step information.
704
- * @throws {Error} If the action is invalid or the next step cannot be determined.
705
- */
706
- async nextStep(trigger, options = {}) {
707
- this.tracking?.analyzeRequest(trigger, options);
708
- const { currentStepId, actionId } = GetStepTrigger.parse(trigger);
709
- const flowContext = await this.request(
710
- `flow/${this.flowId}/steps/${currentStepId}/action/${actionId}`,
711
- {
712
- method: "POST",
713
- body: JSON.stringify(GetStepOptions.parse(options))
714
- }
715
- );
716
- this.tracking?.analyzeResponse(trigger, flowContext);
717
- return flowContext;
718
- }
719
- };
720
- var client_service_default = FlowClient;
721
- export {
722
- FlowClient,
723
- client_service_default as default
724
- };
1
+ /*! @onlive.ai/flow-client v0.1.40 | © 2025 onlive.ai */
2
+ var I=Object.defineProperty;var k=(a,o,e)=>o in a?I(a,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[o]=e;var r=(a,o,e)=>k(a,typeof o!="symbol"?o+"":o,e);import{merge as q}from"@onlive.ai/common-121/utils/merge.js";import{Session as d,Tracker as S}from"@onlive.ai/tracker";import{merge as j}from"@onlive.ai/common-121/utils/merge.js";import{browserPreferences as A}from"@onlive.ai/common-121/utils/browser-preferences.js";import{z as i}from"zod";var c="flow_form",v="onlive-analytics-event",m=i.object({enabled:i.boolean().default(!1).optional(),data:i.custom().optional(),removeExtraneousValues:i.boolean().default(!0).optional(),allowBotTraffic:i.boolean().default(!1).optional(),adapters:i.array(i.string()).default([]).optional(),apiUrl:i.string().url().optional(),emitters:i.object({windowEvent:i.boolean().optional(),dataLayer:i.boolean().optional(),windowPostMessage:i.boolean().optional()}).optional()});var f=class{constructor(o,e,n,p){r(this,"options");r(this,"tracker");r(this,"eventListeners",[]);this.options=m.parse(n),this.tracker=new S({apiUrl:this.options.apiUrl,removeExtraneousValues:this.options.removeExtraneousValues,allowBotTraffic:this.options.allowBotTraffic,adapters:this.options.adapters,dryRun:p}),this.tracker.setBase(j({},{organization_id:o,page_url:window.location.href,page_referrer:document.referrer,origin_medium:"web",guest_id:d.id,interaction_id:d.interactionId,extra:{flow_id:e}},this.options.data)),window.addEventListener(v,({detail:l})=>this.emit(l.event,l.data))}getTracker(){return this.tracker}preferences(){return{...A(),interactionId:d.interactionId,guestId:d.id}}analyzeRequest(o,e){"currentStepId"in o&&(o.actionId&&this.tracker.send("element_click",{element_label:o.actionId,element_type:"button",form_name:Object.keys(e.fields||{}).length?c:void 0,step_name:o.currentStepId}),e.fields&&this.tracker.send("form_submit",{form_name:c,form_data:e.fields,step_name:o.currentStepId}))}analyzeResponse(o,e){"currentStepId"in o&&(e.step.result?.pipelines&&e.step.result.pipelines.forEach(n=>{this.tracker.send("task_success",{task_name:n.name,task_data:n.data,step_name:e.step.id})}),e.step.error&&this.tracker.send("form_error",{form_name:c,form_error:e.step.error.code,step_name:e.step.id})),this.tracker.send("impression",{impression_type:"step",form_name:void 0,step_name:e.step.id,step_initial:!("currentStepId"in o)||void 0,step_final:e.step.isFinal}),this.tracker.setBase({form_name:c,step_name:e.step.id,step_initial:!("currentStepId"in o)||void 0,step_final:e.step.isFinal,...e.step.result?.tracking})}send(o,e){this.tracker.send(o,e)}setData(o){this.tracker.setBase(o)}onEvent(o){this.eventListeners.push(o)}emit(o,e){this.eventListeners.forEach(n=>n({event:o,data:e}))}},T=f;import{GetAvailabilityFilters as w,GetAvailabilityOptions as L}from"@onlive.ai/calendar";import{z as t}from"zod";var _={tracking:{removeExtraneousValues:!0,apiUrl:"https://srvless.onlive.site/tracking",data:{widget_type:"OnliveAppFlow"}}},x=t.string().nonempty(),O=t.object({baseUrl:t.string().url().nonempty(),flowId:t.string().length(24).nonempty(),organizationId:t.string().uuid().nonempty(),lang:t.string().length(2).nonempty(),tracking:m.optional(),devMode:t.boolean().default(!1).optional()}),y=t.object({state:t.record(t.string(),t.any()).optional(),fields:t.record(t.string(),t.any()).optional()}),E=t.object({currentStepId:t.string().nonempty(),actionId:t.string().nonempty()}),N=t.enum(["text","boolean","number","email","phone","mobile_phone","date","time","datetime","password","url","color","object","void","location","availability"]),D=t.object({name:t.string(),value:t.string().optional(),icon:t.string().optional(),type:t.enum(["url","email","phone"]).optional()}),z=t.object({lat:t.number().min(-90).max(90),lng:t.number().min(-180).max(180),meta:t.record(t.string(),t.any()).optional(),properties:t.record(t.string(),D).optional(),attributes:t.record(t.string(),t.any()).optional()}),P=t.object({datetime:t.string().datetime(),meta:t.record(t.string(),t.any()).optional()}),u=t.union([t.string(),t.number(),t.boolean(),z,P]),g=t.object({content:t.object({icon:t.string().optional(),url:t.string().url().optional(),width:t.string().optional(),height:t.string().optional(),scale:t.number().optional()}).optional(),background:t.string().optional(),glyph:t.object({color:t.string().optional(),url:t.string().url().optional(),icon:t.string().optional()}).optional(),borderColor:t.string().optional(),scale:t.number().optional()}),b=t.custom(a=>/^\d{4}-\d{2}-\d{2}$/.test(a),{message:"Date must be in 'YYYY-MM-DD' format"}),s=t.object({text:t.string().optional(),icon:t.string().optional()}),R=t.object({name:t.string().nonempty(),label:t.string().optional(),value:t.union([u,t.array(u)]).optional(),type:N,component:t.enum(["input","textarea","select","radio","checkbox","switch","rating","carousel","button","label","map","calendar"]).optional(),disabled:t.boolean().optional(),readonly:t.boolean().optional(),multiple:t.boolean().optional(),placeholder:t.string().optional(),options:t.array(t.object({label:t.string().nonempty(),value:u.optional(),image:t.string().url().optional(),description:t.string().optional(),disabled:t.boolean().optional()})).optional(),required:t.boolean().optional(),configuration:t.object({input:t.object({min:t.number().optional(),max:t.number().optional(),step:t.number().optional(),pattern:t.string().refine(a=>{try{return new RegExp(a),!0}catch{return!1}},"Invalid regex pattern").optional(),minLength:t.number().optional(),maxLength:t.number().optional(),exactLength:t.number().optional(),prefix:t.object({default:s.optional(),success:s.optional(),error:s.optional()}).optional(),suffix:t.object({default:s.optional(),success:s.optional(),error:s.optional()}).optional(),clearable:t.boolean().optional(),floatingLabel:t.boolean().optional()}).optional(),textarea:t.object({rows:t.number().optional()}).optional(),checkbox:t.object({layout:t.enum(["horizontal","vertical"])}).optional(),rating:t.object({icons:t.array(t.string()).optional(),color:t.string().optional(),precision:t.number().optional()}).optional(),map:t.object({apiKey:t.string().optional(),region:t.string().length(2).optional(),center:t.object({lat:t.number().min(-90).max(90),lng:t.number().min(-180).max(180)}).optional(),showMap:t.enum(["always","on-search"]).optional(),zoom:t.object({initial:t.number().optional(),focus:t.number().optional(),max:t.number().optional(),min:t.number().optional()}).optional(),controls:t.object({fullscreen:t.boolean().optional(),mapType:t.boolean().optional(),zoom:t.boolean().optional(),rotate:t.boolean().optional(),scale:t.boolean().optional(),streetView:t.boolean().optional()}).optional(),initialLocations:t.number().optional(),maxLocations:t.number().optional(),distanceUnit:t.enum(["km","mi"]).optional(),distanceFormat:t.enum(["short","long"]).optional(),options:t.object({show:t.enum(["always","on-search","never"]).optional(),component:t.enum(["list-button","list-radio","carousel"]).optional(),searchLabel:t.string().optional(),detailsLabel:t.string().optional()}).optional(),search:t.object({value:t.string().optional(),button:t.object({label:t.string().optional(),position:t.enum(["inside","outside"]).optional()}).optional(),placeholder:t.string().optional(),noResultsText:t.string().optional(),autocomplete:t.boolean().optional(),clearable:t.boolean().optional(),mode:t.enum(["address","postcode"]).optional(),showLocationButton:t.boolean().optional(),locationButton:t.object({icon:t.string().optional(),position:t.enum(["left","right"]).optional()}).optional()}).optional(),distanceRange:t.object({initial:t.number().optional(),min:t.number().optional(),max:t.number().optional(),step:t.number().optional()}).optional(),mapRegion:t.object({strokeColor:t.string().optional(),fillColor:t.string().optional(),fillOpacity:t.number().optional()}).optional(),locationPin:g.optional(),markerPin:t.object({default:g.optional(),hover:g.optional(),selected:g.optional()}).optional(),infoWindow:t.object({button:t.object({label:t.string(),action:t.string()}).optional()}).optional()}).optional(),calendar:t.object({current:t.object({month:t.number().min(0).max(11).optional(),year:t.number().optional()}).optional(),range:t.object({min:b.optional(),max:b.optional(),enabled:t.array(b).optional(),disabled:t.array(b).optional()}).optional(),time:t.object({label:t.string().optional(),format:t.enum(["12h","24h"]).optional(),component:t.enum(["carousel","list"]).optional()}).optional(),api:t.object({url:t.string().url().nonempty(),organizationId:t.string().nonempty(),availability:t.object({filters:w,options:L.optional()}).optional()}).optional()}).optional()}).optional(),dependsOn:t.array(t.object({fieldName:t.string().nonempty(),value:u.optional()})).optional(),dependentBehavior:t.enum(["hidden","disabled"]).optional(),customError:t.object({required:t.string().optional(),invalid:t.string().optional(),minLength:t.string().optional(),maxLength:t.string().optional(),minValue:t.string().optional(),maxValue:t.string().optional(),mismatch:t.string().optional()}).optional()}),F=t.object({src:t.string().url(),preload:t.boolean().optional(),name:t.string().nonempty(),function:t.string().nonempty(),params:t.record(t.string(),t.any()).optional()}),C=t.object({name:t.enum(["organization_call","close_panel"]),params:t.record(t.string(),t.any()).optional()}),U=t.object({id:t.string().nonempty(),type:t.enum(["submit","navigate","link","back","dispatcher","script"]),label:t.string().nonempty(),variant:t.enum(["primary","secondary","success","danger","warning","info"]),url:t.string().url().optional(),scripts:F.array().optional(),events:C.array().optional()}),V=t.enum(["INVALID_DATA","INVALID_ACTION","STEP_NOT_FOUND","UNKNOWN_ERROR","APPOINTMENT_INVALID_DATA","APPOINTMENT_BUSY_SLOT","APPOINTMENT_OUT_OF_DATE","APPOINTMENT_UNKNOWN_ERROR","LEAD_INVALID_DATA","LEAD_UNKNOWN_ERROR","CONTENT_INVALID_DATA","CONTENT_UNKNOWN_ERROR","CONTACT_INVALID_DATA","CONTACT_UNKNOWN_ERROR","LOST_OPPORTUNITY_INVALID_DATA","LOST_OPPORTUNITY_UNKNOWN_ERROR"]),M=t.object({type:t.enum(["redirect"]),params:t.record(t.string(),t.any()).optional()}),G=t.object({id:t.string().nonempty(),title:t.string().optional(),description:t.string().optional(),stageId:t.string().optional(),state:t.record(t.string(),t.any()).optional(),fields:t.array(R).optional(),actions:t.array(U).optional(),result:t.object({postActions:t.array(M).optional(),pipelines:t.array(t.object({name:t.string(),data:t.object({})})).optional(),tracking:t.record(t.string(),t.any()).optional()}).optional(),error:t.object({code:V,message:t.string().optional(),fields:t.array(t.object({name:t.string(),type:N,value:t.any(),error:t.string()})).optional()}).optional(),isFinal:t.boolean().optional()}),$=t.object({id:t.string().length(24).nonempty(),organizationId:t.string().uuid().nonempty(),updatedAt:t.string().datetime().nonempty(),stages:t.array(t.object({id:t.string().nonempty(),name:t.string().nonempty()}))}),pt=t.object({status:t.enum(["ok","error"]),step:G,flow:$}),st=t.enum(["track"]);var h=class{constructor(o){r(this,"baseURL");r(this,"headers");r(this,"flowId");r(this,"tracking");let e=q({},_,O.parse(o));this.flowId=e.flowId,this.baseURL=e.baseUrl,this.headers=new Headers({"Content-Type":"application/json","X-Onlive-Organization-Id":e.organizationId,"X-Lang":e.lang}),e.tracking?.enabled&&(this.tracking=new T(e.organizationId,e.flowId,e.tracking,!!e.devMode))}async request(o,e={}){let n=await fetch(`${this.baseURL}/${o}`,{...e,headers:this.headers});if(!n?.ok)throw new Error(`HTTP error! status: ${n?.status||"unknown"}`);return n.json()}async firstStep(o={}){this.tracking?.analyzeRequest({},o);let e=this.tracking?.preferences(),n=await this.request(`flow/${this.flowId}/first-step`,{method:"POST",body:JSON.stringify(y.parse({...o,state:{preferences:e,...o.state}}))});return this.tracking?.analyzeResponse({},n),n}async getStep(o,e={}){this.tracking?.analyzeRequest({stepId:o},e);let n=this.tracking?.preferences(),p=await this.request(`flow/${this.flowId}/steps/${x.parse(o)}`,{method:"POST",body:JSON.stringify(y.parse({...e,state:{preferences:n,...e.state}}))});return this.tracking?.analyzeResponse({stepId:o},p),p}async nextStep(o,e={}){this.tracking?.analyzeRequest(o,e);let{currentStepId:n,actionId:p}=E.parse(o),l=await this.request(`flow/${this.flowId}/steps/${n}/action/${p}`,{method:"POST",body:JSON.stringify(y.parse(e))});return this.tracking?.analyzeResponse(o,l),l}},gt=h;export{h as FlowClient,gt as default};