@humanfirst-chat/js 0.1.0 → 0.1.1

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 ADDED
@@ -0,0 +1,74 @@
1
+ # HumanFirst.chat JS SDK
2
+
3
+ JavaScript SDK for embedding the HumanFirst.chat widget and controlling it
4
+ from your app.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ pnpm add @humanfirst-chat/js
10
+ ```
11
+
12
+ ## Quick start (React / Next.js)
13
+
14
+ ```tsx
15
+ "use client";
16
+
17
+ import { useEffect } from "react";
18
+ import HFChat from "@humanfirst-chat/js";
19
+
20
+ export function SupportChat() {
21
+ useEffect(() => {
22
+ void HFChat.init({ siteId: "YOUR_SITE_ID" });
23
+ }, []);
24
+
25
+ return null;
26
+ }
27
+ ```
28
+
29
+ ## Identify a user
30
+
31
+ ```ts
32
+ HFChat.identify({
33
+ email: "jane@example.com",
34
+ name: "Jane Doe",
35
+ userId: "user_123",
36
+ plan: "pro",
37
+ });
38
+ ```
39
+
40
+ ## Control visibility
41
+
42
+ ```ts
43
+ HFChat.show();
44
+ HFChat.hide();
45
+ HFChat.open();
46
+ HFChat.close();
47
+ HFChat.toggle();
48
+ ```
49
+
50
+ ## Configuration
51
+
52
+ ```ts
53
+ HFChat.init({
54
+ siteId: "YOUR_SITE_ID",
55
+ hidden: false,
56
+ logs: "minimal",
57
+ });
58
+ ```
59
+
60
+ ## Advanced (self-hosted / custom CDN)
61
+
62
+ ```ts
63
+ void HFChat.init({
64
+ siteId: "YOUR_SITE_ID",
65
+ scriptSrc: "https://cdn.example.com/widget.js",
66
+ baseURL: "https://your-hfchat.example.com",
67
+ });
68
+ ```
69
+
70
+ ## Notes
71
+
72
+ - Client-side only: call `HFChat.init()` in the browser (e.g. `useEffect`).
73
+ - On localhost, `siteId` is required.
74
+ - Methods are queued until the widget finishes loading.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,45 @@
1
- import { HFChatAPI, HFChatConfig } from '@chat/shared';
2
- export { HFChatAPI, HFChatConfig, HFChatIdentifyMeta, HFChatLogLevel, HFChatWidgetSettings } from '@chat/shared';
1
+ /**
2
+ * Public types for the HumanFirst.chat JS SDK.
3
+ */
4
+ type HFChatLogLevel = 'none' | 'minimal' | 'full';
5
+ type HFChatPosition = 'left' | 'right';
6
+ type HFChatSize = 'xs' | 'small' | 'medium' | 'large';
7
+ interface HFChatConfig {
8
+ /** Site ID from HumanFirst.chat dashboard */
9
+ siteId?: string;
10
+ /** Start with widget hidden */
11
+ hidden?: boolean;
12
+ /** Log verbosity level */
13
+ logs?: HFChatLogLevel;
14
+ /** Override API base URL (for self-hosting/testing) */
15
+ baseURL?: string;
16
+ /** Override website host for site resolution (testing) */
17
+ host?: string;
18
+ }
19
+ interface HFChatWidgetSettings {
20
+ widgetColor?: string;
21
+ widgetPosition?: HFChatPosition;
22
+ widgetSize?: HFChatSize;
23
+ }
24
+ interface HFChatIdentifyMeta {
25
+ email?: string;
26
+ name?: string;
27
+ [key: string]: unknown;
28
+ }
29
+ interface HFChatAPI {
30
+ show(): void;
31
+ hide(): void;
32
+ open(): void;
33
+ close(): void;
34
+ toggle(): void;
35
+ isOpen(): boolean;
36
+ identify(meta: HFChatIdentifyMeta): void;
37
+ configure(settings: HFChatWidgetSettings): void;
38
+ onReady(callback: () => void): void;
39
+ onOpen(callback: () => void): void;
40
+ onClose(callback: () => void): void;
41
+ readonly ready: boolean;
42
+ }
3
43
 
4
44
  type HFChatLoaderConfig = HFChatConfig & {
5
45
  /** Override widget script source (for self-hosting / testing) */
@@ -21,4 +61,4 @@ declare global {
21
61
  }
22
62
  declare const HFChat: HFChatGlobal;
23
63
 
24
- export { HFChat, type HFChatGlobal, type HFChatLoaderConfig, HFChat as default };
64
+ export { HFChat, type HFChatAPI, type HFChatConfig, type HFChatGlobal, type HFChatIdentifyMeta, type HFChatLoaderConfig, type HFChatLogLevel, type HFChatWidgetSettings, HFChat as default };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,45 @@
1
- import { HFChatAPI, HFChatConfig } from '@chat/shared';
2
- export { HFChatAPI, HFChatConfig, HFChatIdentifyMeta, HFChatLogLevel, HFChatWidgetSettings } from '@chat/shared';
1
+ /**
2
+ * Public types for the HumanFirst.chat JS SDK.
3
+ */
4
+ type HFChatLogLevel = 'none' | 'minimal' | 'full';
5
+ type HFChatPosition = 'left' | 'right';
6
+ type HFChatSize = 'xs' | 'small' | 'medium' | 'large';
7
+ interface HFChatConfig {
8
+ /** Site ID from HumanFirst.chat dashboard */
9
+ siteId?: string;
10
+ /** Start with widget hidden */
11
+ hidden?: boolean;
12
+ /** Log verbosity level */
13
+ logs?: HFChatLogLevel;
14
+ /** Override API base URL (for self-hosting/testing) */
15
+ baseURL?: string;
16
+ /** Override website host for site resolution (testing) */
17
+ host?: string;
18
+ }
19
+ interface HFChatWidgetSettings {
20
+ widgetColor?: string;
21
+ widgetPosition?: HFChatPosition;
22
+ widgetSize?: HFChatSize;
23
+ }
24
+ interface HFChatIdentifyMeta {
25
+ email?: string;
26
+ name?: string;
27
+ [key: string]: unknown;
28
+ }
29
+ interface HFChatAPI {
30
+ show(): void;
31
+ hide(): void;
32
+ open(): void;
33
+ close(): void;
34
+ toggle(): void;
35
+ isOpen(): boolean;
36
+ identify(meta: HFChatIdentifyMeta): void;
37
+ configure(settings: HFChatWidgetSettings): void;
38
+ onReady(callback: () => void): void;
39
+ onOpen(callback: () => void): void;
40
+ onClose(callback: () => void): void;
41
+ readonly ready: boolean;
42
+ }
3
43
 
4
44
  type HFChatLoaderConfig = HFChatConfig & {
5
45
  /** Override widget script source (for self-hosting / testing) */
@@ -21,4 +61,4 @@ declare global {
21
61
  }
22
62
  declare const HFChat: HFChatGlobal;
23
63
 
24
- export { HFChat, type HFChatGlobal, type HFChatLoaderConfig, HFChat as default };
64
+ export { HFChat, type HFChatAPI, type HFChatConfig, type HFChatGlobal, type HFChatIdentifyMeta, type HFChatLoaderConfig, type HFChatLogLevel, type HFChatWidgetSettings, HFChat as default };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Re-export shared types for consumers\nexport type {\n HFChatLogLevel,\n HFChatConfig,\n HFChatWidgetSettings,\n HFChatIdentifyMeta,\n HFChatAPI,\n} from '@chat/shared'\n\nimport type {\n HFChatConfig,\n HFChatAPI,\n} from '@chat/shared'\n\n// Extended config for the JS SDK loader (adds scriptSrc option)\nexport type HFChatLoaderConfig = HFChatConfig & {\n /** Override widget script source (for self-hosting / testing) */\n scriptSrc?: string\n}\n\nexport type HFChatGlobal = HFChatAPI & {\n /**\n * Load the widget script and initialize the widget.\n */\n init(opts?: HFChatLoaderConfig): Promise<HFChatAPI>\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getRealApi(selfProxy: HFChatGlobal): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n const candidate = window.HFChat\n if (!candidate) return null\n if (candidate === selfProxy) return null\n return candidate as HFChatAPI\n}\n\nfunction injectScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof document === 'undefined') return resolve()\n if (window.HumanFirstChat) return resolve()\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true })\n existing.addEventListener(\n 'error',\n () => reject(new Error('Failed to load widget script')),\n { once: true }\n )\n return\n }\n\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.onerror = () => reject(new Error(`Failed to load widget script: ${src}`))\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) resolve()\n else reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }, 0)\n }\n document.head.appendChild(script)\n })\n}\n\nasync function loadWidget(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (typeof window === 'undefined') return {} as HFChatAPI\n\n const scriptSrc = opts.scriptSrc ?? DEFAULT_SCRIPT_SRC\n await injectScript(scriptSrc)\n\n if (!window.HumanFirstChat?.init) {\n throw new Error('HumanFirstChat.init is not available after script load')\n }\n\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n return api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n lastInitOpts = { ...lastInitOpts, ...opts }\n\n const existingApi = getRealApi(HFChat)\n if (existingApi) return existingApi\n\n if (loaderPromise) return loaderPromise\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nasync function waitForMethod(methodName: string): Promise<HFChatAPI> {\n await init()\n\n const existing = getRealApi(HFChat)\n if (existing && typeof (existing as any)[methodName] === 'function') return existing\n\n return new Promise((resolve, reject) => {\n let attempts = 0\n const maxAttempts = 50\n\n const checkMethod = () => {\n const api = getRealApi(HFChat)\n const fn = api ? (api as any)[methodName] : null\n\n if (api && typeof fn === 'function') {\n resolve(api)\n return\n }\n\n if (attempts < maxAttempts) {\n attempts += 1\n setTimeout(checkMethod, 100)\n return\n }\n\n reject(new Error(`HFChat method '${methodName}' not available after 5 seconds`))\n }\n\n setTimeout(checkMethod, 100)\n })\n}\n\nexport const HFChat: HFChatGlobal = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === 'init') return init\n\n if (typeof window === 'undefined') return () => {}\n\n if (prop === 'ready') {\n const api = getRealApi(HFChat)\n return !!api?.ready\n }\n\n if (prop === 'isOpen') {\n return () => {\n const api = getRealApi(HFChat)\n return api?.isOpen?.() ?? false\n }\n }\n\n return (...args: unknown[]) => {\n const methodName = String(prop)\n waitForMethod(methodName)\n .then((api) => {\n const fn = (api as any)[methodName]\n if (typeof fn === 'function') fn.apply(api, args)\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : error)\n })\n }\n },\n }\n) as HFChatGlobal\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton (like HEYO), without breaking when the real widget assigns window.HFChat.\n if (!window.HFChat) window.HFChat = HFChat\n}\n\nexport default HFChat\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Re-export public types for consumers\nexport type {\n HFChatLogLevel,\n HFChatConfig,\n HFChatWidgetSettings,\n HFChatIdentifyMeta,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI } from './types'\n\n// Extended config for the JS SDK loader (adds scriptSrc option)\nexport type HFChatLoaderConfig = HFChatConfig & {\n /** Override widget script source (for self-hosting / testing) */\n scriptSrc?: string\n}\n\nexport type HFChatGlobal = HFChatAPI & {\n /**\n * Load the widget script and initialize the widget.\n */\n init(opts?: HFChatLoaderConfig): Promise<HFChatAPI>\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getRealApi(selfProxy: HFChatGlobal): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n const candidate = window.HFChat\n if (!candidate) return null\n if (candidate === selfProxy) return null\n return candidate as HFChatAPI\n}\n\nfunction injectScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof document === 'undefined') return resolve()\n if (window.HumanFirstChat) return resolve()\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true })\n existing.addEventListener(\n 'error',\n () => reject(new Error('Failed to load widget script')),\n { once: true }\n )\n return\n }\n\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.onerror = () => reject(new Error(`Failed to load widget script: ${src}`))\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) resolve()\n else reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }, 0)\n }\n document.head.appendChild(script)\n })\n}\n\nasync function loadWidget(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (typeof window === 'undefined') return {} as HFChatAPI\n\n const scriptSrc = opts.scriptSrc ?? DEFAULT_SCRIPT_SRC\n await injectScript(scriptSrc)\n\n if (!window.HumanFirstChat?.init) {\n throw new Error('HumanFirstChat.init is not available after script load')\n }\n\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n return api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n lastInitOpts = { ...lastInitOpts, ...opts }\n\n const existingApi = getRealApi(HFChat)\n if (existingApi) return existingApi\n\n if (loaderPromise) return loaderPromise\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nasync function waitForMethod(methodName: string): Promise<HFChatAPI> {\n await init()\n\n const existing = getRealApi(HFChat)\n if (existing && typeof (existing as any)[methodName] === 'function') return existing\n\n return new Promise((resolve, reject) => {\n let attempts = 0\n const maxAttempts = 50\n\n const checkMethod = () => {\n const api = getRealApi(HFChat)\n const fn = api ? (api as any)[methodName] : null\n\n if (api && typeof fn === 'function') {\n resolve(api)\n return\n }\n\n if (attempts < maxAttempts) {\n attempts += 1\n setTimeout(checkMethod, 100)\n return\n }\n\n reject(new Error(`HFChat method '${methodName}' not available after 5 seconds`))\n }\n\n setTimeout(checkMethod, 100)\n })\n}\n\nexport const HFChat: HFChatGlobal = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === 'init') return init\n\n if (typeof window === 'undefined') return () => {}\n\n if (prop === 'ready') {\n const api = getRealApi(HFChat)\n return !!api?.ready\n }\n\n if (prop === 'isOpen') {\n return () => {\n const api = getRealApi(HFChat)\n return api?.isOpen?.() ?? false\n }\n }\n\n return (...args: unknown[]) => {\n const methodName = String(prop)\n waitForMethod(methodName)\n .then((api) => {\n const fn = (api as any)[methodName]\n if (typeof fn === 'function') fn.apply(api, args)\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : error)\n })\n }\n },\n }\n) as HFChatGlobal\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton (like HEYO), without breaking when the real widget assigns window.HFChat.\n if (!window.HFChat) window.HFChat = HFChat\n}\n\nexport default HFChat\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Re-export shared types for consumers\nexport type {\n HFChatLogLevel,\n HFChatConfig,\n HFChatWidgetSettings,\n HFChatIdentifyMeta,\n HFChatAPI,\n} from '@chat/shared'\n\nimport type {\n HFChatConfig,\n HFChatAPI,\n} from '@chat/shared'\n\n// Extended config for the JS SDK loader (adds scriptSrc option)\nexport type HFChatLoaderConfig = HFChatConfig & {\n /** Override widget script source (for self-hosting / testing) */\n scriptSrc?: string\n}\n\nexport type HFChatGlobal = HFChatAPI & {\n /**\n * Load the widget script and initialize the widget.\n */\n init(opts?: HFChatLoaderConfig): Promise<HFChatAPI>\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getRealApi(selfProxy: HFChatGlobal): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n const candidate = window.HFChat\n if (!candidate) return null\n if (candidate === selfProxy) return null\n return candidate as HFChatAPI\n}\n\nfunction injectScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof document === 'undefined') return resolve()\n if (window.HumanFirstChat) return resolve()\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true })\n existing.addEventListener(\n 'error',\n () => reject(new Error('Failed to load widget script')),\n { once: true }\n )\n return\n }\n\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.onerror = () => reject(new Error(`Failed to load widget script: ${src}`))\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) resolve()\n else reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }, 0)\n }\n document.head.appendChild(script)\n })\n}\n\nasync function loadWidget(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (typeof window === 'undefined') return {} as HFChatAPI\n\n const scriptSrc = opts.scriptSrc ?? DEFAULT_SCRIPT_SRC\n await injectScript(scriptSrc)\n\n if (!window.HumanFirstChat?.init) {\n throw new Error('HumanFirstChat.init is not available after script load')\n }\n\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n return api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n lastInitOpts = { ...lastInitOpts, ...opts }\n\n const existingApi = getRealApi(HFChat)\n if (existingApi) return existingApi\n\n if (loaderPromise) return loaderPromise\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nasync function waitForMethod(methodName: string): Promise<HFChatAPI> {\n await init()\n\n const existing = getRealApi(HFChat)\n if (existing && typeof (existing as any)[methodName] === 'function') return existing\n\n return new Promise((resolve, reject) => {\n let attempts = 0\n const maxAttempts = 50\n\n const checkMethod = () => {\n const api = getRealApi(HFChat)\n const fn = api ? (api as any)[methodName] : null\n\n if (api && typeof fn === 'function') {\n resolve(api)\n return\n }\n\n if (attempts < maxAttempts) {\n attempts += 1\n setTimeout(checkMethod, 100)\n return\n }\n\n reject(new Error(`HFChat method '${methodName}' not available after 5 seconds`))\n }\n\n setTimeout(checkMethod, 100)\n })\n}\n\nexport const HFChat: HFChatGlobal = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === 'init') return init\n\n if (typeof window === 'undefined') return () => {}\n\n if (prop === 'ready') {\n const api = getRealApi(HFChat)\n return !!api?.ready\n }\n\n if (prop === 'isOpen') {\n return () => {\n const api = getRealApi(HFChat)\n return api?.isOpen?.() ?? false\n }\n }\n\n return (...args: unknown[]) => {\n const methodName = String(prop)\n waitForMethod(methodName)\n .then((api) => {\n const fn = (api as any)[methodName]\n if (typeof fn === 'function') fn.apply(api, args)\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : error)\n })\n }\n },\n }\n) as HFChatGlobal\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton (like HEYO), without breaking when the real widget assigns window.HFChat.\n if (!window.HFChat) window.HFChat = HFChat\n}\n\nexport default HFChat\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Re-export public types for consumers\nexport type {\n HFChatLogLevel,\n HFChatConfig,\n HFChatWidgetSettings,\n HFChatIdentifyMeta,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI } from './types'\n\n// Extended config for the JS SDK loader (adds scriptSrc option)\nexport type HFChatLoaderConfig = HFChatConfig & {\n /** Override widget script source (for self-hosting / testing) */\n scriptSrc?: string\n}\n\nexport type HFChatGlobal = HFChatAPI & {\n /**\n * Load the widget script and initialize the widget.\n */\n init(opts?: HFChatLoaderConfig): Promise<HFChatAPI>\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getRealApi(selfProxy: HFChatGlobal): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n const candidate = window.HFChat\n if (!candidate) return null\n if (candidate === selfProxy) return null\n return candidate as HFChatAPI\n}\n\nfunction injectScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof document === 'undefined') return resolve()\n if (window.HumanFirstChat) return resolve()\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true })\n existing.addEventListener(\n 'error',\n () => reject(new Error('Failed to load widget script')),\n { once: true }\n )\n return\n }\n\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.onerror = () => reject(new Error(`Failed to load widget script: ${src}`))\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) resolve()\n else reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }, 0)\n }\n document.head.appendChild(script)\n })\n}\n\nasync function loadWidget(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (typeof window === 'undefined') return {} as HFChatAPI\n\n const scriptSrc = opts.scriptSrc ?? DEFAULT_SCRIPT_SRC\n await injectScript(scriptSrc)\n\n if (!window.HumanFirstChat?.init) {\n throw new Error('HumanFirstChat.init is not available after script load')\n }\n\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n return api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n lastInitOpts = { ...lastInitOpts, ...opts }\n\n const existingApi = getRealApi(HFChat)\n if (existingApi) return existingApi\n\n if (loaderPromise) return loaderPromise\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nasync function waitForMethod(methodName: string): Promise<HFChatAPI> {\n await init()\n\n const existing = getRealApi(HFChat)\n if (existing && typeof (existing as any)[methodName] === 'function') return existing\n\n return new Promise((resolve, reject) => {\n let attempts = 0\n const maxAttempts = 50\n\n const checkMethod = () => {\n const api = getRealApi(HFChat)\n const fn = api ? (api as any)[methodName] : null\n\n if (api && typeof fn === 'function') {\n resolve(api)\n return\n }\n\n if (attempts < maxAttempts) {\n attempts += 1\n setTimeout(checkMethod, 100)\n return\n }\n\n reject(new Error(`HFChat method '${methodName}' not available after 5 seconds`))\n }\n\n setTimeout(checkMethod, 100)\n })\n}\n\nexport const HFChat: HFChatGlobal = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === 'init') return init\n\n if (typeof window === 'undefined') return () => {}\n\n if (prop === 'ready') {\n const api = getRealApi(HFChat)\n return !!api?.ready\n }\n\n if (prop === 'isOpen') {\n return () => {\n const api = getRealApi(HFChat)\n return api?.isOpen?.() ?? false\n }\n }\n\n return (...args: unknown[]) => {\n const methodName = String(prop)\n waitForMethod(methodName)\n .then((api) => {\n const fn = (api as any)[methodName]\n if (typeof fn === 'function') fn.apply(api, args)\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : error)\n })\n }\n },\n }\n) as HFChatGlobal\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton (like HEYO), without breaking when the real widget assigns window.HFChat.\n if (!window.HFChat) window.HFChat = HFChat\n}\n\nexport default HFChat\n"],"mappings":";AAiCA,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAEzB,IAAI,gBAA2C;AAC/C,IAAI;AAEJ,SAAS,WAAW,WAA2C;AAC7D,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAM,YAAY,OAAO;AACzB,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,cAAc,UAAW,QAAO;AACpC,SAAO;AACT;AAEA,SAAS,aAAa,KAA4B;AAChD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,aAAa,YAAa,QAAO,QAAQ;AACpD,QAAI,OAAO,eAAgB,QAAO,QAAQ;AAE1C,UAAM,WAAW,SAAS;AAAA,MACxB,UAAU,gBAAgB;AAAA,IAC5B;AACA,QAAI,UAAU;AACZ,eAAS,iBAAiB,QAAQ,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACjE,eAAS;AAAA,QACP;AAAA,QACA,MAAM,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,QACtD,EAAE,MAAM,KAAK;AAAA,MACf;AACA;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,MAAM;AACb,WAAO,aAAa,kBAAkB,GAAG;AACzC,WAAO,UAAU,MAAM,OAAO,IAAI,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAC/E,WAAO,SAAS,MAAM;AACpB,iBAAW,MAAM;AACf,YAAI,OAAO,eAAgB,SAAQ;AAAA,YAC9B,QAAO,IAAI,MAAM,gDAAgD,CAAC;AAAA,MACzE,GAAG,CAAC;AAAA,IACN;AACA,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AACH;AAEA,eAAe,WAAW,OAA2B,CAAC,GAAuB;AAC3E,MAAI,OAAO,WAAW,YAAa,QAAO,CAAC;AAE3C,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,aAAa,SAAS;AAE5B,MAAI,CAAC,OAAO,gBAAgB,MAAM;AAChC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,MAAM,OAAO,eAAe,KAAK;AAAA,IACrC,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,EACb,CAAC;AAED,SAAO;AACT;AAEA,eAAe,KAAK,OAA2B,CAAC,GAAuB;AACrE,iBAAe,EAAE,GAAG,cAAc,GAAG,KAAK;AAE1C,QAAM,cAAc,WAAW,MAAM;AACrC,MAAI,YAAa,QAAO;AAExB,MAAI,cAAe,QAAO;AAC1B,kBAAgB,WAAW,YAAY;AACvC,SAAO;AACT;AAEA,eAAe,cAAc,YAAwC;AACnE,QAAM,KAAK;AAEX,QAAM,WAAW,WAAW,MAAM;AAClC,MAAI,YAAY,OAAQ,SAAiB,UAAU,MAAM,WAAY,QAAO;AAE5E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,WAAW;AACf,UAAM,cAAc;AAEpB,UAAM,cAAc,MAAM;AACxB,YAAM,MAAM,WAAW,MAAM;AAC7B,YAAM,KAAK,MAAO,IAAY,UAAU,IAAI;AAE5C,UAAI,OAAO,OAAO,OAAO,YAAY;AACnC,gBAAQ,GAAG;AACX;AAAA,MACF;AAEA,UAAI,WAAW,aAAa;AAC1B,oBAAY;AACZ,mBAAW,aAAa,GAAG;AAC3B;AAAA,MACF;AAEA,aAAO,IAAI,MAAM,kBAAkB,UAAU,iCAAiC,CAAC;AAAA,IACjF;AAEA,eAAW,aAAa,GAAG;AAAA,EAC7B,CAAC;AACH;AAEO,IAAM,SAAuB,IAAI;AAAA,EACtC,CAAC;AAAA,EACD;AAAA,IACE,IAAI,SAAS,MAAM;AACjB,UAAI,SAAS,OAAQ,QAAO;AAE5B,UAAI,OAAO,WAAW,YAAa,QAAO,MAAM;AAAA,MAAC;AAEjD,UAAI,SAAS,SAAS;AACpB,cAAM,MAAM,WAAW,MAAM;AAC7B,eAAO,CAAC,CAAC,KAAK;AAAA,MAChB;AAEA,UAAI,SAAS,UAAU;AACrB,eAAO,MAAM;AACX,gBAAM,MAAM,WAAW,MAAM;AAC7B,iBAAO,KAAK,SAAS,KAAK;AAAA,QAC5B;AAAA,MACF;AAEA,aAAO,IAAI,SAAoB;AAC7B,cAAM,aAAa,OAAO,IAAI;AAC9B,sBAAc,UAAU,EACrB,KAAK,CAAC,QAAQ;AACb,gBAAM,KAAM,IAAY,UAAU;AAClC,cAAI,OAAO,OAAO,WAAY,IAAG,MAAM,KAAK,IAAI;AAAA,QAClD,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,kBAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,QAC9D,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,OAAO,WAAW,aAAa;AAEjC,MAAI,CAAC,OAAO,OAAQ,QAAO,SAAS;AACtC;AAEA,IAAO,gBAAQ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humanfirst-chat/js",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "description": "HumanFirst.chat JavaScript SDK",
6
6
  "main": "./dist/index.js",
@@ -8,7 +8,8 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "type": "commonjs",
10
10
  "files": [
11
- "dist"
11
+ "dist",
12
+ "README.md"
12
13
  ],
13
14
  "scripts": {
14
15
  "build": "tsup",
@@ -18,9 +19,6 @@
18
19
  "publishConfig": {
19
20
  "access": "public"
20
21
  },
21
- "dependencies": {
22
- "@chat/shared": "workspace:*"
23
- },
24
22
  "devDependencies": {
25
23
  "@types/node": "^25.0.3",
26
24
  "tsup": "^8.5.1",