@brainfish-ai/widgets-initiator 1.0.2 → 1.3.0-beta.3
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 +27 -46
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/types/api/getConfigByKey.d.ts +8 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/initBrainfishAnalytics.d.ts +1 -0
- package/dist/types/initSearchWidget.d.ts +13 -0
- package/dist/types/types/brainfish.d.ts +27 -0
- package/dist/types/utils/brainfishQueue.d.ts +11 -0
- package/dist/types/utils/configTransformer.d.ts +17 -0
- package/dist/types/utils/createQueues.d.ts +1 -0
- package/dist/types/utils/fetchWithErrorHandling.d.ts +1 -0
- package/dist/types/utils/getApiHost.d.ts +6 -0
- package/dist/types/utils/isIOS14OrBelow.d.ts +1 -0
- package/dist/types/utils/isIOS14OrBelow.test.d.ts +1 -0
- package/dist/types/utils/sendBrainfishError.d.ts +1 -0
- package/dist/types/utils/sendBrainfishError.test.d.ts +1 -0
- package/dist/types/utils/sendErrors.d.ts +2 -0
- package/dist/types/utils/supportsESModules.d.ts +1 -0
- package/dist/types/utils/supportsESModules.test.d.ts +1 -0
- package/dist/types/web.d.ts +5 -0
- package/dist/web.cjs.js +2 -1
- package/dist/web.cjs.js.map +1 -1
- package/dist/web.js +221 -1
- package/dist/web.js.map +1 -1
- package/package.json +28 -28
- package/.prettierignore +0 -7
- package/.prettierrc +0 -6
- package/build-test-pages/brainfish-wrapper.html +0 -64
- package/index.html +0 -63
- package/postcss.config.cjs +0 -6
- package/src/register.ts +0 -31
- package/src/web.ts +0 -156
- package/tailwind.config.cjs +0 -9
- package/tsconfig.json +0 -14
- package/vite.config.ts +0 -33
package/README.md
CHANGED
|
@@ -1,61 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Brainfish In-App Widget
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This package provides a simple way to integrate a Brainfish in-app widget in your website or web application. It supports the standard style, and slide-in popup.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
Those templates dependencies are maintained via [pnpm](https://pnpm.io) via `pnpm up -Lri`.
|
|
8
|
-
|
|
9
|
-
This is the reason you see a `pnpm-lock.yaml`. That being said, any package manager will work. This file can be safely be removed once you clone a template.
|
|
5
|
+
## Installation
|
|
10
6
|
|
|
11
7
|
```bash
|
|
12
|
-
|
|
8
|
+
npm install @branfish-ai/web-widget
|
|
13
9
|
```
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
In the project directory, you can run:
|
|
18
|
-
|
|
19
|
-
### `npm dev` or `npm start`
|
|
20
|
-
|
|
21
|
-
Runs the app in the development mode.<br>
|
|
22
|
-
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
|
23
|
-
|
|
24
|
-
The page will reload if you make edits.<br>
|
|
25
|
-
|
|
26
|
-
### `npm run build`
|
|
11
|
+
### Directly in your HTML
|
|
27
12
|
|
|
28
|
-
Builds the app for production to the `dist` folder.<br>
|
|
29
|
-
It correctly bundles Solid in production mode and optimizes the build for the best performance.
|
|
30
13
|
|
|
31
|
-
|
|
32
|
-
|
|
14
|
+
```html
|
|
15
|
+
<script type="module">
|
|
16
|
+
import Brainfish from "https://cdn.jsdelivr.net/npm/@brainfish-ai/web-widget@latest/dist/web.js"
|
|
17
|
+
Brainfish.Widgets.init({ widgetKey: "your-key" });
|
|
18
|
+
</script>
|
|
33
19
|
|
|
34
|
-
## Deployment
|
|
35
20
|
|
|
36
|
-
|
|
21
|
+
<button class="brainfish-trigger-button" onClick="Brainfish.HelpWidget.open('brainfish-trigger-button')">Help</button>
|
|
37
22
|
|
|
23
|
+
<!-- The widget will emit events when it opens and closes. You can listen to these events by adding the following code to your website: -->
|
|
38
24
|
|
|
39
|
-
|
|
25
|
+
<script>
|
|
26
|
+
// set up the abort controller
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
// get the signal
|
|
29
|
+
const { signal } = controller;
|
|
40
30
|
|
|
41
|
-
|
|
31
|
+
// For close event: (onBrainfishHelpWidgetClosed)
|
|
32
|
+
window.addEventListener('onBrainfishHelpWidgetClosed', yourClosedHandlerFunction, { signal });
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
// For opened event: (onBrainfishHelpWidgetOpened)
|
|
35
|
+
window.addEventListener('onBrainfishHelpWidgetOpened', yourOpenedHandlerFunction, { signal });
|
|
36
|
+
</script>
|
|
44
37
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
### `npm run build`
|
|
51
|
-
|
|
52
|
-
Builds the app for production to the `dist` folder.<br>
|
|
53
|
-
It correctly bundles Solid in production mode and optimizes the build for the best performance.
|
|
54
|
-
|
|
55
|
-
The build is minified and the filenames include the hashes.<br>
|
|
56
|
-
Your app is ready to be deployed!
|
|
57
|
-
|
|
58
|
-
## Deployment
|
|
59
|
-
|
|
60
|
-
You can deploy the `dist` folder to any static host provider (netlify, surge, now, etc.)
|
|
61
|
-
# brainfish-widgets
|
|
38
|
+
<script>
|
|
39
|
+
// abort the event listeners when the widget is no longer needed
|
|
40
|
+
controller.abort();
|
|
41
|
+
</script>
|
|
42
|
+
```
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(function(){try{var e=typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="33855e45-5b53-4ae5-baa0-8338003b01cf",e._sentryDebugIdIdentifier="sentry-dbid-33855e45-5b53-4ae5-baa0-8338003b01cf")}catch(a){}})(),Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("./web.cjs.js");exports.BrainfishAnalytics=t.BrainfishAnalytics,exports.default=t.default;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BrainfishAnalytics as t, default as r } from "./web.js";
|
|
2
|
+
(function() {
|
|
3
|
+
try {
|
|
4
|
+
var e = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {}, a = new e.Error().stack;
|
|
5
|
+
a && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[a] = "7e7431ab-4824-42cc-8d1a-477faa64f6a0", e._sentryDebugIdIdentifier = "sentry-dbid-7e7431ab-4824-42cc-8d1a-477faa64f6a0");
|
|
6
|
+
} catch (d) {
|
|
7
|
+
}
|
|
8
|
+
})();
|
|
9
|
+
export {
|
|
10
|
+
t as BrainfishAnalytics,
|
|
11
|
+
r as default
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const initBrainfishAnalytics: (widgetKey: string, accessKey: string, apiHost: string, analyticsApiHost?: string) => Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Config } from '@brainfish-ai/widgets-common';
|
|
2
|
+
import type { Brainfish } from './types/brainfish';
|
|
3
|
+
export declare const init: ({ apiHost, widgetKey, version, }: {
|
|
4
|
+
apiHost: string;
|
|
5
|
+
widgetKey: string;
|
|
6
|
+
version: string;
|
|
7
|
+
}) => Promise<{
|
|
8
|
+
widget: any;
|
|
9
|
+
} | undefined>;
|
|
10
|
+
export declare const initSearchWidget: (options: {
|
|
11
|
+
widgetKey: string;
|
|
12
|
+
overrides?: any;
|
|
13
|
+
}, config: Config) => Promise<Brainfish | undefined>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Config, Settings } from '@brainfish-ai/widgets-common';
|
|
2
|
+
export type Brainfish = {
|
|
3
|
+
Widgets: {
|
|
4
|
+
init: ({ widgetKey, overrides, }: {
|
|
5
|
+
widgetKey: string;
|
|
6
|
+
overrides?: Pick<Settings, 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'>;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
SearchWidget: {
|
|
10
|
+
initStandard: (config: Config) => void;
|
|
11
|
+
};
|
|
12
|
+
HelpWidget: {
|
|
13
|
+
initPopup: (config: Config) => void;
|
|
14
|
+
close: (trigger?: string) => void;
|
|
15
|
+
open: (trigger?: string) => void;
|
|
16
|
+
toggle: (trigger?: string) => void;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
declare global {
|
|
20
|
+
interface Window {
|
|
21
|
+
Brainfish: Brainfish;
|
|
22
|
+
BrainfishAnalytics: {
|
|
23
|
+
q?: [string, ...any[]][];
|
|
24
|
+
(method: string, ...args: any[]): void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Brainfish } from '../types/brainfish';
|
|
2
|
+
export interface BrainfishQueue extends Brainfish {
|
|
3
|
+
_setRealBrainfish: (bf: Brainfish) => void;
|
|
4
|
+
Widgets: {
|
|
5
|
+
init: (options: {
|
|
6
|
+
widgetKey: string;
|
|
7
|
+
overrides?: any;
|
|
8
|
+
}) => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function createBrainfishQueue(): BrainfishQueue;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Config, CallbackAction, Action } from '@brainfish-ai/widgets-common';
|
|
2
|
+
export declare const updateActions: (configActions: (Action | CallbackAction)[] | undefined, overrideActions: (Action | CallbackAction)[]) => (CallbackAction | Action)[];
|
|
3
|
+
export declare const transformConfig: ({ config, apiKey, apiHost, }: {
|
|
4
|
+
config: Config;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
apiHost: string;
|
|
7
|
+
}) => {
|
|
8
|
+
settings: import("@brainfish-ai/widgets-common").Settings;
|
|
9
|
+
apiHost: string;
|
|
10
|
+
widgetMode: import("@brainfish-ai/widgets-common").WidgetType | "Search" | "slide-over";
|
|
11
|
+
apiKey: string;
|
|
12
|
+
theme?: import("@brainfish-ai/widgets-common").Theme;
|
|
13
|
+
version?: string;
|
|
14
|
+
language?: string;
|
|
15
|
+
widgetType: import("@brainfish-ai/widgets-common").WidgetType | "Search" | "slide-over";
|
|
16
|
+
trackingToken?: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createQueues: () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function fetchWithErrorHandling(apiHost: string, endpoint: string, widgetKey: string): Promise<any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isIOS14OrBelow: () => boolean | null | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const sendBrainfishWidgetError: (apiHost: string, error: unknown, message: string, widgetKey: string) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const supportsESModules: () => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/web.cjs.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var C=Object.defineProperty,I=Object.defineProperties;var N=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var L=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var p=(t,n,s)=>n in t?C(t,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[n]=s,m=(t,n)=>{for(var s in n||(n={}))L.call(n,s)&&p(t,s,n[s]);if(B)for(var s of B(n))_.call(n,s)&&p(t,s,n[s]);return t},b=(t,n)=>I(t,N(n));var K=(t,n,s)=>p(t,typeof n!="symbol"?n+"":n,s);var f=(t,n,s)=>new Promise((d,i)=>{var r=c=>{try{a(s.next(c))}catch(o){i(o)}},e=c=>{try{a(s.throw(c))}catch(o){i(o)}},a=c=>c.done?d(c.value):Promise.resolve(c.value).then(r,e);a((s=s.apply(t,n)).next())});var w,A;(function(){try{var t=typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},n=new t.Error().stack;n&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[n]="5bbba469-c7ed-47c8-a25f-cdbc24bb7d2a",t._sentryDebugIdIdentifier="sentry-dbid-5bbba469-c7ed-47c8-a25f-cdbc24bb7d2a")}catch(s){}})(),Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),(typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{}).SENTRY_RELEASE={id:"c36c4cf2d8ecb908e550a91798616c5171c4ad47"},function(t){t.Sidebar="sidebar",t.Searchbar="searchbar"}(w||(w={})),w.Sidebar,w.Searchbar;class E extends Error{constructor(s,d){super(s,d);K(this,"cause");this.name="BrainfishWidgetError",this.cause=d==null?void 0:d.cause,Error.captureStackTrace&&Error.captureStackTrace(this,E),this.cause instanceof Error&&this.cause.stack&&(this.stack=this.stack+`
|
|
2
|
+
Caused by: `+this.cause.stack)}toJSON(){return{name:this.name,message:this.message,stack:this.stack,cause:this.cause instanceof Error?{name:this.cause.name,message:this.cause.message,stack:this.cause.stack}:this.cause}}}(function(t){t.LINK="link",t.CALLBACK="callback",t.EMAIL="email",t.PHONE="phone"})(A||(A={}));const h=(t,n,s,d)=>{let i=s,r={};if(n instanceof Error)try{r=JSON.parse(n.message),i+=` - ${r.message||n.message}`}catch(e){i+=` - ${n.message}`}else i+=` - ${String(n)}`;((e,a,c)=>{if(!navigator||navigator.userAgent.toLowerCase().includes("headless"))return;const o=a.toJSON();fetch(`${e||"https://app.brainfi.sh"}/api/trackError.widget.create`,{method:"POST",headers:{"Content-Type":"application/json","api-key":c},body:JSON.stringify({error:`WebWidgetVersion: 1.3.0-beta.3. ${a.message}`,stack:a.stack,cause:{message:o.message,stack:o.stack,cause:o.cause}})})})(t,new E(i,{cause:r}),d)},F=t=>f(exports,null,function*(){let{widgetKey:n,apiHost:s}=t;return function(d,i,r){return f(this,null,function*(){return fetch(`${d}${i}`,{method:"POST",headers:{"Content-Type":"application/json","api-key":r}}).then(e=>{if(!e.ok)throw new Error(`API call failed with status: ${e.status}`);return e.json()}).then(e=>{if(!e)throw new Error("Error loading config: empty response");return e}).catch(e=>{h(d,e,"Error fetching config",r)})})}(s,"/api/searchWidgets.getConfigByKey",n)}),J=t=>{let{config:n,apiKey:s,apiHost:d}=t;const i=n.settings||{};return["bodyActionButtons","footerActionButtons","nextBestActions"].forEach(r=>{i[r]&&(i[r]=i[r].map(e=>e.type===A.CALLBACK&&e.value?b(m({},e),{value:new Function(`return ${e.value}`)()}):e))}),b(m({},n),{settings:i,apiHost:d,widgetMode:n.widgetType,apiKey:s})},$=t=>(t==null?void 0:t.apiHost)||"https://app.brainfi.sh",H=t=>(t==null?void 0:t.analyticsApiHost)||void 0,v=(()=>{if(typeof window=="undefined")return;const t=window.navigator.userAgent;if(!(t.match(/iPad/i)||t.match(/iPhone/i)))return!1;const n=t.match(/OS (\d+)_/i);return n&&parseInt(n[1],10)<=14})(),M=t=>f(exports,null,function*(){let{apiHost:n,widgetKey:s,version:d}=t;try{const i=`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${d}/dist/web.js`,r=v?i.replace("web.js","web.umd.js"):i;return{widget:yield(a=>f(exports,null,function*(){return document.getElementById("brainfish-widget")?window.Brainfish:new Promise((c,o)=>{const u=document.createElement("script");u.id="brainfish-widget",u.src=a,u.type=v?"text/javascript":"module",u.async=!0,u.crossOrigin="anonymous",u.onload=()=>{setTimeout(()=>{const l=window.Brainfish;l?c(l):o(new Error("Failed to load Brainfish module"))},200)},u.onerror=l=>{const g=l,j={message:`Failed to load script: ${a}`,type:g.type,fileName:g.filename,lineNumber:g.lineno,columnNumber:g.colno,error:g.error?g.error.toString():"Unknown error"};o(new Error(JSON.stringify(j)))},v||document.head.appendChild(u)})}))(r)}}catch(i){h(n,i,i.message,s)}}),T=new Set,W=(t,n)=>f(exports,null,function*(){const s=$(t.overrides);try{if(T.has(t.widgetKey))return;const d=yield M({apiHost:s,widgetKey:t.widgetKey,version:n.version||"latest"});if(d){const{widget:i}=d,r=J({config:n,apiKey:t.widgetKey,apiHost:s});return t.overrides&&n.settings&&Object.entries(t.overrides).forEach(e=>{let[a,c]=e;n.settings&&a in n.settings&&(n.settings[a]=function(){let o=arguments.length>1?arguments[1]:void 0;const u=new Map((arguments.length>0&&arguments[0]!==void 0?arguments[0]:[]).map(l=>[l.label,l]));return o.forEach(l=>u.set(l.label,l)),Array.from(u.values())}(n.settings[a],c))}),function(e,a){a.widgetType===w.Searchbar||a.widgetType==="Search"?e.SearchWidget.initStandard(a):e.HelpWidget.initPopup(a)}(i,r),T.add(t.widgetKey),i}}catch(d){h(s,d,d.message,t.widgetKey)}});let O=!1;const P=function(d,i,r){return f(this,arguments,function*(t,n,s){let e=arguments.length>3&&arguments[3]!==void 0?arguments[3]:void 0;if(n||h(s,new Error("Access key is required"),"Access key is required",t),!O)try{window.BrainfishAnalytics("init",{apiUrl:e,accessKey:n,trackScreenViews:!0,trackAttributes:!0,trackOutgoingLinks:!0}),O=!0,yield((a,c)=>f(this,null,function*(){if(document.getElementById("brainfish-analytics"))return window.BrainfishAnalytics;const o=document.createElement("script");o.id="brainfish-analytics",o.src="https://cdn.jsdelivr.net/npm/@brainfish-ai/web-tracker@latest/dist/tracker.js",o.type="module",o.async=!0,o.crossOrigin="anonymous",o.onerror=()=>{h(a,new Error(`Failed to load script: ${o.src}`),`Failed to load script: ${o.src}`,c)},document.head.appendChild(o)}))(s,t)}catch(a){h(s,a,"Failed to initialize BrainfishAnalytics",t)}})};let y=null;const S=typeof window!="undefined"&&window.Brainfish?window.Brainfish:(y||(y=function(){let t=[],n=null;function s(i,r){if(n){const e=i.split(".");let a=n;for(let o=0;o<e.length-1;o++)a=a[e[o]];const c=a[e[e.length-1]];if(typeof c=="function")return c.apply(a,r)}else t.push([i,r])}return{Widgets:{init:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("Widgets.init",r)}},SearchWidget:{initStandard:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("SearchWidget.initStandard",r)}},HelpWidget:{initPopup:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("HelpWidget.initPopup",r)},close:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("HelpWidget.close",r)},open:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("HelpWidget.open",r)},toggle:function(){for(var i=arguments.length,r=new Array(i),e=0;e<i;e++)r[e]=arguments[e];return s("HelpWidget.toggle",r)}},_setRealBrainfish:function(i){for(n=i;t.length>0;){const[r,e]=t.shift();s(r,e)}}}}(),typeof window!="undefined"&&(window.Brainfish=y)),y);let k=null;S.Widgets.init=t=>f(exports,null,function*(){var n;window&&(window.BrainfishAnalytics=window.BrainfishAnalytics||function(){for(var e=arguments.length,a=new Array(e),c=0;c<e;c++)a[c]=arguments[c];(window.BrainfishAnalytics.q=window.BrainfishAnalytics.q||[]).push(a)});const s=$(t.overrides),d=H(t.overrides),{config:i}=yield F({widgetKey:t.widgetKey,apiHost:s});k||(k=function(e,a,c,o){return f(this,null,function*(){var u;const l=[W(e,a)];(u=a.settings)!==null&&u!==void 0&&u.enableTracking&&l.push(P(e.widgetKey,a.trackingToken||"",c,o));const[g]=yield Promise.allSettled(l);g.status==="fulfilled"&&g.value&&S._setRealBrainfish(g.value)})}(t,i,s,d)),yield k;const r=[W(t,i)];if((n=i.settings)!==null&&n!==void 0&&n.enableTracking){const e=H(t.overrides);r.push(P(t.widgetKey,i.trackingToken||"",s,e))}yield Promise.allSettled(r)});exports.BrainfishAnalytics=function(){typeof window!="undefined"&&window.BrainfishAnalytics&&window.BrainfishAnalytics(...arguments)},exports.default=S;
|
|
2
3
|
//# sourceMappingURL=web.cjs.js.map
|
package/dist/web.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.cjs.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({\n widgetKey,\n overrides,\n}: {\n widgetKey: string;\n overrides?: Pick<\n Settings,\n 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'\n >;\n}) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n if (overrides) {\n const { nextBestActions, bodyActionButtons, footerActionButtons } =\n overrides;\n\n const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n ) => {\n // Create a map from the configActions array, using the action label as the key\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n\n // Update the actionMap with the overrideActions.\n // If an action with the same label already exists in the map, it will be updated.\n // If it doesn't exist, it will be added to the map.\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n\n // Convert the map back to an array and return it\n return Array.from(actionMap.values());\n };\n\n config.settings = {\n ...config.settings,\n nextBestActions: nextBestActions\n ? updateActions(config.settings?.nextBestActions, nextBestActions)\n : config.settings?.nextBestActions,\n bodyActionButtons: bodyActionButtons\n ? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)\n : config.settings?.bodyActionButtons,\n footerActionButtons: footerActionButtons\n ? updateActions(\n config.settings?.footerActionButtons,\n footerActionButtons\n )\n : config.settings?.footerActionButtons,\n };\n }\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","overrides","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","updateActions","configActions","overrideActions","actionMap","Map","label","forEach","set","Array","from","values","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"aAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCUDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyHMM,EAAY,CAChBC,QAAS,CAAEC,KA5FAC,OACXC,YACAC,gBAQM,MAAAC,EAAW,GAAGhB,qCAEdiB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWN,KAGZO,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAzDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB9B,EAClC2B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB/B,EACpC2B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkBhC,EAChC2B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGlC,IACZmC,WAAYP,EAAOQ,WACnBP,WA+BaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQf,IAEJwB,EAAUV,EAAOU,SAAW,SAElC,GAAIvB,EAAW,CACb,MAAMkB,gBAAEA,EAAAF,kBAAiBA,EAAmBC,oBAAAA,GAC1CjB,EAEIwB,EAAgB,CACpBC,EAA6C,GAC7CC,KAGA,MAAMC,EAAY,IAAIC,IACpBH,EAAcrC,KAAKC,GAAW,CAACA,EAAOwC,MAAOxC,MAS/C,OAHgBqC,EAAAI,SAASzC,GAAWsC,EAAUI,IAAI1C,EAAOwC,MAAOxC,KAGzD2C,MAAMC,KAAKN,EAAUO,SAAQ,EAGtCrB,EAAOE,SAAW,IACbF,EAAOE,SACVG,gBAAiBA,EACbM,EAAcX,EAAOE,UAAUG,gBAAiBA,GAChDL,EAAOE,UAAUG,gBACrBF,kBAAmBA,EACfQ,EAAcX,EAAOE,UAAUC,kBAAmBA,GAClDH,EAAOE,UAAUC,kBACrBC,oBAAqBA,EACjBO,EACEX,EAAOE,UAAUE,oBACjBA,GAEFJ,EAAOE,UAAUE,oBAEzB,CAGA,MAAQkB,QAASC,SAAiBC,OAChC,4DAA4Dd,iBAG9D,OAAQV,EAAOQ,YACb,KAAKiB,EAAkBtD,UACvB,IAAK,SACIoD,EAAAG,aAAaC,aAAa3B,GACjC,MACF,KAAKyB,EAAkBvD,QACvB,IAAK,aACIqD,EAAAK,WAAWC,UAAU7B,GAC5B,MACF,QACE,OACJ,IAOElB,GDvJmC,CAACA,IACd,oBAAXgD,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcjD,GAG7CgD,OAAOC,UAAY,IAAKjD,GAC3B,ECgJHkD,CAA+BlD"}
|
|
1
|
+
{"version":3,"file":"web.cjs.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/types/BrainfishWidgetError.js","../src/utils/sendErrors.ts","../src/utils/sendBrainfishError.ts","../src/api/getConfigByKey.ts","../src/utils/fetchWithErrorHandling.ts","../src/utils/configTransformer.ts","../src/utils/getApiHost.ts","../src/initSearchWidget.ts","../src/utils/isIOS14OrBelow.ts","../src/initBrainfishAnalytics.ts","../src/web.ts","../src/utils/brainfishQueue.ts","../src/utils/createQueues.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export class BrainfishWidgetError extends Error {\n cause;\n constructor(message, options) {\n super(message, options);\n this.name = 'BrainfishWidgetError';\n this.cause = options?.cause;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BrainfishWidgetError);\n }\n // Append cause stack to this error's stack if cause is an Error\n if (this.cause instanceof Error && this.cause.stack) {\n this.stack = this.stack + '\\nCaused by: ' + this.cause.stack;\n }\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n","import { BrainfishWidgetError } from '@brainfish-ai/widgets-common';\n\ndeclare const __APP_VERSION__: string;\n\nexport const sendErrors = (\n apiHost: string,\n error: BrainfishWidgetError,\n widgetKey: string\n) => {\n // only send errors if browser is not a headless browser\n if (!navigator || navigator.userAgent.toLowerCase().includes('headless')) {\n return;\n }\n\n const errorData = error.toJSON();\n const API_HOST = apiHost || import.meta.env.VITE_API_HOST;\n\n fetch(`${API_HOST}/api/trackError.widget.create`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n body: JSON.stringify({\n error: `WebWidgetVersion: ${__APP_VERSION__}. ${error.message}`,\n stack: error.stack,\n cause: {\n message: errorData.message,\n stack: errorData.stack,\n cause: errorData.cause,\n },\n }),\n });\n};\n","import { BrainfishWidgetError } from '@brainfish-ai/widgets-common';\nimport { sendErrors } from './sendErrors';\n\nexport const sendBrainfishWidgetError = (\n apiHost: string,\n error: unknown,\n message: string,\n widgetKey: string\n) => {\n let errorMessage = message;\n let errorDetails: Record<string, any> = {};\n\n if (error instanceof Error) {\n try {\n errorDetails = JSON.parse(error.message);\n errorMessage += ` - ${errorDetails.message || error.message}`;\n } catch {\n // If parsing fails, use the error message as is\n errorMessage += ` - ${error.message}`;\n }\n } else {\n errorMessage += ` - ${String(error)}`;\n }\n\n const err = new BrainfishWidgetError(errorMessage, {\n cause: errorDetails,\n });\n\n sendErrors(apiHost, err, widgetKey);\n};\n","import type { Config } from '@brainfish-ai/widgets-common';\nimport { fetchWithErrorHandling } from '../utils/fetchWithErrorHandling';\n\nexport interface ConfigResponse {\n config: Config;\n}\n\nexport const getConfigByKey = async ({\n widgetKey,\n apiHost,\n}: {\n widgetKey: string;\n apiHost: string;\n}): Promise<ConfigResponse> => {\n const endpoint = `/api/searchWidgets.getConfigByKey`;\n return fetchWithErrorHandling(apiHost, endpoint, widgetKey);\n};\n","import { sendBrainfishWidgetError } from './sendBrainfishError';\n\nexport async function fetchWithErrorHandling(\n apiHost: string,\n endpoint: string,\n widgetKey: string\n): Promise<any> {\n return fetch(`${apiHost}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => {\n if (!response.ok) {\n throw new Error(`API call failed with status: ${response.status}`);\n }\n return response.json();\n })\n .then((data) => {\n if (!data) {\n throw new Error('Error loading config: empty response');\n }\n return data;\n })\n .catch((error) => {\n sendBrainfishWidgetError(\n apiHost,\n error,\n 'Error fetching config',\n widgetKey\n );\n });\n}\n","import type {\n Config,\n CallbackAction,\n Action,\n} from '@brainfish-ai/widgets-common';\nimport { ActionType } from '@brainfish-ai/widgets-common';\n\nconst mapActionButtons = (actionButtons: (CallbackAction | Action)[]) =>\n actionButtons.map((action) =>\n action.type === ActionType.CALLBACK && action.value\n ? { ...action, value: new Function(`return ${action.value}`)() }\n : action\n );\n\nexport const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n) => {\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n return Array.from(actionMap.values());\n};\n\nexport const transformConfig = ({\n config,\n apiKey,\n apiHost,\n}: {\n config: Config;\n apiKey: string;\n apiHost: string;\n}) => {\n const settings = config.settings || {};\n (\n ['bodyActionButtons', 'footerActionButtons', 'nextBestActions'] as const\n ).forEach((key) => {\n if (settings[key]) {\n settings[key] = mapActionButtons(\n settings[key] as (CallbackAction | Action)[]\n );\n }\n });\n\n return {\n ...config,\n settings,\n apiHost,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n","export const getApiHost = (overrides?: { apiHost?: string }): string => {\n return overrides?.apiHost || import.meta.env.VITE_API_HOST;\n};\n\nexport const getAnalyticsApiHost = (overrides?: {\n analyticsApiHost?: string;\n}): string => {\n return overrides?.analyticsApiHost || import.meta.env.VITE_ANALYTICS_API_HOST;\n};\n","import type {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\nimport { WidgetType } from '@brainfish-ai/widgets-common';\nimport { isIOS14OrBelow } from './utils/isIOS14OrBelow';\nimport { sendBrainfishWidgetError } from './utils/sendBrainfishError';\nimport type { Brainfish } from './types/brainfish';\nimport { transformConfig, updateActions } from './utils/configTransformer';\nimport { getApiHost } from './utils/getApiHost';\n\nconst useUMD = isIOS14OrBelow();\n\nconst loadSearchWidgetScript = async (url: string): Promise<any> => {\n if (document.getElementById('brainfish-widget')) {\n return (window as any).Brainfish;\n }\n\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'brainfish-widget';\n script.src = url;\n script.type = useUMD ? 'text/javascript' : 'module';\n script.async = true;\n script.crossOrigin = 'anonymous';\n\n script.onload = () => {\n setTimeout(() => {\n const module = (window as any).Brainfish;\n module\n ? resolve(module)\n : reject(new Error('Failed to load Brainfish module'));\n }, 200);\n };\n\n script.onerror = (event) => {\n const errorEvent = event as ErrorEvent;\n const errorDetails = {\n message: `Failed to load script: ${url}`,\n type: errorEvent.type,\n fileName: errorEvent.filename,\n lineNumber: errorEvent.lineno,\n columnNumber: errorEvent.colno,\n error: errorEvent.error ? errorEvent.error.toString() : 'Unknown error',\n };\n reject(new Error(JSON.stringify(errorDetails)));\n };\n\n if (!useUMD) {\n document.head.appendChild(script);\n }\n });\n};\n\nexport const init = async ({\n apiHost,\n widgetKey,\n version,\n}: {\n apiHost: string;\n widgetKey: string;\n version: string;\n}) => {\n try {\n const url = `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`;\n const scriptUrl = useUMD ? url.replace('web.js', 'web.umd.js') : url;\n\n const widget = await loadSearchWidgetScript(scriptUrl);\n\n return { widget };\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n (error as Error).message,\n widgetKey\n );\n }\n};\n\nfunction initializeWidget(widget: Brainfish, config: Config) {\n if (\n config.widgetType === WidgetType.Searchbar ||\n config.widgetType === 'Search'\n ) {\n widget.SearchWidget.initStandard(config);\n } else {\n widget.HelpWidget.initPopup(config);\n }\n}\n\nconst initializedWidgets = new Set<string>();\n\nexport const initSearchWidget = async (\n options: {\n widgetKey: string;\n overrides?: any;\n },\n config: Config\n): Promise<Brainfish | undefined> => {\n const apiHost = getApiHost(options.overrides);\n\n try {\n // Check if this widget has already been initialized\n if (initializedWidgets.has(options.widgetKey)) {\n // do nothing if already initialized\n return undefined;\n }\n\n const result = await init({\n apiHost,\n widgetKey: options.widgetKey,\n version: config.version || 'latest',\n });\n if (result) {\n const { widget } = result;\n\n const transformedConfig = transformConfig({\n config,\n apiKey: options.widgetKey,\n apiHost,\n });\n\n if (options.overrides && config.settings) {\n (\n Object.entries(options.overrides) as [\n keyof Settings,\n (Action | CallbackAction)[]\n ][]\n ).forEach(([key, value]) => {\n if (config.settings && key in config.settings) {\n (config.settings[key] as (Action | CallbackAction)[]) =\n updateActions(\n config.settings[key] as (Action | CallbackAction)[],\n value\n );\n }\n });\n }\n\n initializeWidget(widget, transformedConfig);\n initializedWidgets.add(options.widgetKey);\n return widget;\n }\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n (error as Error).message,\n options.widgetKey\n );\n }\n return undefined;\n};\n","export const isIOS14OrBelow = () => {\n if (typeof window === 'undefined') return;\n const ua = window.navigator.userAgent;\n const iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);\n if (!iOS) return false;\n const version = ua.match(/OS (\\d+)_/i);\n return version && parseInt(version[1], 10) <= 14;\n};\n","import { sendBrainfishWidgetError } from './utils/sendBrainfishError';\n\nconst ANALYTICS_API_HOST = import.meta.env.VITE_ANALYTICS_API_HOST;\n\nlet isTrackerInitialized: boolean = false;\n\nconst loadTrackerScript = async (apiHost: string, widgetKey: string) => {\n if (document.getElementById('brainfish-analytics')) {\n return window.BrainfishAnalytics;\n }\n\n const script = document.createElement('script');\n script.id = 'brainfish-analytics';\n script.src = `https://cdn.jsdelivr.net/npm/@brainfish-ai/web-tracker@latest/dist/tracker.js`;\n script.type = 'module';\n script.async = true;\n script.crossOrigin = 'anonymous';\n\n script.onerror = () => {\n sendBrainfishWidgetError(\n apiHost,\n new Error(`Failed to load script: ${script.src}`),\n `Failed to load script: ${script.src}`,\n widgetKey\n );\n };\n\n document.head.appendChild(script);\n};\n\nexport const initBrainfishAnalytics = async (\n widgetKey: string,\n accessKey: string,\n apiHost: string,\n analyticsApiHost: string = ANALYTICS_API_HOST\n): Promise<void> => {\n if (!accessKey) {\n sendBrainfishWidgetError(\n apiHost,\n new Error('Access key is required'),\n 'Access key is required',\n widgetKey\n );\n }\n\n // Only reinitialize if the access key is different\n if (isTrackerInitialized) {\n return;\n }\n\n try {\n window.BrainfishAnalytics('init', {\n apiUrl: analyticsApiHost,\n accessKey,\n trackScreenViews: true,\n trackAttributes: true,\n trackOutgoingLinks: true,\n });\n\n isTrackerInitialized = true;\n\n await loadTrackerScript(apiHost, widgetKey);\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n 'Failed to initialize BrainfishAnalytics',\n widgetKey\n );\n }\n};\n","// web.ts\n// entry point for web component\nimport { Config } from '@brainfish-ai/widgets-common';\nimport { getConfigByKey } from './api/getConfigByKey';\nimport { initSearchWidget } from './initSearchWidget';\nimport { initBrainfishAnalytics } from './initBrainfishAnalytics';\nimport type { Brainfish } from './types/brainfish';\nimport { BrainfishQueue, createBrainfishQueue } from './utils/brainfishQueue';\nimport { createQueues } from './utils/createQueues';\nimport { getApiHost, getAnalyticsApiHost } from './utils/getApiHost';\n\nlet globalBrainfish: BrainfishQueue | null = null;\n\nfunction getBrainfishInstance(): BrainfishQueue {\n if (typeof window !== 'undefined' && (window as any).Brainfish) {\n return (window as any).Brainfish;\n }\n if (!globalBrainfish) {\n globalBrainfish = createBrainfishQueue();\n if (typeof window !== 'undefined') {\n (window as any).Brainfish = globalBrainfish;\n }\n }\n return globalBrainfish;\n}\n\nconst Brainfish = getBrainfishInstance();\n\nlet initializationPromise: Promise<void> | null = null;\n\nasync function initializeBrainfish(\n options: {\n widgetKey: string;\n overrides?: any;\n },\n config: Config,\n apiHost: string,\n analyticsApiHost: string\n): Promise<void> {\n const initPromises: Promise<Brainfish | undefined | void>[] = [\n initSearchWidget(options, config),\n ];\n if (config.settings?.enableTracking) {\n initPromises.push(\n initBrainfishAnalytics(\n options.widgetKey,\n config.trackingToken || '',\n apiHost,\n analyticsApiHost\n ) // Even if this fails, it won't block the widget\n );\n }\n // Start both initializations in parallel\n const [widgetPromise] = await Promise.allSettled(initPromises);\n\n // Only set the real Brainfish if widget initialization succeeded\n if (widgetPromise.status === 'fulfilled' && widgetPromise.value) {\n Brainfish._setRealBrainfish(widgetPromise.value);\n }\n}\n\nBrainfish.Widgets.init = async (options: {\n widgetKey: string;\n overrides?: any;\n}): Promise<void> => {\n createQueues();\n\n const apiHost = getApiHost(options.overrides);\n const analyticsApiHost = getAnalyticsApiHost(options.overrides);\n\n const { config } = await getConfigByKey({\n widgetKey: options.widgetKey,\n apiHost,\n });\n\n if (!initializationPromise) {\n // First initialization\n initializationPromise = initializeBrainfish(\n options,\n config,\n apiHost,\n analyticsApiHost\n );\n }\n\n // Wait for Brainfish to be initialized\n await initializationPromise;\n\n // Initialize this specific widget and analytics in parallel\n const initPromises: Promise<Brainfish | undefined | void>[] = [\n initSearchWidget(options, config),\n ];\n if (config.settings?.enableTracking) {\n const analyticsApiHost = getAnalyticsApiHost(options.overrides);\n\n initPromises.push(\n initBrainfishAnalytics(\n options.widgetKey,\n config.trackingToken || '',\n apiHost,\n analyticsApiHost\n ) // Even if this fails, it won't block the widget\n );\n }\n\n await Promise.allSettled(initPromises);\n};\n\nexport default Brainfish;\n\nexport const BrainfishAnalytics = (\n ...args: Parameters<typeof window.BrainfishAnalytics>\n) => {\n if (typeof window !== 'undefined' && window.BrainfishAnalytics) {\n window.BrainfishAnalytics(...args);\n }\n};\n","import type { Brainfish } from '../types/brainfish';\n\nexport interface BrainfishQueue extends Brainfish {\n _setRealBrainfish: (bf: Brainfish) => void;\n Widgets: {\n init: (options: { widgetKey: string; overrides?: any }) => Promise<void>;\n };\n}\n\nexport function createBrainfishQueue(): BrainfishQueue {\n let queue: [string, any[]][] = [];\n let realBrainfish: Brainfish | null = null;\n\n function queueOrExecute(method: string, args: any[]) {\n if (realBrainfish) {\n const parts = method.split('.');\n let obj: any = realBrainfish;\n for (let i = 0; i < parts.length - 1; i++) {\n obj = obj[parts[i]];\n }\n const fn = obj[parts[parts.length - 1]];\n if (typeof fn === 'function') {\n return fn.apply(obj, args);\n }\n } else {\n queue.push([method, args]);\n }\n }\n\n const brainfishQueue: BrainfishQueue = {\n Widgets: {\n init: (...args: any[]) => queueOrExecute('Widgets.init', args),\n },\n SearchWidget: {\n initStandard: (...args: any[]) =>\n queueOrExecute('SearchWidget.initStandard', args),\n },\n HelpWidget: {\n initPopup: (...args: any[]) =>\n queueOrExecute('HelpWidget.initPopup', args),\n close: (...args: any[]) => queueOrExecute('HelpWidget.close', args),\n open: (...args: any[]) => queueOrExecute('HelpWidget.open', args),\n toggle: (...args: any[]) => queueOrExecute('HelpWidget.toggle', args),\n },\n _setRealBrainfish: function (bf: Brainfish) {\n realBrainfish = bf;\n while (queue.length > 0) {\n const [method, args] = queue.shift()!;\n queueOrExecute(method, args);\n }\n },\n };\n\n return brainfishQueue;\n}\n","export const createQueues = () => {\n if (window) {\n window.BrainfishAnalytics =\n window.BrainfishAnalytics ||\n function (...args: [string, ...any[]]) {\n (window.BrainfishAnalytics.q = window.BrainfishAnalytics.q || []).push(\n args\n );\n };\n }\n};\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","BrainfishWidgetError","Error","message","options","super","cause","this","name","captureStackTrace","stack","sendBrainfishWidgetError","apiHost","error","widgetKey","errorMessage","errorDetails","JSON","parse","String","navigator","userAgent","toLowerCase","includes","errorData","toJSON","fetch","method","headers","body","stringify","getConfigByKey","_ref","async","endpoint","__async","then","response","ok","status","json","data","catch","transformConfig","config","apiKey","settings","forEach","key","map","action","type","CALLBACK","value","__spreadProps","__spreadValues","Function","widgetMode","widgetType","i","getApiHost","overrides","getAnalyticsApiHost","analyticsApiHost","useUMD","window","ua","match","version","parseInt","init","url","scriptUrl","replace","widget","document","getElementById","Brainfish","Promise","resolve","reject","script","createElement","id","src","crossOrigin","onload","setTimeout","module","onerror","event","errorEvent","fileName","filename","lineNumber","lineno","columnNumber","colno","toString","head","appendChild","loadSearchWidgetScript","initializedWidgets","Set","initSearchWidget","has","result","transformedConfig","Object","entries","_ref2","overrideActions","arguments","length","undefined","actionMap","Map","label","set","Array","from","values","SearchWidget","initStandard","HelpWidget","initPopup","add","isTrackerInitialized","initBrainfishAnalytics","accessKey","BrainfishAnalytics","apiUrl","trackScreenViews","trackAttributes","trackOutgoingLinks","globalBrainfish","queue","realBrainfish","queueOrExecute","args","parts","split","obj","fn","apply","push","Widgets","_len","_key","_len2","_key2","_len3","_key3","close","_len4","_key4","open","_len5","_key5","toggle","_len6","_key6","_setRealBrainfish","bf","shift","createBrainfishQueue","initializationPromise","_config$settings2","q","_config$settings","initPromises","enableTracking","trackingToken","widgetPromise","allSettled"],"mappings":"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"}
|
package/dist/web.js
CHANGED
|
@@ -1,2 +1,222 @@
|
|
|
1
|
-
var
|
|
1
|
+
var C = Object.defineProperty, I = Object.defineProperties;
|
|
2
|
+
var N = Object.getOwnPropertyDescriptors;
|
|
3
|
+
var S = Object.getOwnPropertySymbols;
|
|
4
|
+
var L = Object.prototype.hasOwnProperty, _ = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var y = (t, n, s) => n in t ? C(t, n, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[n] = s, m = (t, n) => {
|
|
6
|
+
for (var s in n || (n = {}))
|
|
7
|
+
L.call(n, s) && y(t, s, n[s]);
|
|
8
|
+
if (S)
|
|
9
|
+
for (var s of S(n))
|
|
10
|
+
_.call(n, s) && y(t, s, n[s]);
|
|
11
|
+
return t;
|
|
12
|
+
}, b = (t, n) => I(t, N(n));
|
|
13
|
+
var B = (t, n, s) => y(t, typeof n != "symbol" ? n + "" : n, s);
|
|
14
|
+
var f = (t, n, s) => new Promise((d, i) => {
|
|
15
|
+
var r = (c) => {
|
|
16
|
+
try {
|
|
17
|
+
a(s.next(c));
|
|
18
|
+
} catch (o) {
|
|
19
|
+
i(o);
|
|
20
|
+
}
|
|
21
|
+
}, e = (c) => {
|
|
22
|
+
try {
|
|
23
|
+
a(s.throw(c));
|
|
24
|
+
} catch (o) {
|
|
25
|
+
i(o);
|
|
26
|
+
}
|
|
27
|
+
}, a = (c) => c.done ? d(c.value) : Promise.resolve(c.value).then(r, e);
|
|
28
|
+
a((s = s.apply(t, n)).next());
|
|
29
|
+
});
|
|
30
|
+
var w, A;
|
|
31
|
+
(function() {
|
|
32
|
+
try {
|
|
33
|
+
var t = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {}, n = new t.Error().stack;
|
|
34
|
+
n && (t._sentryDebugIds = t._sentryDebugIds || {}, t._sentryDebugIds[n] = "3b2289d9-84fc-43e7-9533-124f5c0b541e", t._sentryDebugIdIdentifier = "sentry-dbid-3b2289d9-84fc-43e7-9533-124f5c0b541e");
|
|
35
|
+
} catch (s) {
|
|
36
|
+
}
|
|
37
|
+
})(), (typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {}).SENTRY_RELEASE = { id: "c36c4cf2d8ecb908e550a91798616c5171c4ad47" }, function(t) {
|
|
38
|
+
t.Sidebar = "sidebar", t.Searchbar = "searchbar";
|
|
39
|
+
}(w || (w = {})), w.Sidebar, w.Searchbar;
|
|
40
|
+
class E extends Error {
|
|
41
|
+
constructor(s, d) {
|
|
42
|
+
super(s, d);
|
|
43
|
+
B(this, "cause");
|
|
44
|
+
this.name = "BrainfishWidgetError", this.cause = d == null ? void 0 : d.cause, Error.captureStackTrace && Error.captureStackTrace(this, E), this.cause instanceof Error && this.cause.stack && (this.stack = this.stack + `
|
|
45
|
+
Caused by: ` + this.cause.stack);
|
|
46
|
+
}
|
|
47
|
+
toJSON() {
|
|
48
|
+
return { name: this.name, message: this.message, stack: this.stack, cause: this.cause instanceof Error ? { name: this.cause.name, message: this.cause.message, stack: this.cause.stack } : this.cause };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
(function(t) {
|
|
52
|
+
t.LINK = "link", t.CALLBACK = "callback", t.EMAIL = "email", t.PHONE = "phone";
|
|
53
|
+
})(A || (A = {}));
|
|
54
|
+
const h = (t, n, s, d) => {
|
|
55
|
+
let i = s, r = {};
|
|
56
|
+
if (n instanceof Error) try {
|
|
57
|
+
r = JSON.parse(n.message), i += ` - ${r.message || n.message}`;
|
|
58
|
+
} catch (e) {
|
|
59
|
+
i += ` - ${n.message}`;
|
|
60
|
+
}
|
|
61
|
+
else i += ` - ${String(n)}`;
|
|
62
|
+
((e, a, c) => {
|
|
63
|
+
if (!navigator || navigator.userAgent.toLowerCase().includes("headless")) return;
|
|
64
|
+
const o = a.toJSON();
|
|
65
|
+
fetch(`${e || "https://app.brainfi.sh"}/api/trackError.widget.create`, { method: "POST", headers: { "Content-Type": "application/json", "api-key": c }, body: JSON.stringify({ error: `WebWidgetVersion: 1.3.0-beta.3. ${a.message}`, stack: a.stack, cause: { message: o.message, stack: o.stack, cause: o.cause } }) });
|
|
66
|
+
})(t, new E(i, { cause: r }), d);
|
|
67
|
+
}, F = (t) => f(void 0, null, function* () {
|
|
68
|
+
let { widgetKey: n, apiHost: s } = t;
|
|
69
|
+
return function(d, i, r) {
|
|
70
|
+
return f(this, null, function* () {
|
|
71
|
+
return fetch(`${d}${i}`, { method: "POST", headers: { "Content-Type": "application/json", "api-key": r } }).then((e) => {
|
|
72
|
+
if (!e.ok) throw new Error(`API call failed with status: ${e.status}`);
|
|
73
|
+
return e.json();
|
|
74
|
+
}).then((e) => {
|
|
75
|
+
if (!e) throw new Error("Error loading config: empty response");
|
|
76
|
+
return e;
|
|
77
|
+
}).catch((e) => {
|
|
78
|
+
h(d, e, "Error fetching config", r);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}(s, "/api/searchWidgets.getConfigByKey", n);
|
|
82
|
+
}), J = (t) => {
|
|
83
|
+
let { config: n, apiKey: s, apiHost: d } = t;
|
|
84
|
+
const i = n.settings || {};
|
|
85
|
+
return ["bodyActionButtons", "footerActionButtons", "nextBestActions"].forEach((r) => {
|
|
86
|
+
i[r] && (i[r] = i[r].map((e) => e.type === A.CALLBACK && e.value ? b(m({}, e), { value: new Function(`return ${e.value}`)() }) : e));
|
|
87
|
+
}), b(m({}, n), { settings: i, apiHost: d, widgetMode: n.widgetType, apiKey: s });
|
|
88
|
+
}, P = (t) => (t == null ? void 0 : t.apiHost) || "https://app.brainfi.sh", K = (t) => (t == null ? void 0 : t.analyticsApiHost) || void 0, v = (() => {
|
|
89
|
+
if (typeof window == "undefined") return;
|
|
90
|
+
const t = window.navigator.userAgent;
|
|
91
|
+
if (!(t.match(/iPad/i) || t.match(/iPhone/i))) return !1;
|
|
92
|
+
const n = t.match(/OS (\d+)_/i);
|
|
93
|
+
return n && parseInt(n[1], 10) <= 14;
|
|
94
|
+
})(), q = (t) => f(void 0, null, function* () {
|
|
95
|
+
let { apiHost: n, widgetKey: s, version: d } = t;
|
|
96
|
+
try {
|
|
97
|
+
const i = `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${d}/dist/web.js`, r = v ? i.replace("web.js", "web.umd.js") : i;
|
|
98
|
+
return { widget: yield ((a) => f(void 0, null, function* () {
|
|
99
|
+
return document.getElementById("brainfish-widget") ? window.Brainfish : new Promise((c, o) => {
|
|
100
|
+
const u = document.createElement("script");
|
|
101
|
+
u.id = "brainfish-widget", u.src = a, u.type = v ? "text/javascript" : "module", u.async = !0, u.crossOrigin = "anonymous", u.onload = () => {
|
|
102
|
+
setTimeout(() => {
|
|
103
|
+
const l = window.Brainfish;
|
|
104
|
+
l ? c(l) : o(new Error("Failed to load Brainfish module"));
|
|
105
|
+
}, 200);
|
|
106
|
+
}, u.onerror = (l) => {
|
|
107
|
+
const g = l, j = { message: `Failed to load script: ${a}`, type: g.type, fileName: g.filename, lineNumber: g.lineno, columnNumber: g.colno, error: g.error ? g.error.toString() : "Unknown error" };
|
|
108
|
+
o(new Error(JSON.stringify(j)));
|
|
109
|
+
}, v || document.head.appendChild(u);
|
|
110
|
+
});
|
|
111
|
+
}))(r) };
|
|
112
|
+
} catch (i) {
|
|
113
|
+
h(n, i, i.message, s);
|
|
114
|
+
}
|
|
115
|
+
}), H = /* @__PURE__ */ new Set(), W = (t, n) => f(void 0, null, function* () {
|
|
116
|
+
const s = P(t.overrides);
|
|
117
|
+
try {
|
|
118
|
+
if (H.has(t.widgetKey)) return;
|
|
119
|
+
const d = yield q({ apiHost: s, widgetKey: t.widgetKey, version: n.version || "latest" });
|
|
120
|
+
if (d) {
|
|
121
|
+
const { widget: i } = d, r = J({ config: n, apiKey: t.widgetKey, apiHost: s });
|
|
122
|
+
return t.overrides && n.settings && Object.entries(t.overrides).forEach((e) => {
|
|
123
|
+
let [a, c] = e;
|
|
124
|
+
n.settings && a in n.settings && (n.settings[a] = function() {
|
|
125
|
+
let o = arguments.length > 1 ? arguments[1] : void 0;
|
|
126
|
+
const u = new Map((arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []).map((l) => [l.label, l]));
|
|
127
|
+
return o.forEach((l) => u.set(l.label, l)), Array.from(u.values());
|
|
128
|
+
}(n.settings[a], c));
|
|
129
|
+
}), function(e, a) {
|
|
130
|
+
a.widgetType === w.Searchbar || a.widgetType === "Search" ? e.SearchWidget.initStandard(a) : e.HelpWidget.initPopup(a);
|
|
131
|
+
}(i, r), H.add(t.widgetKey), i;
|
|
132
|
+
}
|
|
133
|
+
} catch (d) {
|
|
134
|
+
h(s, d, d.message, t.widgetKey);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
let T = !1;
|
|
138
|
+
const O = function(d, i, r) {
|
|
139
|
+
return f(this, arguments, function* (t, n, s) {
|
|
140
|
+
let e = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : void 0;
|
|
141
|
+
if (n || h(s, new Error("Access key is required"), "Access key is required", t), !T) try {
|
|
142
|
+
window.BrainfishAnalytics("init", { apiUrl: e, accessKey: n, trackScreenViews: !0, trackAttributes: !0, trackOutgoingLinks: !0 }), T = !0, yield ((a, c) => f(this, null, function* () {
|
|
143
|
+
if (document.getElementById("brainfish-analytics")) return window.BrainfishAnalytics;
|
|
144
|
+
const o = document.createElement("script");
|
|
145
|
+
o.id = "brainfish-analytics", o.src = "https://cdn.jsdelivr.net/npm/@brainfish-ai/web-tracker@latest/dist/tracker.js", o.type = "module", o.async = !0, o.crossOrigin = "anonymous", o.onerror = () => {
|
|
146
|
+
h(a, new Error(`Failed to load script: ${o.src}`), `Failed to load script: ${o.src}`, c);
|
|
147
|
+
}, document.head.appendChild(o);
|
|
148
|
+
}))(s, t);
|
|
149
|
+
} catch (a) {
|
|
150
|
+
h(s, a, "Failed to initialize BrainfishAnalytics", t);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
let p = null;
|
|
155
|
+
const $ = typeof window != "undefined" && window.Brainfish ? window.Brainfish : (p || (p = /* @__PURE__ */ function() {
|
|
156
|
+
let t = [], n = null;
|
|
157
|
+
function s(i, r) {
|
|
158
|
+
if (n) {
|
|
159
|
+
const e = i.split(".");
|
|
160
|
+
let a = n;
|
|
161
|
+
for (let o = 0; o < e.length - 1; o++) a = a[e[o]];
|
|
162
|
+
const c = a[e[e.length - 1]];
|
|
163
|
+
if (typeof c == "function") return c.apply(a, r);
|
|
164
|
+
} else t.push([i, r]);
|
|
165
|
+
}
|
|
166
|
+
return { Widgets: { init: function() {
|
|
167
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
168
|
+
return s("Widgets.init", r);
|
|
169
|
+
} }, SearchWidget: { initStandard: function() {
|
|
170
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
171
|
+
return s("SearchWidget.initStandard", r);
|
|
172
|
+
} }, HelpWidget: { initPopup: function() {
|
|
173
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
174
|
+
return s("HelpWidget.initPopup", r);
|
|
175
|
+
}, close: function() {
|
|
176
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
177
|
+
return s("HelpWidget.close", r);
|
|
178
|
+
}, open: function() {
|
|
179
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
180
|
+
return s("HelpWidget.open", r);
|
|
181
|
+
}, toggle: function() {
|
|
182
|
+
for (var i = arguments.length, r = new Array(i), e = 0; e < i; e++) r[e] = arguments[e];
|
|
183
|
+
return s("HelpWidget.toggle", r);
|
|
184
|
+
} }, _setRealBrainfish: function(i) {
|
|
185
|
+
for (n = i; t.length > 0; ) {
|
|
186
|
+
const [r, e] = t.shift();
|
|
187
|
+
s(r, e);
|
|
188
|
+
}
|
|
189
|
+
} };
|
|
190
|
+
}(), typeof window != "undefined" && (window.Brainfish = p)), p);
|
|
191
|
+
let k = null;
|
|
192
|
+
$.Widgets.init = (t) => f(void 0, null, function* () {
|
|
193
|
+
var n;
|
|
194
|
+
window && (window.BrainfishAnalytics = window.BrainfishAnalytics || function() {
|
|
195
|
+
for (var e = arguments.length, a = new Array(e), c = 0; c < e; c++) a[c] = arguments[c];
|
|
196
|
+
(window.BrainfishAnalytics.q = window.BrainfishAnalytics.q || []).push(a);
|
|
197
|
+
});
|
|
198
|
+
const s = P(t.overrides), d = K(t.overrides), { config: i } = yield F({ widgetKey: t.widgetKey, apiHost: s });
|
|
199
|
+
k || (k = function(e, a, c, o) {
|
|
200
|
+
return f(this, null, function* () {
|
|
201
|
+
var u;
|
|
202
|
+
const l = [W(e, a)];
|
|
203
|
+
(u = a.settings) !== null && u !== void 0 && u.enableTracking && l.push(O(e.widgetKey, a.trackingToken || "", c, o));
|
|
204
|
+
const [g] = yield Promise.allSettled(l);
|
|
205
|
+
g.status === "fulfilled" && g.value && $._setRealBrainfish(g.value);
|
|
206
|
+
});
|
|
207
|
+
}(t, i, s, d)), yield k;
|
|
208
|
+
const r = [W(t, i)];
|
|
209
|
+
if ((n = i.settings) !== null && n !== void 0 && n.enableTracking) {
|
|
210
|
+
const e = K(t.overrides);
|
|
211
|
+
r.push(O(t.widgetKey, i.trackingToken || "", s, e));
|
|
212
|
+
}
|
|
213
|
+
yield Promise.allSettled(r);
|
|
214
|
+
});
|
|
215
|
+
const D = function() {
|
|
216
|
+
typeof window != "undefined" && window.BrainfishAnalytics && window.BrainfishAnalytics(...arguments);
|
|
217
|
+
};
|
|
218
|
+
export {
|
|
219
|
+
D as BrainfishAnalytics,
|
|
220
|
+
$ as default
|
|
221
|
+
};
|
|
2
222
|
//# sourceMappingURL=web.js.map
|
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/window/inject-brainfish.js","../src/web.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export const injectBrainfishInWindow = (brainfish) => {\n if (typeof window === 'undefined')\n return;\n if (window.Brainfish) {\n window.Brainfish = { ...window.Brainfish, ...brainfish };\n }\n else {\n window.Brainfish = { ...brainfish };\n }\n};\n","// web.ts\n// entry point for web component\nimport * as Common from '@brainfish-ai/widgets-common';\nimport {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\n\nconst API_HOST = import.meta.env.VITE_API_HOST;\n\nfunction mapActionButtons(\n actionButtons: (CallbackAction | Action)[]\n): (CallbackAction | Action)[] {\n return actionButtons.map((action) => {\n if (action.type === Common.ActionType.CALLBACK) {\n return {\n ...action,\n value: new Function(`return ${action.value}`)(),\n };\n }\n return action;\n });\n}\n\nconst transformConfig = ({\n config,\n apiKey,\n}: {\n config: Config;\n apiKey: string;\n}) => {\n if (!!config.settings?.bodyActionButtons) {\n config.settings.bodyActionButtons = mapActionButtons(\n config.settings.bodyActionButtons\n );\n }\n if (!!config.settings?.footerActionButtons) {\n config.settings.footerActionButtons = mapActionButtons(\n config.settings.footerActionButtons\n );\n }\n if (!!config.settings?.nextBestActions) {\n config.settings.nextBestActions = mapActionButtons(\n config.settings.nextBestActions\n );\n }\n return {\n ...config,\n apiHost: `${API_HOST}`,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n\nconst init = async ({\n widgetKey,\n overrides,\n}: {\n widgetKey: string;\n overrides?: Pick<\n Settings,\n 'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'\n >;\n}) => {\n const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;\n\n const configResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => response.json())\n .catch((error) => console.log('Error loading widget config', error));\n\n if (!configResponse) {\n console.log('Error loading widget config');\n return;\n }\n\n const config = transformConfig({\n config: configResponse.config,\n apiKey: widgetKey,\n });\n const version = config.version || 'latest';\n\n if (overrides) {\n const { nextBestActions, bodyActionButtons, footerActionButtons } =\n overrides;\n\n const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n ) => {\n // Create a map from the configActions array, using the action label as the key\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n\n // Update the actionMap with the overrideActions.\n // If an action with the same label already exists in the map, it will be updated.\n // If it doesn't exist, it will be added to the map.\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n\n // Convert the map back to an array and return it\n return Array.from(actionMap.values());\n };\n\n config.settings = {\n ...config.settings,\n nextBestActions: nextBestActions\n ? updateActions(config.settings?.nextBestActions, nextBestActions)\n : config.settings?.nextBestActions,\n bodyActionButtons: bodyActionButtons\n ? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)\n : config.settings?.bodyActionButtons,\n footerActionButtons: footerActionButtons\n ? updateActions(\n config.settings?.footerActionButtons,\n footerActionButtons\n )\n : config.settings?.footerActionButtons,\n };\n }\n\n // import the widget based on the version from cdn.jsdelivr.net\n const { default: widget } = await import(\n `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`\n );\n\n switch (config.widgetType) {\n case Common.WidgetType.Searchbar:\n case 'Search':\n widget.SearchWidget.initStandard(config);\n break;\n case Common.WidgetType.Sidebar:\n case 'slide-over': // for backwards compatibility\n widget.HelpWidget.initPopup(config);\n break;\n default:\n return;\n }\n};\n\nconst brainfish = {\n Widgets: { init }\n}\n\nif (brainfish) {\n Common.injectBrainfishInWindow(brainfish);\n}\n\nexport default brainfish;\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","API_HOST","mapActionButtons","actionButtons","map","action","type","Common.ActionType","CALLBACK","value","Function","brainfish","Widgets","init","async","widgetKey","overrides","endpoint","configResponse","fetch","method","headers","then","response","json","catch","error","console","log","config","apiKey","settings","bodyActionButtons","footerActionButtons","nextBestActions","apiHost","widgetMode","widgetType","transformConfig","version","updateActions","configActions","overrideActions","actionMap","Map","label","forEach","set","Array","from","values","default","widget","import","Common.WidgetType","SearchWidget","initStandard","HelpWidget","initPopup","window","Brainfish","Common.injectBrainfishInWindow"],"mappings":"AAAO,IAAIA,ECUAC,GDTX,SAAWD,GACPA,EAAoB,QAAI,UACxBA,EAAsB,UAAI,WAC7B,CAHD,CAGGA,IAAeA,EAAa,CAAE,IAG5BA,EAAWE,QACXF,EAAWG,UCGhB,SAAWF,GACPA,EAAiB,KAAI,OACrBA,EAAqB,SAAI,WACzBA,EAAkB,MAAI,QACtBA,EAAkB,MAAI,OACzB,CALD,CAKGA,IAAeA,EAAa,CAAA,IChBxB,MCUDG,EAAW,yBAEjB,SAASC,EACPC,GAEO,OAAAA,EAAcC,KAAKC,GACpBA,EAAOC,OAASC,EAAkBC,SAC7B,IACFH,EACHI,MAAO,IAAIC,SAAS,UAAUL,EAAOI,QAA9B,IAGJJ,GAEX,CAEA,MAyHMM,EAAY,CAChBC,QAAS,CAAEC,KA5FAC,OACXC,YACAC,gBAQM,MAAAC,EAAW,GAAGhB,qCAEdiB,QAAuBC,MAAMF,EAAU,CAC3CG,OAAQ,OACRC,QAAS,CACP,eAAgB,mBAChB,UAAWN,KAGZO,MAAMC,GAAaA,EAASC,SAC5BC,OAAOC,GAAUC,QAAQC,IAAI,8BAA+BF,KAE/D,IAAKR,EAEH,YADAS,QAAQC,IAAI,+BAId,MAAMC,EAzDgB,GACtBA,SACAC,aAKMD,EAAOE,UAAUC,oBACrBH,EAAOE,SAASC,kBAAoB9B,EAClC2B,EAAOE,SAASC,oBAGdH,EAAOE,UAAUE,sBACrBJ,EAAOE,SAASE,oBAAsB/B,EACpC2B,EAAOE,SAASE,sBAGdJ,EAAOE,UAAUG,kBACrBL,EAAOE,SAASG,gBAAkBhC,EAChC2B,EAAOE,SAASG,kBAGb,IACFL,EACHM,QAAS,GAAGlC,IACZmC,WAAYP,EAAOQ,WACnBP,WA+BaQ,CAAgB,CAC7BT,OAAQX,EAAeW,OACvBC,OAAQf,IAEJwB,EAAUV,EAAOU,SAAW,SAElC,GAAIvB,EAAW,CACb,MAAMkB,gBAAEA,EAAAF,kBAAiBA,EAAmBC,oBAAAA,GAC1CjB,EAEIwB,EAAgB,CACpBC,EAA6C,GAC7CC,KAGA,MAAMC,EAAY,IAAIC,IACpBH,EAAcrC,KAAKC,GAAW,CAACA,EAAOwC,MAAOxC,MAS/C,OAHgBqC,EAAAI,SAASzC,GAAWsC,EAAUI,IAAI1C,EAAOwC,MAAOxC,KAGzD2C,MAAMC,KAAKN,EAAUO,SAAQ,EAGtCrB,EAAOE,SAAW,IACbF,EAAOE,SACVG,gBAAiBA,EACbM,EAAcX,EAAOE,UAAUG,gBAAiBA,GAChDL,EAAOE,UAAUG,gBACrBF,kBAAmBA,EACfQ,EAAcX,EAAOE,UAAUC,kBAAmBA,GAClDH,EAAOE,UAAUC,kBACrBC,oBAAqBA,EACjBO,EACEX,EAAOE,UAAUE,oBACjBA,GAEFJ,EAAOE,UAAUE,oBAEzB,CAGA,MAAQkB,QAASC,SAAiBC,OAChC,4DAA4Dd,iBAG9D,OAAQV,EAAOQ,YACb,KAAKiB,EAAkBtD,UACvB,IAAK,SACIoD,EAAAG,aAAaC,aAAa3B,GACjC,MACF,KAAKyB,EAAkBvD,QACvB,IAAK,aACIqD,EAAAK,WAAWC,UAAU7B,GAC5B,MACF,QACE,OACJ,IAOElB,GDvJmC,CAACA,IACd,oBAAXgD,SAEPA,OAAOC,UACPD,OAAOC,UAAY,IAAKD,OAAOC,aAAcjD,GAG7CgD,OAAOC,UAAY,IAAKjD,GAC3B,ECgJHkD,CAA+BlD"}
|
|
1
|
+
{"version":3,"file":"web.js","sources":["../../common/dist/types/brainfish.js","../../common/dist/types/config.js","../../common/dist/types/BrainfishWidgetError.js","../src/utils/sendErrors.ts","../src/utils/sendBrainfishError.ts","../src/api/getConfigByKey.ts","../src/utils/fetchWithErrorHandling.ts","../src/utils/configTransformer.ts","../src/utils/getApiHost.ts","../src/initSearchWidget.ts","../src/utils/isIOS14OrBelow.ts","../src/initBrainfishAnalytics.ts","../src/web.ts","../src/utils/brainfishQueue.ts","../src/utils/createQueues.ts"],"sourcesContent":["export var WidgetType;\n(function (WidgetType) {\n WidgetType[\"Sidebar\"] = \"sidebar\";\n WidgetType[\"Searchbar\"] = \"searchbar\";\n})(WidgetType || (WidgetType = {}));\n;\nexport const WIDGET_NAMES = {\n [WidgetType.Sidebar]: 'brainfish-sidebar-widget',\n [WidgetType.Searchbar]: 'brainfish-searchbar-widget',\n};\n","const isUrlString = (value) => {\n const urlRegExp = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n return urlRegExp.test(value);\n};\nexport const validateUrlString = (value) => {\n if (!isUrlString(value)) {\n throw new Error(`Invalid URL: ${value}`);\n }\n return value;\n};\nexport var ActionType;\n(function (ActionType) {\n ActionType[\"LINK\"] = \"link\";\n ActionType[\"CALLBACK\"] = \"callback\";\n ActionType[\"EMAIL\"] = \"email\";\n ActionType[\"PHONE\"] = \"phone\";\n})(ActionType || (ActionType = {}));\n","export class BrainfishWidgetError extends Error {\n cause;\n constructor(message, options) {\n super(message, options);\n this.name = 'BrainfishWidgetError';\n this.cause = options?.cause;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BrainfishWidgetError);\n }\n // Append cause stack to this error's stack if cause is an Error\n if (this.cause instanceof Error && this.cause.stack) {\n this.stack = this.stack + '\\nCaused by: ' + this.cause.stack;\n }\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause instanceof Error\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : this.cause,\n };\n }\n}\n","import { BrainfishWidgetError } from '@brainfish-ai/widgets-common';\n\ndeclare const __APP_VERSION__: string;\n\nexport const sendErrors = (\n apiHost: string,\n error: BrainfishWidgetError,\n widgetKey: string\n) => {\n // only send errors if browser is not a headless browser\n if (!navigator || navigator.userAgent.toLowerCase().includes('headless')) {\n return;\n }\n\n const errorData = error.toJSON();\n const API_HOST = apiHost || import.meta.env.VITE_API_HOST;\n\n fetch(`${API_HOST}/api/trackError.widget.create`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n body: JSON.stringify({\n error: `WebWidgetVersion: ${__APP_VERSION__}. ${error.message}`,\n stack: error.stack,\n cause: {\n message: errorData.message,\n stack: errorData.stack,\n cause: errorData.cause,\n },\n }),\n });\n};\n","import { BrainfishWidgetError } from '@brainfish-ai/widgets-common';\nimport { sendErrors } from './sendErrors';\n\nexport const sendBrainfishWidgetError = (\n apiHost: string,\n error: unknown,\n message: string,\n widgetKey: string\n) => {\n let errorMessage = message;\n let errorDetails: Record<string, any> = {};\n\n if (error instanceof Error) {\n try {\n errorDetails = JSON.parse(error.message);\n errorMessage += ` - ${errorDetails.message || error.message}`;\n } catch {\n // If parsing fails, use the error message as is\n errorMessage += ` - ${error.message}`;\n }\n } else {\n errorMessage += ` - ${String(error)}`;\n }\n\n const err = new BrainfishWidgetError(errorMessage, {\n cause: errorDetails,\n });\n\n sendErrors(apiHost, err, widgetKey);\n};\n","import type { Config } from '@brainfish-ai/widgets-common';\nimport { fetchWithErrorHandling } from '../utils/fetchWithErrorHandling';\n\nexport interface ConfigResponse {\n config: Config;\n}\n\nexport const getConfigByKey = async ({\n widgetKey,\n apiHost,\n}: {\n widgetKey: string;\n apiHost: string;\n}): Promise<ConfigResponse> => {\n const endpoint = `/api/searchWidgets.getConfigByKey`;\n return fetchWithErrorHandling(apiHost, endpoint, widgetKey);\n};\n","import { sendBrainfishWidgetError } from './sendBrainfishError';\n\nexport async function fetchWithErrorHandling(\n apiHost: string,\n endpoint: string,\n widgetKey: string\n): Promise<any> {\n return fetch(`${apiHost}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': widgetKey,\n },\n })\n .then((response) => {\n if (!response.ok) {\n throw new Error(`API call failed with status: ${response.status}`);\n }\n return response.json();\n })\n .then((data) => {\n if (!data) {\n throw new Error('Error loading config: empty response');\n }\n return data;\n })\n .catch((error) => {\n sendBrainfishWidgetError(\n apiHost,\n error,\n 'Error fetching config',\n widgetKey\n );\n });\n}\n","import type {\n Config,\n CallbackAction,\n Action,\n} from '@brainfish-ai/widgets-common';\nimport { ActionType } from '@brainfish-ai/widgets-common';\n\nconst mapActionButtons = (actionButtons: (CallbackAction | Action)[]) =>\n actionButtons.map((action) =>\n action.type === ActionType.CALLBACK && action.value\n ? { ...action, value: new Function(`return ${action.value}`)() }\n : action\n );\n\nexport const updateActions = (\n configActions: (Action | CallbackAction)[] = [],\n overrideActions: (Action | CallbackAction)[]\n) => {\n const actionMap = new Map(\n configActions.map((action) => [action.label, action])\n );\n overrideActions.forEach((action) => actionMap.set(action.label, action));\n return Array.from(actionMap.values());\n};\n\nexport const transformConfig = ({\n config,\n apiKey,\n apiHost,\n}: {\n config: Config;\n apiKey: string;\n apiHost: string;\n}) => {\n const settings = config.settings || {};\n (\n ['bodyActionButtons', 'footerActionButtons', 'nextBestActions'] as const\n ).forEach((key) => {\n if (settings[key]) {\n settings[key] = mapActionButtons(\n settings[key] as (CallbackAction | Action)[]\n );\n }\n });\n\n return {\n ...config,\n settings,\n apiHost,\n widgetMode: config.widgetType,\n apiKey,\n };\n};\n","export const getApiHost = (overrides?: { apiHost?: string }): string => {\n return overrides?.apiHost || import.meta.env.VITE_API_HOST;\n};\n\nexport const getAnalyticsApiHost = (overrides?: {\n analyticsApiHost?: string;\n}): string => {\n return overrides?.analyticsApiHost || import.meta.env.VITE_ANALYTICS_API_HOST;\n};\n","import type {\n Config,\n CallbackAction,\n Action,\n Settings,\n} from '@brainfish-ai/widgets-common';\nimport { WidgetType } from '@brainfish-ai/widgets-common';\nimport { isIOS14OrBelow } from './utils/isIOS14OrBelow';\nimport { sendBrainfishWidgetError } from './utils/sendBrainfishError';\nimport type { Brainfish } from './types/brainfish';\nimport { transformConfig, updateActions } from './utils/configTransformer';\nimport { getApiHost } from './utils/getApiHost';\n\nconst useUMD = isIOS14OrBelow();\n\nconst loadSearchWidgetScript = async (url: string): Promise<any> => {\n if (document.getElementById('brainfish-widget')) {\n return (window as any).Brainfish;\n }\n\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'brainfish-widget';\n script.src = url;\n script.type = useUMD ? 'text/javascript' : 'module';\n script.async = true;\n script.crossOrigin = 'anonymous';\n\n script.onload = () => {\n setTimeout(() => {\n const module = (window as any).Brainfish;\n module\n ? resolve(module)\n : reject(new Error('Failed to load Brainfish module'));\n }, 200);\n };\n\n script.onerror = (event) => {\n const errorEvent = event as ErrorEvent;\n const errorDetails = {\n message: `Failed to load script: ${url}`,\n type: errorEvent.type,\n fileName: errorEvent.filename,\n lineNumber: errorEvent.lineno,\n columnNumber: errorEvent.colno,\n error: errorEvent.error ? errorEvent.error.toString() : 'Unknown error',\n };\n reject(new Error(JSON.stringify(errorDetails)));\n };\n\n if (!useUMD) {\n document.head.appendChild(script);\n }\n });\n};\n\nexport const init = async ({\n apiHost,\n widgetKey,\n version,\n}: {\n apiHost: string;\n widgetKey: string;\n version: string;\n}) => {\n try {\n const url = `https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`;\n const scriptUrl = useUMD ? url.replace('web.js', 'web.umd.js') : url;\n\n const widget = await loadSearchWidgetScript(scriptUrl);\n\n return { widget };\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n (error as Error).message,\n widgetKey\n );\n }\n};\n\nfunction initializeWidget(widget: Brainfish, config: Config) {\n if (\n config.widgetType === WidgetType.Searchbar ||\n config.widgetType === 'Search'\n ) {\n widget.SearchWidget.initStandard(config);\n } else {\n widget.HelpWidget.initPopup(config);\n }\n}\n\nconst initializedWidgets = new Set<string>();\n\nexport const initSearchWidget = async (\n options: {\n widgetKey: string;\n overrides?: any;\n },\n config: Config\n): Promise<Brainfish | undefined> => {\n const apiHost = getApiHost(options.overrides);\n\n try {\n // Check if this widget has already been initialized\n if (initializedWidgets.has(options.widgetKey)) {\n // do nothing if already initialized\n return undefined;\n }\n\n const result = await init({\n apiHost,\n widgetKey: options.widgetKey,\n version: config.version || 'latest',\n });\n if (result) {\n const { widget } = result;\n\n const transformedConfig = transformConfig({\n config,\n apiKey: options.widgetKey,\n apiHost,\n });\n\n if (options.overrides && config.settings) {\n (\n Object.entries(options.overrides) as [\n keyof Settings,\n (Action | CallbackAction)[]\n ][]\n ).forEach(([key, value]) => {\n if (config.settings && key in config.settings) {\n (config.settings[key] as (Action | CallbackAction)[]) =\n updateActions(\n config.settings[key] as (Action | CallbackAction)[],\n value\n );\n }\n });\n }\n\n initializeWidget(widget, transformedConfig);\n initializedWidgets.add(options.widgetKey);\n return widget;\n }\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n (error as Error).message,\n options.widgetKey\n );\n }\n return undefined;\n};\n","export const isIOS14OrBelow = () => {\n if (typeof window === 'undefined') return;\n const ua = window.navigator.userAgent;\n const iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);\n if (!iOS) return false;\n const version = ua.match(/OS (\\d+)_/i);\n return version && parseInt(version[1], 10) <= 14;\n};\n","import { sendBrainfishWidgetError } from './utils/sendBrainfishError';\n\nconst ANALYTICS_API_HOST = import.meta.env.VITE_ANALYTICS_API_HOST;\n\nlet isTrackerInitialized: boolean = false;\n\nconst loadTrackerScript = async (apiHost: string, widgetKey: string) => {\n if (document.getElementById('brainfish-analytics')) {\n return window.BrainfishAnalytics;\n }\n\n const script = document.createElement('script');\n script.id = 'brainfish-analytics';\n script.src = `https://cdn.jsdelivr.net/npm/@brainfish-ai/web-tracker@latest/dist/tracker.js`;\n script.type = 'module';\n script.async = true;\n script.crossOrigin = 'anonymous';\n\n script.onerror = () => {\n sendBrainfishWidgetError(\n apiHost,\n new Error(`Failed to load script: ${script.src}`),\n `Failed to load script: ${script.src}`,\n widgetKey\n );\n };\n\n document.head.appendChild(script);\n};\n\nexport const initBrainfishAnalytics = async (\n widgetKey: string,\n accessKey: string,\n apiHost: string,\n analyticsApiHost: string = ANALYTICS_API_HOST\n): Promise<void> => {\n if (!accessKey) {\n sendBrainfishWidgetError(\n apiHost,\n new Error('Access key is required'),\n 'Access key is required',\n widgetKey\n );\n }\n\n // Only reinitialize if the access key is different\n if (isTrackerInitialized) {\n return;\n }\n\n try {\n window.BrainfishAnalytics('init', {\n apiUrl: analyticsApiHost,\n accessKey,\n trackScreenViews: true,\n trackAttributes: true,\n trackOutgoingLinks: true,\n });\n\n isTrackerInitialized = true;\n\n await loadTrackerScript(apiHost, widgetKey);\n } catch (error) {\n sendBrainfishWidgetError(\n apiHost,\n error,\n 'Failed to initialize BrainfishAnalytics',\n widgetKey\n );\n }\n};\n","// web.ts\n// entry point for web component\nimport { Config } from '@brainfish-ai/widgets-common';\nimport { getConfigByKey } from './api/getConfigByKey';\nimport { initSearchWidget } from './initSearchWidget';\nimport { initBrainfishAnalytics } from './initBrainfishAnalytics';\nimport type { Brainfish } from './types/brainfish';\nimport { BrainfishQueue, createBrainfishQueue } from './utils/brainfishQueue';\nimport { createQueues } from './utils/createQueues';\nimport { getApiHost, getAnalyticsApiHost } from './utils/getApiHost';\n\nlet globalBrainfish: BrainfishQueue | null = null;\n\nfunction getBrainfishInstance(): BrainfishQueue {\n if (typeof window !== 'undefined' && (window as any).Brainfish) {\n return (window as any).Brainfish;\n }\n if (!globalBrainfish) {\n globalBrainfish = createBrainfishQueue();\n if (typeof window !== 'undefined') {\n (window as any).Brainfish = globalBrainfish;\n }\n }\n return globalBrainfish;\n}\n\nconst Brainfish = getBrainfishInstance();\n\nlet initializationPromise: Promise<void> | null = null;\n\nasync function initializeBrainfish(\n options: {\n widgetKey: string;\n overrides?: any;\n },\n config: Config,\n apiHost: string,\n analyticsApiHost: string\n): Promise<void> {\n const initPromises: Promise<Brainfish | undefined | void>[] = [\n initSearchWidget(options, config),\n ];\n if (config.settings?.enableTracking) {\n initPromises.push(\n initBrainfishAnalytics(\n options.widgetKey,\n config.trackingToken || '',\n apiHost,\n analyticsApiHost\n ) // Even if this fails, it won't block the widget\n );\n }\n // Start both initializations in parallel\n const [widgetPromise] = await Promise.allSettled(initPromises);\n\n // Only set the real Brainfish if widget initialization succeeded\n if (widgetPromise.status === 'fulfilled' && widgetPromise.value) {\n Brainfish._setRealBrainfish(widgetPromise.value);\n }\n}\n\nBrainfish.Widgets.init = async (options: {\n widgetKey: string;\n overrides?: any;\n}): Promise<void> => {\n createQueues();\n\n const apiHost = getApiHost(options.overrides);\n const analyticsApiHost = getAnalyticsApiHost(options.overrides);\n\n const { config } = await getConfigByKey({\n widgetKey: options.widgetKey,\n apiHost,\n });\n\n if (!initializationPromise) {\n // First initialization\n initializationPromise = initializeBrainfish(\n options,\n config,\n apiHost,\n analyticsApiHost\n );\n }\n\n // Wait for Brainfish to be initialized\n await initializationPromise;\n\n // Initialize this specific widget and analytics in parallel\n const initPromises: Promise<Brainfish | undefined | void>[] = [\n initSearchWidget(options, config),\n ];\n if (config.settings?.enableTracking) {\n const analyticsApiHost = getAnalyticsApiHost(options.overrides);\n\n initPromises.push(\n initBrainfishAnalytics(\n options.widgetKey,\n config.trackingToken || '',\n apiHost,\n analyticsApiHost\n ) // Even if this fails, it won't block the widget\n );\n }\n\n await Promise.allSettled(initPromises);\n};\n\nexport default Brainfish;\n\nexport const BrainfishAnalytics = (\n ...args: Parameters<typeof window.BrainfishAnalytics>\n) => {\n if (typeof window !== 'undefined' && window.BrainfishAnalytics) {\n window.BrainfishAnalytics(...args);\n }\n};\n","import type { Brainfish } from '../types/brainfish';\n\nexport interface BrainfishQueue extends Brainfish {\n _setRealBrainfish: (bf: Brainfish) => void;\n Widgets: {\n init: (options: { widgetKey: string; overrides?: any }) => Promise<void>;\n };\n}\n\nexport function createBrainfishQueue(): BrainfishQueue {\n let queue: [string, any[]][] = [];\n let realBrainfish: Brainfish | null = null;\n\n function queueOrExecute(method: string, args: any[]) {\n if (realBrainfish) {\n const parts = method.split('.');\n let obj: any = realBrainfish;\n for (let i = 0; i < parts.length - 1; i++) {\n obj = obj[parts[i]];\n }\n const fn = obj[parts[parts.length - 1]];\n if (typeof fn === 'function') {\n return fn.apply(obj, args);\n }\n } else {\n queue.push([method, args]);\n }\n }\n\n const brainfishQueue: BrainfishQueue = {\n Widgets: {\n init: (...args: any[]) => queueOrExecute('Widgets.init', args),\n },\n SearchWidget: {\n initStandard: (...args: any[]) =>\n queueOrExecute('SearchWidget.initStandard', args),\n },\n HelpWidget: {\n initPopup: (...args: any[]) =>\n queueOrExecute('HelpWidget.initPopup', args),\n close: (...args: any[]) => queueOrExecute('HelpWidget.close', args),\n open: (...args: any[]) => queueOrExecute('HelpWidget.open', args),\n toggle: (...args: any[]) => queueOrExecute('HelpWidget.toggle', args),\n },\n _setRealBrainfish: function (bf: Brainfish) {\n realBrainfish = bf;\n while (queue.length > 0) {\n const [method, args] = queue.shift()!;\n queueOrExecute(method, args);\n }\n },\n };\n\n return brainfishQueue;\n}\n","export const createQueues = () => {\n if (window) {\n window.BrainfishAnalytics =\n window.BrainfishAnalytics ||\n function (...args: [string, ...any[]]) {\n (window.BrainfishAnalytics.q = window.BrainfishAnalytics.q || []).push(\n args\n );\n };\n }\n};\n"],"names":["WidgetType","ActionType","Sidebar","Searchbar","BrainfishWidgetError","Error","cause","message","options","super","this","name","captureStackTrace","stack","toJSON","sendBrainfishWidgetError","apiHost","error","widgetKey","errorMessage","errorDetails","JSON","parse","String","sendErrors","navigator","userAgent","toLowerCase","includes","errorData","fetch","method","headers","body","stringify","getConfigByKey","async","_ref","endpoint","then","response","ok","status","json","data","catch","transformConfig","config","apiKey","settings","forEach","key","map","action","type","CALLBACK","value","__spreadProps","__spreadValues","Function","widgetMode","widgetType","i","getApiHost","overrides","getAnalyticsApiHost","analyticsApiHost","undefined","useUMD","isIOS14OrBelow","window","ua","match","version","parseInt","init","e","__async","url","scriptUrl","replace","widget","document","getElementById","Brainfish","Promise","resolve","reject","script","createElement","id","src","crossOrigin","onload","setTimeout","module","onerror","event","errorEvent","fileName","filename","lineNumber","lineno","columnNumber","colno","toString","head","appendChild","loadSearchWidgetScript","initializedWidgets","Set","initSearchWidget","has","result","transformedConfig","Object","entries","_ref2","overrideActions","arguments","length","actionMap","Map","label","set","Array","from","values","SearchWidget","initStandard","HelpWidget","initPopup","add","isTrackerInitialized","initBrainfishAnalytics","accessKey","BrainfishAnalytics","apiUrl","trackScreenViews","trackAttributes","trackOutgoingLinks","globalBrainfish","queue","realBrainfish","queueOrExecute","args","parts","split","obj","fn","apply","push","Widgets","_len","_key","_len2","_key2","_len3","_key3","close","_len4","_key4","open","_len5","_key5","toggle","_len6","_key6","_setRealBrainfish","bf","shift","initializationPromise","_config$settings2","q","_config$settings","initPromises","enableTracking","trackingToken","widgetPromise","allSettled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAWA,GCUAC;AAAAA;;;;;;oMDTX,SAAWD,GAAAA;AACPA,EAAAA,EAAoB,UAAI,WACxBA,EAAsB,YAAI;AAC7B,EAAEA,MAAeA,IAAa,CAAE,EAG5BA,GAAAA,EAAWE,SACXF,EAAWG;AERT,MAAMC,UAA6BC,MACtCC;AAAAA,EACA,YAAYC,GAASC,GAAAA;AACjBC,UAAMF,GAASC,CAAAA;AAFnBF,IAAAA,EAAAA;AAGII,SAAKC,OAAO,wBACZD,KAAKJ,QAAQE,KAAAA,gBAAAA,EAASF,OAClBD,MAAMO,qBACNP,MAAMO,kBAAkBF,MAAMN,IAG9BM,KAAKJ,iBAAiBD,SAASK,KAAKJ,MAAMO,UAC1CH,KAAKG,QAAQH,KAAKG,QAAQ;AAAA,eAAkBH,KAAKJ,MAAMO;AAAAA,EAE9D;AAAA,EACD,SAAAC;AACI,WAAO,EACHH,MAAMD,KAAKC,MACXJ,SAASG,KAAKH,SACdM,OAAOH,KAAKG,OACZP,OAAOI,KAAKJ,iBAAiBD,QACvB,EACEM,MAAMD,KAAKJ,MAAMK,MACjBJ,SAASG,KAAKJ,MAAMC,SACpBM,OAAOH,KAAKJ,MAAMO,UAEpBH,KAAKJ,MAAAA;AAAAA,EAElB;ADhBL;AAAA,CAAA,SAAWL;AACPA,EAAAA,EAAiB,OAAI,QACrBA,EAAqB,WAAI,YACzBA,EAAkB,QAAI,SACtBA,EAAkB,QAAI;AACzB,GAAEA,MAAeA,IAAa,CAAA,EAAA;AEZxB,MCDMc,IAA2BA,CACtCC,GACAC,GACAV,GACAW,MAEA;AAAA,MAAIC,IAAeZ,GACfa,IAAoC,CAAA;AAExC,MAAIH,aAAiBZ,MACf,KACae;AAAAA,IAAAA,IAAAC,KAAKC,MAAML,EAAMV,OAChCY,GAAAA,KAAgB,MAAMC,EAAab,WAAWU,EAAMV,OAAAA;AAAAA,EACtD,SAAQ;AAEUY,IAAAA,KAAA,MAAMF,EAAMV,OAC9B;AAAA,EAAA;AAAA,MAEgBY,CAAAA,KAAA,MAAMI,OAAON,CDjBPO,CAAAA;AAAAA,GAAAA,CACxBR,GACAC,GACAC,MAAAA;AAGI,QAACO,CAAAA,aAAaA,UAAUC,UAAUC,YAAAA,EAAcC,SAAS,UAAA,EAC3D;AAGI,UAAAC,IAAYZ,EAAMH,OAAAA;AAGlBgB,UAAA,GAFWd,KAAW,wBAEsB,iCAAA,EAChDe,QAAQ,QACRC,SAAS,EACP,gBAAgB,oBAChB,WAAWd,EAAAA,GAEbe,MAAMZ,KAAKa,UAAU,EACnBjB,OAAO,mCAAyCA,EAAMV,OACtDM,IAAAA,OAAOI,EAAMJ,OACbP,OAAO,EACLC,SAASsB,EAAUtB,SACnBM,OAAOgB,EAAUhB,OACjBP,OAAOuB,EAAUvB;EAGtB,GCJUU,GAJC,IAAIZ,EAAqBe,GAAc,EACjDb,OAAOc,EAAAA,CAAAA,GAGgBF;AAAS,GCrBvBiB,IAAiBC,CAAAA,MAAAA,EAAAA;AAMC,QANMlB,WACnCA,GAAAF,SACAA,EAAAA,IAI6BqB;AAEtB,SCbaD,SACpBpB,GACAsB,GACApB;;AAEA,aAAOY,MAAM,GAAGd,CAAAA,GAAUsB,KAAY,EACpCP,QAAQ,QACRC,SAAS,EACP,gBAAgB,oBAChB,WAAWd,EAAAA,EAAAA,CAAAA,EAGZqB,KAAMC,OACD;AAAA,YAAA,CAACA,EAASC,GACZ,OAAM,IAAIpC,MAAM,gCAAgCmC,EAASE;AAE3D,eAAOF,EAASG,KAAK;AAAA,MAAA,CAAA,EAEtBJ,KAAMK,OACL;AAAA,YAAA,CAAKA,EACG,OAAA,IAAIvC,MAAM,sCAEX;AAAA,eAAAuC;AAAAA,MAAA,CAERC,EAAAA,MAAO5B,CAAAA,MACNF;AAAAA,QAAAA,EACEC,GACAC,GACA,yBACAC,CACF;AAAA,MAAA,CAAA;AAAA,IAEN;AAAA,IDnBgCF,GADb,qCACgCE,CAAAA;AAAS,IEU/C4B,IAAkBT,CAAAA,MAAAA;AAQzB,MAR0BU,EAAAA,QAC9BA,GAAAC,QACAA,GAAAhC,SACAA,EAAAA,IAKIqB;AACE,QAAAY,IAAWF,EAAOE,YAAY;AAW7B,SATL,CAAC,qBAAqB,uBAAuB,iBAC7CC,EAAAA,QAASC,CAAAA,MACLF;AAAAA,IAAAA,EAASE,OACXF,EAASE,CAAAA,IACPF,EAASE,CAAAA,EAhCDC,IAAKC,OACjBA,EAAOC,SAASrD,EAAWsD,YAAYF,EAAOG,QAC1CC,EAAAC,EAAA,IAAKL,IAAL,EAAaG,OAAO,IAAIG,SAAS,UAAUN,EAAOG,SAClDH,EAAAA,KAAAA,CAAAA;AAAAA,EA+BJ,CAGK,GAAAI,EAAAC,EAAA,IACFX,IADE,EAELE,UACAjC,GAAAA,SAAAA,GACA4C,YAAYb,EAAOc,YACnBb,QACFc,EAAA;AAAA,GCnDWC,IAAcC,CAAAA,YAClBA,gBAAAA,EAAWhD,YAAW,0BAGlBiD,IAAuBD,CAAAA,YAG3BA,gBAAAA,EAAWE,qBAAoBC,QCMlCC,KCbwBC,MAAAA;AACxB,MAAOC,OAAAA,UAAW,YAAa;AAC7B,QAAAC,IAAKD,OAAO7C,UAAUC;AAExB,MAAA,EADU6C,EAAGC,MAAM,OAAA,KAAcD,EAAGC,MAAM,YAC7B,QAAA;AACX,QAAAC,IAAUF,EAAGC,MAAM,YAAA;AACzB,SAAOC,KAAWC,SAASD,EAAQ,CAAA,GAAI,EAAO,KAAA;AAAA,GDkDnCE,GAAAA,IAAOvC,CAQdwC,MAAAC,EAAA;AAAA,MAAA,EARqB7D,SACzBA,GAAAE,WACAA,GAAAuD,SACAA,MAKIpC;AACA,MAAA;AACI,UAAAyC,IAAM,4DAA4DL,CAClEM,gBAAAA,IAAYX,IAASU,EAAIE,QAAQ,UAAU,YAAA,IAAgBF;AAIjE,WAAO,EAAEG,QAFHA;AArDJC,sBAASC,eAAe,kBAClBb,IAAAA,OAAec,YAGlB,IAAIC,QAAQ,CAACC,GAASC,MACrB;AAAA,cAAAC,IAASN,SAASO,cAAc,QACtCD;AAAAA,QAAAA,EAAOE,KAAK,oBACZF,EAAOG,MAAMb,GACNU,EAAAlC,OAAOc,IAAS,oBAAoB,UAC3CoB,EAAOpD,QAAAA,IACPoD,EAAOI,cAAc,aAErBJ,EAAOK,SAAS,MACdC;AAAAA,qBAAW,MACT;AAAA,kBAAMC,IAAUzB,OAAec;AAC/BW,YAAAA,IACIT,EAAQS,KACRR,EAAO,IAAIlF,MAAM,iCAAA,CAAA;AAAA,UAAkC,GACtD,GAAG;AAAA,QAAA,GAGDmF,EAAAQ,UAAWC,CAAAA;AAChB,gBAAMC,IAAaD,GACb7E,IAAe,EACnBb,SAAS,0BAA0BuE,CACnCxB,IAAAA,MAAM4C,EAAW5C,MACjB6C,UAAUD,EAAWE,UACrBC,YAAYH,EAAWI,QACvBC,cAAcL,EAAWM,OACzBvF,OAAOiF,EAAWjF,QAAQiF,EAAWjF,MAAMwF,SAAa,IAAA,gBAAA;AAE1DlB,UAAAA,EAAO,IAAIlF,MAAMgB,KAAKa,UAAUd,CAAc,CAAA,CAAA;AAAA,QAAA,GAG3CgD,KACMc,SAAAwB,KAAKC,YAAYnB;MAC5B,CAiBqBoB;AAAAA,QAAuB7B,CAE5C;WACO9D,GAAAA;AACPF,IAAAA,EACEC,GACAC,GACCA,EAAgBV,SACjBW;EAEJ;AAcF,IAAM2F,wBAAyBC,OAElBC,IAAmB3E,CAC9B5B,GAIAuC,MAAAA,EAAAA;AAEM,QAAA/B,IAAU+C,EAAWvD,EAAQwD,SAAAA;AAE/B;AAEF,QAAI6C,EAAmBG,IAAIxG,EAAQU,WAE1B;AAGH,UAAA+F,IAAetC,MAAAA,EAAK,EACxB3D,SACAE,GAAAA,WAAWV,EAAQU,WACnBuD,SAAS1B,EAAO0B,WAAW,SAE7B,CAAA;AAAA,QAAIwC,GAAQ;AACJ,YAAA,EAAAhC,QAAEA,EAAAA,IAAWgC,GAEbC,IAAoBpE,EAAgB,EACxCC,QAAAA,GACAC,QAAQxC,EAAQU,WAChBF,SAsBK,EAAA,CAAA;AAAA,aAnBHR,EAAQwD,aAAajB,EAAOE,YAE5BkE,OAAOC,QAAQ5G,EAAQwD,SAAAA,EAIvBd,QAAQmE,OAAAA;AAAkB,YAAhBlE,CAAAA,GAAKK,CAAW6D,IAAAA;AACtBtE,UAAOE,YAAYE,KAAOJ,EAAOE,aAClCF,EAAOE,SAASE,CAAAA,IFvHA,WAGxB;AAAA,cADHmE,IACGC,UAAAC,SAAAD,IAAAA;AACH,gBAAME,IAAY,IAAIC,KAHuBH,UAAAC,SAAA,KAAAD,UAAA,CAAAA,MAAApD,SAAAoD,UAAA,CAAA,IAAA,CAAA,GAI7BnE,IAAKC,CAAAA,MAAW,CAACA,EAAOsE,OAAOtE;AAG/C,iBADgBiE,EAAApE,QAASG,CAAAA,MAAWoE,EAAUG,IAAIvE,EAAOsE,OAAOtE,CAAAA,CAAAA,GACzDwE,MAAMC,KAAKL,EAAUM,OAC9B,CAAA;AAAA,QAAA,EEgHgBhF,EAAOE,SAASE,CAChBK,GAAAA,CAAAA;AAAAA,MAEN,IAxDV,SAA0ByB,GAAmBlC,GAEzCA;AAAAA,QAAAA,EAAOc,eAAe7D,EAAWG,aACjC4C,EAAOc,eAAe,WAEfoB,EAAA+C,aAAaC,aAAalF,CAAAA,IAE1BkC,EAAAiD,WAAWC,UAAUpF,CAEhC;AAAA,MAAA,EAmDuBkC,GAAQiC,CACNL,GAAAA,EAAAuB,IAAI5H,EAAQU,SAAAA,GACxB+D;AAAAA,IACT;AAAA,WACOhE,GAAAA;AACPF,IAAAA,EACEC,GACAC,GACCA,EAAgBV,SACjBC,EAAQU,SAAAA;AAAAA,EAEZ;AACO;AEtJT,IAAImH,IAAgC;AAEpC,MAwBaC,IAAyBlG,SACpClB,GACAqH,GACAvH;uCAFAE,GACAqH,GACAvH;AAEkB,QADlBkD,qEAhCyBC;AA4CzB,QAVKoE,KACHxH,EACEC,GACA,IAAIX,MAAM,wBACV,GAAA,0BACAa,KAKAmH,EAIA,KAAA;AACF/D,aAAOkE,mBAAmB,QAAQ,EAChCC,QAAQvE,GACRqE,WAAAA,GACAG,sBACAC,iBAAAA,IACAC,oBAAAA,OAGqBP,IAAA,IAAA,OArDMrH,CAAAA,GAAiBE;AAC5C,YAAAgE,SAASC,eAAe,qBAAA,EAC1B,QAAOb,OAAOkE;AAGV,cAAAhD,IAASN,SAASO,cAAc,QACtCD;AAAAA,QAAAA,EAAOE,KAAK,uBACZF,EAAOG,MAAM,iFACbH,EAAOlC,OAAO,UACdkC,EAAOpD,QAAAA,IACPoD,EAAOI,cAAc,aAErBJ,EAAOQ,UAAU,MACfjF;AAAAA,UAAAA,EACEC,GACA,IAAIX,MAAM,0BAA0BmF,EAAOG,GAC3C,EAAA,GAAA,0BAA0BH,EAAOG,GACjCzE,IAAAA,CAAAA;AAAAA,QACF,GAGOgE,SAAAwB,KAAKC,YAAYnB,CAAAA;AAAAA,MAAM,IAkCNxE,GAASE;aAC1BD,GAAAA;AACPF,MAAAA,EACEC,GACAC,GACA,2CACAC,CAAAA;AAAAA,IAEJ;AAAA,EACF;AAAA;AC3DA,IAAI2H,IAAyC;AAe7C,MAAMzD,IAZkB,OAAXd,UAAW,eAAgBA,OAAec,YAC3Cd,OAAec,aAEpByD,MACHA,ICTG;AACL,MAAIC,IAA2B,CAC3BC,GAAAA,IAAkC;AAE7B,WAAAC,EAAejH,GAAgBkH,GAAAA;AACtC,QAAIF,GAAe;AACX,YAAAG,IAAQnH,EAAOoH,MAAM,GAC3B;AAAA,UAAIC,IAAWL;AACf,eAASjF,IAAI,GAAGA,IAAIoF,EAAM1B,SAAS,GAAG1D,IAC9BsF,CAAAA,IAAAA,EAAIF,EAAMpF,CAAAA,CAAAA;AAElB,YAAMuF,IAAKD,EAAIF,EAAMA,EAAM1B,SAAS,CAChC,CAAA;AAAA,UAAO6B,OAAAA,KAAO,WACT,QAAAA,EAAGC,MAAMF,GAAKH,CAAAA;AAAAA,IAEzB,MACEH,CAAAA,EAAMS,KAAK,CAACxH,GAAQkH;EAExB;AA0BO,SAxBgC,EACrCO,SAAS,EACP7E,MAAM,WAAA;AAAA,aAAA8E,IAAAlC,UAAAC,QAAIyB,IAAgBpB,IAAAA,MAAA4B,CAAAA,GAAAC,IAAA,GAAAA,IAAAD,GAAAC,IAAhBT,CAAAA,EAAgBS,CAAAA,IAAAnC,UAAAmC,CAAA;AAAA,WAAAV,EAAe,gBAAgBC;EAAI,EAE/DjB,GAAAA,cAAc,EACZC,cAAc;AAAA,aAAA0B,IAAApC,UAAAC,QAAIyB,IAChBpB,IAAAA,MAAA8B,IAAAC,IAAA,GAAAA,IAAAD,GAAAC,IADgBX,CAAAA,EAChBW,CAAAA,IAAArC,UAAAqC,CAAAA;AAAA,WAAAZ,EAAe,6BAA6BC,CAAI;AAAA,EAAA,EAAA,GAEpDf,YAAY,EACVC,WAAW,WAAA;AAAA,aAAA0B,IAAAtC,UAAAC,QAAIyB,IACbpB,IAAAA,MAAAgC,CAAAA,GAAAC,IAAA,GAAAA,IAAAD,GAAAC,IADab,CAAAA,EACba,CAAAA,IAAAvC,UAAAuC,CAAA;AAAA,WAAAd,EAAe,wBAAwBC;EAAI,GAC7Cc,OAAO,WAAA;AAAA,aAAAC,IAAAzC,UAAAC,QAAIyB,IAAgBpB,IAAAA,MAAAmC,CAAAA,GAAAC,IAAA,GAAAA,IAAAD,GAAAC,IAAhBhB,CAAAA,EAAgBgB,CAAAA,IAAA1C,UAAA0C,CAAA;AAAA,WAAAjB,EAAe,oBAAoBC;EAAI,GAClEiB,MAAM,WAAA;AAAA,aAAAC,IAAA5C,UAAAC,QAAIyB,IAAgBpB,IAAAA,MAAAsC,CAAAC,GAAAA,IAAA,GAAAA,IAAAD,GAAAC,IAAhBnB,CAAAA,EAAgBmB,KAAA7C,UAAA6C,CAAAA;AAAA,WAAApB,EAAe,mBAAmBC,CAAI;AAAA,EAAA,GAChEoB,QAAQ,WAAA;AAAA,aAAAC,IAAA/C,UAAAC,QAAIyB,IAAgBpB,IAAAA,MAAAyC,CAAAC,GAAAA,IAAA,GAAAA,IAAAD,GAAAC,IAAhBtB,CAAAA,EAAgBsB,KAAAhD,UAAAgD,CAAAA;AAAA,WAAAvB,EAAe,qBAAqBC,CAAI;AAAA,EAAA,EAAA,GAEtEuB,mBAAmB,SAAUC;AAEpB,SADS1B,IAAA0B,GACT3B,EAAMtB,SAAS,KAAG;AACvB,YAAOzF,CAAAA,GAAQkH,KAAQH,EAAM4B,MAAAA;AAC7B1B,MAAAA,EAAejH,GAAQkH;IACzB;AAAA,EACF,EAAA;AAIJ,EDnC0B,GAAA,OAAX3E,UAAW,gBACnBA,OAAec,YAAYyD,KAGzBA;AAKT,IAAI8B,IAA8C;AAiClDvF,EAAUoE,QAAQ7E,OAAOvC,CAAAA,MAAAA,EAAAA;AAGJ,MAAAwI;AE/DftG,aACFA,OAAOkE,qBACLlE,OAAOkE,sBACP,WAAuC;AAAA,aAAAiB,IAAAlC,UAAAC,QAA1ByB,IAA0BpB,IAAAA,MAAA4B,CAAAA,GAAAC,IAAA,GAAAA,IAAAD,GAAAC,IAA1BT,CAAAA,EAA0BS,CAAAA,IAAAnC,UAAAmC,CACpCpF;AAAAA,KAAAA,OAAOkE,mBAAmBqC,IAAIvG,OAAOkE,mBAAmBqC,KAAK,CAAItB,GAAAA,KAChEN;;AF6DF,QAAAjI,IAAU+C,EAAWvD,EAAQwD,SAC7BE,GAAAA,IAAmBD,EAAoBzD,EAAQwD,cAE/CjB,QAAEA,EAAAA,IAAAA,MAAiBZ,EAAe,EACtCjB,WAAWV,EAAQU,WACnBF,SAGG2J,EAAAA,CAAAA;AAAAA,EAAAA,MAEqBA,IA/C5BvI,SACE5B,GAIAuC,GACA/B,GACAkD;;AACe,UAAA4G;AACf,YAAMC,IAAwD,CAC5DhE,EAAiBvG,GAASuC;OAExB+H,IAAA/H,EAAOE,4BAAAA,UAAP6H,EAAiBE,kBACND,EAAAxB,KACXjB,EACE9H,EAAQU,WACR6B,EAAOkI,iBAAiB,IACxBjK,GACAkD,CAAAA,CAAAA;AAKN,YAAOgH,CAAAA,CAAAA,IAAAA,MAAuB7F,QAAQ8F,WAAWJ,CAAAA;AAGpB,MAAzBG,EAAcxI,WAAW,eAAewI,EAAc1H,SAC9C4B,EAAAoF,kBAAkBU,EAAc1H,KAE9C;AAAA,IAAA;AAAA,IAmBMhD,GACAuC,GACA/B,GACAkD,CAAAA,IAAAA,MAKEyG;AAGN,QAAMI,IAAwD,CAC5DhE,EAAiBvG,GAASuC,CAAAA,CAAAA;AAExB,OAAA6H,IAAA7H,EAAOE,4BAAAA,UAAP2H,EAAiBI,gBAAgB;AAC7B9G,UAAAA,IAAmBD,EAAoBzD,EAAQwD,SAAAA;AAExC+G,IAAAA,EAAAxB,KACXjB,EACE9H,EAAQU,WACR6B,EAAOkI,iBAAiB,IACxBjK,GACAkD,CAAAA,CAAAA;AAAAA,EAGN;QAEMmB,QAAQ8F,WAAWJ,CAAY;AAAA;AAK1BvC,MAAAA,IAAqB,WAAA;AAGV,EAAXlE,OAAAA,UAAW,eAAeA,OAAOkE,sBACnClE,OAAAkE,mBAAmBjB,GAAAA,SAAAA;AAE9B;"}
|
package/package.json
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brainfish-ai/widgets-initiator",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"main": "dist/
|
|
5
|
-
"
|
|
3
|
+
"version": "1.3.0-beta.3",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.js",
|
|
6
|
+
"types": "dist/types/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"description": "Brainfish Widgets Manager",
|
|
6
11
|
"type": "module",
|
|
7
|
-
"private": false,
|
|
8
12
|
"scripts": {
|
|
9
13
|
"start": "vite",
|
|
10
14
|
"dev": "vite",
|
|
11
|
-
"build": "vite build",
|
|
12
|
-
"
|
|
15
|
+
"build:vite": "vite build",
|
|
16
|
+
"build:types": "tsc --emitDeclarationOnly",
|
|
17
|
+
"build": "yarn build:vite && yarn build:types",
|
|
18
|
+
"serve": "vite preview --port 6006",
|
|
19
|
+
"test": "vitest --watch=false"
|
|
13
20
|
},
|
|
14
21
|
"license": "MIT",
|
|
15
22
|
"devDependencies": {
|
|
16
|
-
"@
|
|
17
|
-
"@
|
|
23
|
+
"@babel/plugin-transform-nullish-coalescing-operator": "^7.18.6",
|
|
24
|
+
"@babel/plugin-transform-optional-chaining": "^7.21.0",
|
|
25
|
+
"@brainfish-ai/widgets-common": "1.0.7",
|
|
26
|
+
"@rollup/plugin-babel": "^6.0.4",
|
|
27
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
28
|
+
"@sentry/vite-plugin": "^2.22.4",
|
|
18
29
|
"animated-tailwindcss": "^4.0.0",
|
|
19
30
|
"autoprefixer": "^10.4.16",
|
|
20
|
-
"dotenv": "^16.4.5",
|
|
21
31
|
"postcss": "^8.4.31",
|
|
22
|
-
"rollup-plugin-
|
|
23
|
-
"tailwindcss": "^3.3
|
|
24
|
-
"typescript": "^5.
|
|
25
|
-
"vite": "^
|
|
26
|
-
"
|
|
27
|
-
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"@brainfish-ai/search-widget": "^0.4.1",
|
|
30
|
-
"@brainfish-ai/widgets-common": "^1.0.3",
|
|
31
|
-
"@fingerprintjs/fingerprintjs": "^4.2.1",
|
|
32
|
-
"lodash": "^4.17.21",
|
|
33
|
-
"phosphor-solid": "^1.1.5",
|
|
34
|
-
"solid-element": "1.8.0",
|
|
35
|
-
"solid-js": "^1.8.5"
|
|
32
|
+
"rollup-plugin-visualizer": "^5.12.0",
|
|
33
|
+
"tailwindcss": "^3.4.3",
|
|
34
|
+
"typescript": "^5.4.5",
|
|
35
|
+
"vite": "^5.2.12",
|
|
36
|
+
"vitest": "^2.0.5"
|
|
36
37
|
},
|
|
37
38
|
"keywords": [
|
|
38
39
|
"typescript",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"animate"
|
|
40
|
+
"web",
|
|
41
|
+
"brainfish",
|
|
42
|
+
"in-app"
|
|
43
43
|
]
|
|
44
|
-
}
|
|
44
|
+
}
|
package/.prettierignore
DELETED
package/.prettierrc
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<title>Build Test</title>
|
|
6
|
-
<script type="module">
|
|
7
|
-
import Brainfish from 'http://localhost:6006/web.js'
|
|
8
|
-
// import Brainfish from 'https://cdn.jsdelivr.net/npm/@brainfish-ai/widgets-initiator@1.0.1/dist/web.js'
|
|
9
|
-
|
|
10
|
-
// searchbar
|
|
11
|
-
// Brainfish.Widgets.init({ widgetKey: "bf_search_widget_3tBCyvJ3eGipqUxJcOQbVyvNeHf7Dhe0dZtqF4" });
|
|
12
|
-
// sidebar
|
|
13
|
-
Brainfish.Widgets.init({
|
|
14
|
-
widgetKey: "bf_search_widget_pOxcrTX3aprz1JRzhQzoAp6IWqjy8WH3U0h6aM", overrides: {
|
|
15
|
-
"bodyActionButtons": [
|
|
16
|
-
{
|
|
17
|
-
"icon": "Calendar",
|
|
18
|
-
"type": "callback",
|
|
19
|
-
"label": "Book a Demo",
|
|
20
|
-
"value": () => { window.Brainfish.HelpWidget.close('#root'); console.log('test2') }
|
|
21
|
-
}
|
|
22
|
-
]
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
</script>
|
|
27
|
-
<script src="https://unpkg.com/@phosphor-icons/web" async></script>
|
|
28
|
-
<style>
|
|
29
|
-
.brainfish-trigger-button {
|
|
30
|
-
position: fixed;
|
|
31
|
-
border-radius: 24px 4px 16px 24px;
|
|
32
|
-
height: 32px !important;
|
|
33
|
-
padding: 0 10px;
|
|
34
|
-
width: unset !important;
|
|
35
|
-
bottom: 40px;
|
|
36
|
-
right: 40px;
|
|
37
|
-
background-color: #501ec4 !important;
|
|
38
|
-
color: #FFF;
|
|
39
|
-
text-align: center;
|
|
40
|
-
box-shadow: 2px 2px 3px #999;
|
|
41
|
-
cursor: pointer;
|
|
42
|
-
z-index: 9995;
|
|
43
|
-
border: none;
|
|
44
|
-
display: flex;
|
|
45
|
-
align-items: center;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.ph {
|
|
49
|
-
font-size: 18px;
|
|
50
|
-
margin-right: 5px;
|
|
51
|
-
}
|
|
52
|
-
</style>
|
|
53
|
-
</head>
|
|
54
|
-
|
|
55
|
-
<body>
|
|
56
|
-
<!-- <brainfish-search-widget /> -->
|
|
57
|
-
|
|
58
|
-
<script type="text/javascript" src="https://assets.calendly.com/assets/external/widget.js"></script>
|
|
59
|
-
|
|
60
|
-
<button class="brainfish-trigger-button" onClick="Brainfish.HelpWidget.open('brainfish-trigger-button')"><i
|
|
61
|
-
class="ph ph-question"></i>Help</button>
|
|
62
|
-
</body>
|
|
63
|
-
|
|
64
|
-
</html>
|
package/index.html
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<meta name="theme-color" content="#000000" />
|
|
7
|
-
<link rel="shortcut icon" type="image/ico" href="/src/assets/favicon.ico" />
|
|
8
|
-
<title>Solid App</title>
|
|
9
|
-
<style>
|
|
10
|
-
body {
|
|
11
|
-
background: #666;
|
|
12
|
-
}
|
|
13
|
-
</style>
|
|
14
|
-
<script type="text/javascript" src="https://assets.calendly.com/assets/external/widget.js"></script>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
<!-- WIDGET INITIATOR - BEGINS -->
|
|
18
|
-
<script type="module">
|
|
19
|
-
// import Brainfish from '/dist/web.js';
|
|
20
|
-
import Brainfish from '/src/web.ts';
|
|
21
|
-
Brainfish.Widgets.init({ widgetKey: "bf_search_widget_QO3mYiUZRYX78ztRhNC4zH3R5iQ0E3sgRwunjz" }); // Replace with your sidebar widget key
|
|
22
|
-
Brainfish.Widgets.init({ widgetKey: "bf_search_widget_CPvciWdjZMXMhKJfEGNvno7oqHkOVjc3rRaHz7" }); // Replace with your searchbar widget key
|
|
23
|
-
</script>
|
|
24
|
-
<script src="https://unpkg.com/@phosphor-icons/web" async></script>
|
|
25
|
-
<style>
|
|
26
|
-
.brainfish-trigger-button {
|
|
27
|
-
position: fixed;
|
|
28
|
-
border-radius: 24px 4px 16px 24px;
|
|
29
|
-
height: 32px !important;
|
|
30
|
-
padding: 0 10px;
|
|
31
|
-
width: unset !important;
|
|
32
|
-
bottom: 40px;
|
|
33
|
-
right: 40px;
|
|
34
|
-
background-color: #501ec4 !important;
|
|
35
|
-
color: #FFF;
|
|
36
|
-
text-align: center;
|
|
37
|
-
box-shadow: 2px 2px 3px #999;
|
|
38
|
-
cursor: pointer;
|
|
39
|
-
z-index: 9995;
|
|
40
|
-
border: none;
|
|
41
|
-
display: flex;
|
|
42
|
-
align-items: center;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.ph {
|
|
46
|
-
font-size: 18px;
|
|
47
|
-
margin-right: 5px;
|
|
48
|
-
}
|
|
49
|
-
</style>
|
|
50
|
-
<!-- WIDGET INITIATOR - ENDS -->
|
|
51
|
-
</head>
|
|
52
|
-
<body style="display: flex">
|
|
53
|
-
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
54
|
-
<div id="root"></div>
|
|
55
|
-
<main style="width:80%">
|
|
56
|
-
<brainfish-search-widget />
|
|
57
|
-
</main>
|
|
58
|
-
<aside style="width: 20%">
|
|
59
|
-
<button class="brainfish-trigger-button" onClick="Brainfish.HelpWidget.open('brainfish-trigger-button')"><i
|
|
60
|
-
class="ph ph-question"></i>Help</button>
|
|
61
|
-
</aside>
|
|
62
|
-
</body>
|
|
63
|
-
</html>
|
package/postcss.config.cjs
DELETED
package/src/register.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// registers the web components
|
|
2
|
-
import { customElement } from "solid-element";
|
|
3
|
-
import { WIDGET_NAMES, WidgetType } from "./types/brainfish";
|
|
4
|
-
import SearchBar from './widgets/search-bar';
|
|
5
|
-
import Sidebar from "./widgets/sidebar";
|
|
6
|
-
import { SearchbarProps, SidebarProps } from "./widgets/initialize";
|
|
7
|
-
|
|
8
|
-
export function registerSearchBarWebComponent() {
|
|
9
|
-
if (typeof window === "undefined")
|
|
10
|
-
return false;
|
|
11
|
-
customElement(WIDGET_NAMES[WidgetType.Searchbar], getInitialSearchbarProps(), SearchBar);
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function registerSidebarWebComponent() {
|
|
16
|
-
if (typeof window === "undefined")
|
|
17
|
-
return false;
|
|
18
|
-
customElement(WIDGET_NAMES[WidgetType.Sidebar], getInitialSidebarProps(), Sidebar);
|
|
19
|
-
debugger;
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function getInitialSidebarProps(): SidebarProps {
|
|
24
|
-
return {
|
|
25
|
-
widgetMode: 'sidebar'
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function getInitialSearchbarProps(): SearchbarProps {
|
|
30
|
-
return {};
|
|
31
|
-
}
|
package/src/web.ts
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
// web.ts
|
|
2
|
-
// entry point for web component
|
|
3
|
-
import * as Common from '@brainfish-ai/widgets-common';
|
|
4
|
-
import {
|
|
5
|
-
Config,
|
|
6
|
-
CallbackAction,
|
|
7
|
-
Action,
|
|
8
|
-
Settings,
|
|
9
|
-
} from '@brainfish-ai/widgets-common';
|
|
10
|
-
|
|
11
|
-
const API_HOST = import.meta.env.VITE_API_HOST;
|
|
12
|
-
|
|
13
|
-
function mapActionButtons(
|
|
14
|
-
actionButtons: (CallbackAction | Action)[]
|
|
15
|
-
): (CallbackAction | Action)[] {
|
|
16
|
-
return actionButtons.map((action) => {
|
|
17
|
-
if (action.type === Common.ActionType.CALLBACK) {
|
|
18
|
-
return {
|
|
19
|
-
...action,
|
|
20
|
-
value: new Function(`return ${action.value}`)(),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
return action;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const transformConfig = ({
|
|
28
|
-
config,
|
|
29
|
-
apiKey,
|
|
30
|
-
}: {
|
|
31
|
-
config: Config;
|
|
32
|
-
apiKey: string;
|
|
33
|
-
}) => {
|
|
34
|
-
if (!!config.settings?.bodyActionButtons) {
|
|
35
|
-
config.settings.bodyActionButtons = mapActionButtons(
|
|
36
|
-
config.settings.bodyActionButtons
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
if (!!config.settings?.footerActionButtons) {
|
|
40
|
-
config.settings.footerActionButtons = mapActionButtons(
|
|
41
|
-
config.settings.footerActionButtons
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
if (!!config.settings?.nextBestActions) {
|
|
45
|
-
config.settings.nextBestActions = mapActionButtons(
|
|
46
|
-
config.settings.nextBestActions
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
...config,
|
|
51
|
-
apiHost: `${API_HOST}`,
|
|
52
|
-
widgetMode: config.widgetType,
|
|
53
|
-
apiKey,
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const init = async ({
|
|
58
|
-
widgetKey,
|
|
59
|
-
overrides,
|
|
60
|
-
}: {
|
|
61
|
-
widgetKey: string;
|
|
62
|
-
overrides?: Pick<
|
|
63
|
-
Settings,
|
|
64
|
-
'nextBestActions' | 'bodyActionButtons' | 'footerActionButtons'
|
|
65
|
-
>;
|
|
66
|
-
}) => {
|
|
67
|
-
const endpoint = `${API_HOST}/api/searchWidgets.getConfigByKey`;
|
|
68
|
-
|
|
69
|
-
const configResponse = await fetch(endpoint, {
|
|
70
|
-
method: 'POST',
|
|
71
|
-
headers: {
|
|
72
|
-
'Content-Type': 'application/json',
|
|
73
|
-
'api-key': widgetKey,
|
|
74
|
-
},
|
|
75
|
-
})
|
|
76
|
-
.then((response) => response.json())
|
|
77
|
-
.catch((error) => console.log('Error loading widget config', error));
|
|
78
|
-
|
|
79
|
-
if (!configResponse) {
|
|
80
|
-
console.log('Error loading widget config');
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const config = transformConfig({
|
|
85
|
-
config: configResponse.config,
|
|
86
|
-
apiKey: widgetKey,
|
|
87
|
-
});
|
|
88
|
-
const version = config.version || 'latest';
|
|
89
|
-
|
|
90
|
-
if (overrides) {
|
|
91
|
-
const { nextBestActions, bodyActionButtons, footerActionButtons } =
|
|
92
|
-
overrides;
|
|
93
|
-
|
|
94
|
-
const updateActions = (
|
|
95
|
-
configActions: (Action | CallbackAction)[] = [],
|
|
96
|
-
overrideActions: (Action | CallbackAction)[]
|
|
97
|
-
) => {
|
|
98
|
-
// Create a map from the configActions array, using the action label as the key
|
|
99
|
-
const actionMap = new Map(
|
|
100
|
-
configActions.map((action) => [action.label, action])
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
// Update the actionMap with the overrideActions.
|
|
104
|
-
// If an action with the same label already exists in the map, it will be updated.
|
|
105
|
-
// If it doesn't exist, it will be added to the map.
|
|
106
|
-
overrideActions.forEach((action) => actionMap.set(action.label, action));
|
|
107
|
-
|
|
108
|
-
// Convert the map back to an array and return it
|
|
109
|
-
return Array.from(actionMap.values());
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
config.settings = {
|
|
113
|
-
...config.settings,
|
|
114
|
-
nextBestActions: nextBestActions
|
|
115
|
-
? updateActions(config.settings?.nextBestActions, nextBestActions)
|
|
116
|
-
: config.settings?.nextBestActions,
|
|
117
|
-
bodyActionButtons: bodyActionButtons
|
|
118
|
-
? updateActions(config.settings?.bodyActionButtons, bodyActionButtons)
|
|
119
|
-
: config.settings?.bodyActionButtons,
|
|
120
|
-
footerActionButtons: footerActionButtons
|
|
121
|
-
? updateActions(
|
|
122
|
-
config.settings?.footerActionButtons,
|
|
123
|
-
footerActionButtons
|
|
124
|
-
)
|
|
125
|
-
: config.settings?.footerActionButtons,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// import the widget based on the version from cdn.jsdelivr.net
|
|
130
|
-
const { default: widget } = await import(
|
|
131
|
-
`https://cdn.jsdelivr.net/npm/@brainfish-ai/search-widget@${version}/dist/web.js`
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
switch (config.widgetType) {
|
|
135
|
-
case Common.WidgetType.Searchbar:
|
|
136
|
-
case 'Search':
|
|
137
|
-
widget.SearchWidget.initStandard(config);
|
|
138
|
-
break;
|
|
139
|
-
case Common.WidgetType.Sidebar:
|
|
140
|
-
case 'slide-over': // for backwards compatibility
|
|
141
|
-
widget.HelpWidget.initPopup(config);
|
|
142
|
-
break;
|
|
143
|
-
default:
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const brainfish = {
|
|
149
|
-
Widgets: { init }
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (brainfish) {
|
|
153
|
-
Common.injectBrainfishInWindow(brainfish);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export default brainfish;
|
package/tailwind.config.cjs
DELETED
package/tsconfig.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"strict": true,
|
|
4
|
-
"target": "ESNext",
|
|
5
|
-
"module": "ESNext",
|
|
6
|
-
"moduleResolution": "node",
|
|
7
|
-
"allowSyntheticDefaultImports": true,
|
|
8
|
-
"esModuleInterop": true,
|
|
9
|
-
"jsx": "preserve",
|
|
10
|
-
"jsxImportSource": "solid-js",
|
|
11
|
-
"types": ["vite/client"],
|
|
12
|
-
"baseUrl": "."
|
|
13
|
-
}
|
|
14
|
-
}
|
package/vite.config.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vite';
|
|
2
|
-
import solidPlugin from 'vite-plugin-solid';
|
|
3
|
-
import { terser } from 'rollup-plugin-terser';
|
|
4
|
-
import replace from '@rollup/plugin-replace';
|
|
5
|
-
import dotenv from 'dotenv';
|
|
6
|
-
|
|
7
|
-
const env = dotenv.config().parsed as { [key: string]: string };
|
|
8
|
-
|
|
9
|
-
export default defineConfig({
|
|
10
|
-
plugins: [
|
|
11
|
-
solidPlugin(),
|
|
12
|
-
replace({
|
|
13
|
-
values: {
|
|
14
|
-
'import.meta.env.VITE_API_HOST': JSON.stringify(env['VITE_API_HOST']),
|
|
15
|
-
'?inline': '',
|
|
16
|
-
},
|
|
17
|
-
preventAssignment: true,
|
|
18
|
-
}),
|
|
19
|
-
],
|
|
20
|
-
build: {
|
|
21
|
-
target: 'esnext',
|
|
22
|
-
sourcemap: true,
|
|
23
|
-
lib: {
|
|
24
|
-
entry: 'src/web.ts',
|
|
25
|
-
formats: ['es', 'cjs'],
|
|
26
|
-
fileName: (format) => `web${format === 'es' ? '' : '.cjs'}.js`,
|
|
27
|
-
},
|
|
28
|
-
minify: false,
|
|
29
|
-
rollupOptions: {
|
|
30
|
-
plugins: [terser()],
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
});
|