@humanfirst-chat/js 0.2.1 → 0.2.2
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/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -29,15 +29,15 @@ var SCRIPT_DATA_ATTR = "data-hfchat-widget";
|
|
|
29
29
|
var logLevel = "none";
|
|
30
30
|
function log(message, ...args) {
|
|
31
31
|
if (logLevel === "none") return;
|
|
32
|
-
console.log(`[
|
|
32
|
+
console.log(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
33
33
|
}
|
|
34
34
|
function logFull(message, ...args) {
|
|
35
35
|
if (logLevel !== "full") return;
|
|
36
|
-
console.log(`[
|
|
36
|
+
console.log(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
37
37
|
}
|
|
38
38
|
function logError(message, ...args) {
|
|
39
39
|
if (logLevel === "none") return;
|
|
40
|
-
console.error(`[
|
|
40
|
+
console.error(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
41
41
|
}
|
|
42
42
|
var loaderPromise = null;
|
|
43
43
|
var lastInitOpts;
|
|
@@ -184,7 +184,7 @@ var HFChat = {
|
|
|
184
184
|
try {
|
|
185
185
|
callback();
|
|
186
186
|
} catch (error) {
|
|
187
|
-
console.error("[
|
|
187
|
+
console.error("[HumanFirst Chat SDK] Error in onReady callback:", error);
|
|
188
188
|
}
|
|
189
189
|
return;
|
|
190
190
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 HFChatOpenOptions,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI, HFChatLogLevel } 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\ntype QueuedCall = {\n method: keyof HFChatAPI\n args: unknown[]\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n __HFCHAT_DISABLE_AUTO_INIT?: boolean\n __HFCHAT_QUEUE__?: QueuedCall[]\n __HFCHAT_REAL__?: HFChatAPI\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\n// Logging configuration\nlet logLevel: HFChatLogLevel = 'none'\n\nfunction log(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.log(`[HFChat SDK] ${message}`, ...args)\n}\n\nfunction logFull(message: string, ...args: unknown[]) {\n if (logLevel !== 'full') return\n console.log(`[HFChat SDK] ${message}`, ...args)\n}\n\nfunction logError(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.error(`[HFChat SDK] ${message}`, ...args)\n}\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getQueue(): QueuedCall[] {\n if (typeof window === 'undefined') return []\n if (!window.__HFCHAT_QUEUE__) {\n window.__HFCHAT_QUEUE__ = []\n }\n return window.__HFCHAT_QUEUE__\n}\n\nfunction enqueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n getQueue().push({ method, args })\n}\n\nfunction getRealApi(): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n\n const globalReal = window.__HFCHAT_REAL__\n if (globalReal && (globalReal as any).__HFCHAT_INSTANCE__ === true) {\n return globalReal\n }\n\n const candidate = window.HFChat as any\n if (candidate && candidate.__HFCHAT_INSTANCE__ === true) {\n return candidate as HFChatAPI\n }\n\n if (candidate && candidate.__real && candidate.__real.__HFCHAT_INSTANCE__ === true) {\n return candidate.__real as HFChatAPI\n }\n\n return null\n}\n\nfunction callOrQueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n const api = getRealApi()\n const fn = api ? (api as any)[method] : null\n\n if (api && typeof fn === 'function') {\n logFull(`Calling '${String(method)}' on real API`)\n fn.apply(api, args)\n return\n }\n\n logFull(`Queueing '${String(method)}' until real API is ready`)\n enqueue(method, args)\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) {\n logFull('HumanFirstChat already exists, skipping script injection')\n return resolve()\n }\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n logFull('Widget script already in DOM, waiting for load')\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 log('Injecting widget script:', src)\n window.__HFCHAT_DISABLE_AUTO_INIT = true\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.setAttribute('data-auto-init', 'false')\n script.onerror = () => {\n logError('Failed to load widget script:', src)\n reject(new Error(`Failed to load widget script: ${src}`))\n }\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) {\n log('Widget script loaded successfully')\n resolve()\n } else {\n logError('Widget script loaded but HumanFirstChat not found')\n reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }\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 logFull('loadWidget starting with options:', { siteId: opts.siteId, scriptSrc })\n\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 log('Calling HumanFirstChat.init()')\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n hideOnClose: opts.hideOnClose,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n const realApi = getRealApi()\n logFull('HumanFirstChat.init() returned:', { hasInstance: (realApi as any)?.__HFCHAT_INSTANCE__ })\n return realApi ?? api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (opts.logs) {\n logLevel = opts.logs\n }\n\n lastInitOpts = { ...lastInitOpts, ...opts }\n log('init() called with options:', { siteId: opts.siteId, logs: opts.logs })\n\n const existingApi = getRealApi()\n if (existingApi) {\n log('Returning existing real API')\n return existingApi\n }\n\n if (loaderPromise) {\n logFull('Returning existing loader promise')\n return loaderPromise\n }\n\n log('Starting widget load...')\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nconst HFChat: HFChatGlobal & { __HFCHAT_STUB__?: true; __real?: HFChatAPI } = {\n init,\n\n show: () => callOrQueue('show', []),\n hide: () => callOrQueue('hide', []),\n open: (options) => callOrQueue('open', [options]),\n close: () => callOrQueue('close', []),\n toggle: () => callOrQueue('toggle', []),\n isOpen: () => {\n const api = getRealApi()\n return api?.isOpen?.() ?? false\n },\n identify: (meta) => callOrQueue('identify', [meta]),\n configure: (settings) => callOrQueue('configure', [settings]),\n onReady: (callback) => {\n if (typeof callback !== 'function') return\n const api = getRealApi()\n if (api?.ready) {\n try {\n callback()\n } catch (error) {\n console.error('[HFChat SDK] Error in onReady callback:', error)\n }\n return\n }\n callOrQueue('onReady', [callback])\n },\n onOpen: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onOpen', [callback])\n },\n onClose: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onClose', [callback])\n },\n get ready() {\n const api = getRealApi()\n return api?.ready ?? false\n },\n}\n\nHFChat.__HFCHAT_STUB__ = true\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton, without breaking when the real widget assigns window.HFChat\n if (!window.HFChat) {\n window.HFChat = HFChat\n }\n}\n\nexport { HFChat }\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 HFChatOpenOptions,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI, HFChatLogLevel } 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\ntype QueuedCall = {\n method: keyof HFChatAPI\n args: unknown[]\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n __HFCHAT_DISABLE_AUTO_INIT?: boolean\n __HFCHAT_QUEUE__?: QueuedCall[]\n __HFCHAT_REAL__?: HFChatAPI\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\n// Logging configuration\nlet logLevel: HFChatLogLevel = 'none'\n\nfunction log(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.log(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nfunction logFull(message: string, ...args: unknown[]) {\n if (logLevel !== 'full') return\n console.log(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nfunction logError(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.error(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getQueue(): QueuedCall[] {\n if (typeof window === 'undefined') return []\n if (!window.__HFCHAT_QUEUE__) {\n window.__HFCHAT_QUEUE__ = []\n }\n return window.__HFCHAT_QUEUE__\n}\n\nfunction enqueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n getQueue().push({ method, args })\n}\n\nfunction getRealApi(): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n\n const globalReal = window.__HFCHAT_REAL__\n if (globalReal && (globalReal as any).__HFCHAT_INSTANCE__ === true) {\n return globalReal\n }\n\n const candidate = window.HFChat as any\n if (candidate && candidate.__HFCHAT_INSTANCE__ === true) {\n return candidate as HFChatAPI\n }\n\n if (candidate && candidate.__real && candidate.__real.__HFCHAT_INSTANCE__ === true) {\n return candidate.__real as HFChatAPI\n }\n\n return null\n}\n\nfunction callOrQueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n const api = getRealApi()\n const fn = api ? (api as any)[method] : null\n\n if (api && typeof fn === 'function') {\n logFull(`Calling '${String(method)}' on real API`)\n fn.apply(api, args)\n return\n }\n\n logFull(`Queueing '${String(method)}' until real API is ready`)\n enqueue(method, args)\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) {\n logFull('HumanFirstChat already exists, skipping script injection')\n return resolve()\n }\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n logFull('Widget script already in DOM, waiting for load')\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 log('Injecting widget script:', src)\n window.__HFCHAT_DISABLE_AUTO_INIT = true\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.setAttribute('data-auto-init', 'false')\n script.onerror = () => {\n logError('Failed to load widget script:', src)\n reject(new Error(`Failed to load widget script: ${src}`))\n }\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) {\n log('Widget script loaded successfully')\n resolve()\n } else {\n logError('Widget script loaded but HumanFirstChat not found')\n reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }\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 logFull('loadWidget starting with options:', { siteId: opts.siteId, scriptSrc })\n\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 log('Calling HumanFirstChat.init()')\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n hideOnClose: opts.hideOnClose,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n const realApi = getRealApi()\n logFull('HumanFirstChat.init() returned:', { hasInstance: (realApi as any)?.__HFCHAT_INSTANCE__ })\n return realApi ?? api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (opts.logs) {\n logLevel = opts.logs\n }\n\n lastInitOpts = { ...lastInitOpts, ...opts }\n log('init() called with options:', { siteId: opts.siteId, logs: opts.logs })\n\n const existingApi = getRealApi()\n if (existingApi) {\n log('Returning existing real API')\n return existingApi\n }\n\n if (loaderPromise) {\n logFull('Returning existing loader promise')\n return loaderPromise\n }\n\n log('Starting widget load...')\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nconst HFChat: HFChatGlobal & { __HFCHAT_STUB__?: true; __real?: HFChatAPI } = {\n init,\n\n show: () => callOrQueue('show', []),\n hide: () => callOrQueue('hide', []),\n open: (options) => callOrQueue('open', [options]),\n close: () => callOrQueue('close', []),\n toggle: () => callOrQueue('toggle', []),\n isOpen: () => {\n const api = getRealApi()\n return api?.isOpen?.() ?? false\n },\n identify: (meta) => callOrQueue('identify', [meta]),\n configure: (settings) => callOrQueue('configure', [settings]),\n onReady: (callback) => {\n if (typeof callback !== 'function') return\n const api = getRealApi()\n if (api?.ready) {\n try {\n callback()\n } catch (error) {\n console.error('[HumanFirst Chat SDK] Error in onReady callback:', error)\n }\n return\n }\n callOrQueue('onReady', [callback])\n },\n onOpen: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onOpen', [callback])\n },\n onClose: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onClose', [callback])\n },\n get ready() {\n const api = getRealApi()\n return api?.ready ?? false\n },\n}\n\nHFChat.__HFCHAT_STUB__ = true\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton, without breaking when the real widget assigns window.HFChat\n if (!window.HFChat) {\n window.HFChat = HFChat\n }\n}\n\nexport { HFChat }\nexport default HFChat\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -4,15 +4,15 @@ var SCRIPT_DATA_ATTR = "data-hfchat-widget";
|
|
|
4
4
|
var logLevel = "none";
|
|
5
5
|
function log(message, ...args) {
|
|
6
6
|
if (logLevel === "none") return;
|
|
7
|
-
console.log(`[
|
|
7
|
+
console.log(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
8
8
|
}
|
|
9
9
|
function logFull(message, ...args) {
|
|
10
10
|
if (logLevel !== "full") return;
|
|
11
|
-
console.log(`[
|
|
11
|
+
console.log(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
12
12
|
}
|
|
13
13
|
function logError(message, ...args) {
|
|
14
14
|
if (logLevel === "none") return;
|
|
15
|
-
console.error(`[
|
|
15
|
+
console.error(`[HumanFirst Chat SDK] ${message}`, ...args);
|
|
16
16
|
}
|
|
17
17
|
var loaderPromise = null;
|
|
18
18
|
var lastInitOpts;
|
|
@@ -159,7 +159,7 @@ var HFChat = {
|
|
|
159
159
|
try {
|
|
160
160
|
callback();
|
|
161
161
|
} catch (error) {
|
|
162
|
-
console.error("[
|
|
162
|
+
console.error("[HumanFirst Chat SDK] Error in onReady callback:", error);
|
|
163
163
|
}
|
|
164
164
|
return;
|
|
165
165
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 HFChatOpenOptions,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI, HFChatLogLevel } 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\ntype QueuedCall = {\n method: keyof HFChatAPI\n args: unknown[]\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n __HFCHAT_DISABLE_AUTO_INIT?: boolean\n __HFCHAT_QUEUE__?: QueuedCall[]\n __HFCHAT_REAL__?: HFChatAPI\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\n// Logging configuration\nlet logLevel: HFChatLogLevel = 'none'\n\nfunction log(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.log(`[HFChat SDK] ${message}`, ...args)\n}\n\nfunction logFull(message: string, ...args: unknown[]) {\n if (logLevel !== 'full') return\n console.log(`[HFChat SDK] ${message}`, ...args)\n}\n\nfunction logError(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.error(`[HFChat SDK] ${message}`, ...args)\n}\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getQueue(): QueuedCall[] {\n if (typeof window === 'undefined') return []\n if (!window.__HFCHAT_QUEUE__) {\n window.__HFCHAT_QUEUE__ = []\n }\n return window.__HFCHAT_QUEUE__\n}\n\nfunction enqueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n getQueue().push({ method, args })\n}\n\nfunction getRealApi(): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n\n const globalReal = window.__HFCHAT_REAL__\n if (globalReal && (globalReal as any).__HFCHAT_INSTANCE__ === true) {\n return globalReal\n }\n\n const candidate = window.HFChat as any\n if (candidate && candidate.__HFCHAT_INSTANCE__ === true) {\n return candidate as HFChatAPI\n }\n\n if (candidate && candidate.__real && candidate.__real.__HFCHAT_INSTANCE__ === true) {\n return candidate.__real as HFChatAPI\n }\n\n return null\n}\n\nfunction callOrQueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n const api = getRealApi()\n const fn = api ? (api as any)[method] : null\n\n if (api && typeof fn === 'function') {\n logFull(`Calling '${String(method)}' on real API`)\n fn.apply(api, args)\n return\n }\n\n logFull(`Queueing '${String(method)}' until real API is ready`)\n enqueue(method, args)\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) {\n logFull('HumanFirstChat already exists, skipping script injection')\n return resolve()\n }\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n logFull('Widget script already in DOM, waiting for load')\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 log('Injecting widget script:', src)\n window.__HFCHAT_DISABLE_AUTO_INIT = true\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.setAttribute('data-auto-init', 'false')\n script.onerror = () => {\n logError('Failed to load widget script:', src)\n reject(new Error(`Failed to load widget script: ${src}`))\n }\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) {\n log('Widget script loaded successfully')\n resolve()\n } else {\n logError('Widget script loaded but HumanFirstChat not found')\n reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }\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 logFull('loadWidget starting with options:', { siteId: opts.siteId, scriptSrc })\n\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 log('Calling HumanFirstChat.init()')\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n hideOnClose: opts.hideOnClose,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n const realApi = getRealApi()\n logFull('HumanFirstChat.init() returned:', { hasInstance: (realApi as any)?.__HFCHAT_INSTANCE__ })\n return realApi ?? api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (opts.logs) {\n logLevel = opts.logs\n }\n\n lastInitOpts = { ...lastInitOpts, ...opts }\n log('init() called with options:', { siteId: opts.siteId, logs: opts.logs })\n\n const existingApi = getRealApi()\n if (existingApi) {\n log('Returning existing real API')\n return existingApi\n }\n\n if (loaderPromise) {\n logFull('Returning existing loader promise')\n return loaderPromise\n }\n\n log('Starting widget load...')\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nconst HFChat: HFChatGlobal & { __HFCHAT_STUB__?: true; __real?: HFChatAPI } = {\n init,\n\n show: () => callOrQueue('show', []),\n hide: () => callOrQueue('hide', []),\n open: (options) => callOrQueue('open', [options]),\n close: () => callOrQueue('close', []),\n toggle: () => callOrQueue('toggle', []),\n isOpen: () => {\n const api = getRealApi()\n return api?.isOpen?.() ?? false\n },\n identify: (meta) => callOrQueue('identify', [meta]),\n configure: (settings) => callOrQueue('configure', [settings]),\n onReady: (callback) => {\n if (typeof callback !== 'function') return\n const api = getRealApi()\n if (api?.ready) {\n try {\n callback()\n } catch (error) {\n console.error('[HFChat SDK] Error in onReady callback:', error)\n }\n return\n }\n callOrQueue('onReady', [callback])\n },\n onOpen: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onOpen', [callback])\n },\n onClose: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onClose', [callback])\n },\n get ready() {\n const api = getRealApi()\n return api?.ready ?? false\n },\n}\n\nHFChat.__HFCHAT_STUB__ = true\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton, without breaking when the real widget assigns window.HFChat\n if (!window.HFChat) {\n window.HFChat = HFChat\n }\n}\n\nexport { HFChat }\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 HFChatOpenOptions,\n HFChatAPI,\n} from './types'\n\nimport type { HFChatConfig, HFChatAPI, HFChatLogLevel } 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\ntype QueuedCall = {\n method: keyof HFChatAPI\n args: unknown[]\n}\n\ndeclare global {\n interface Window {\n HFChat?: HFChatAPI\n HumanFirstChat?: {\n init: (opts: unknown) => HFChatAPI\n }\n __HFCHAT_DISABLE_AUTO_INIT?: boolean\n __HFCHAT_QUEUE__?: QueuedCall[]\n __HFCHAT_REAL__?: HFChatAPI\n }\n}\n\nconst DEFAULT_SCRIPT_SRC = 'https://humanfirst.chat/widget.js'\nconst SCRIPT_DATA_ATTR = 'data-hfchat-widget'\n\n// Logging configuration\nlet logLevel: HFChatLogLevel = 'none'\n\nfunction log(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.log(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nfunction logFull(message: string, ...args: unknown[]) {\n if (logLevel !== 'full') return\n console.log(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nfunction logError(message: string, ...args: unknown[]) {\n if (logLevel === 'none') return\n console.error(`[HumanFirst Chat SDK] ${message}`, ...args)\n}\n\nlet loaderPromise: Promise<HFChatAPI> | null = null\nlet lastInitOpts: HFChatLoaderConfig | undefined\n\nfunction getQueue(): QueuedCall[] {\n if (typeof window === 'undefined') return []\n if (!window.__HFCHAT_QUEUE__) {\n window.__HFCHAT_QUEUE__ = []\n }\n return window.__HFCHAT_QUEUE__\n}\n\nfunction enqueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n getQueue().push({ method, args })\n}\n\nfunction getRealApi(): HFChatAPI | null {\n if (typeof window === 'undefined') return null\n\n const globalReal = window.__HFCHAT_REAL__\n if (globalReal && (globalReal as any).__HFCHAT_INSTANCE__ === true) {\n return globalReal\n }\n\n const candidate = window.HFChat as any\n if (candidate && candidate.__HFCHAT_INSTANCE__ === true) {\n return candidate as HFChatAPI\n }\n\n if (candidate && candidate.__real && candidate.__real.__HFCHAT_INSTANCE__ === true) {\n return candidate.__real as HFChatAPI\n }\n\n return null\n}\n\nfunction callOrQueue(method: keyof HFChatAPI, args: unknown[]) {\n if (typeof window === 'undefined') return\n const api = getRealApi()\n const fn = api ? (api as any)[method] : null\n\n if (api && typeof fn === 'function') {\n logFull(`Calling '${String(method)}' on real API`)\n fn.apply(api, args)\n return\n }\n\n logFull(`Queueing '${String(method)}' until real API is ready`)\n enqueue(method, args)\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) {\n logFull('HumanFirstChat already exists, skipping script injection')\n return resolve()\n }\n\n const existing = document.querySelector(\n `script[${SCRIPT_DATA_ATTR}=\"1\"]`\n ) as HTMLScriptElement | null\n if (existing) {\n logFull('Widget script already in DOM, waiting for load')\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 log('Injecting widget script:', src)\n window.__HFCHAT_DISABLE_AUTO_INIT = true\n const script = document.createElement('script')\n script.async = true\n script.src = src\n script.setAttribute(SCRIPT_DATA_ATTR, '1')\n script.setAttribute('data-auto-init', 'false')\n script.onerror = () => {\n logError('Failed to load widget script:', src)\n reject(new Error(`Failed to load widget script: ${src}`))\n }\n script.onload = () => {\n setTimeout(() => {\n if (window.HumanFirstChat) {\n log('Widget script loaded successfully')\n resolve()\n } else {\n logError('Widget script loaded but HumanFirstChat not found')\n reject(new Error('Widget did not attach to window.HumanFirstChat'))\n }\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 logFull('loadWidget starting with options:', { siteId: opts.siteId, scriptSrc })\n\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 log('Calling HumanFirstChat.init()')\n const api = window.HumanFirstChat.init({\n siteId: opts.siteId,\n hidden: opts.hidden,\n hideOnClose: opts.hideOnClose,\n logs: opts.logs,\n baseURL: opts.baseURL,\n host: opts.host,\n })\n\n const realApi = getRealApi()\n logFull('HumanFirstChat.init() returned:', { hasInstance: (realApi as any)?.__HFCHAT_INSTANCE__ })\n return realApi ?? api\n}\n\nasync function init(opts: HFChatLoaderConfig = {}): Promise<HFChatAPI> {\n if (opts.logs) {\n logLevel = opts.logs\n }\n\n lastInitOpts = { ...lastInitOpts, ...opts }\n log('init() called with options:', { siteId: opts.siteId, logs: opts.logs })\n\n const existingApi = getRealApi()\n if (existingApi) {\n log('Returning existing real API')\n return existingApi\n }\n\n if (loaderPromise) {\n logFull('Returning existing loader promise')\n return loaderPromise\n }\n\n log('Starting widget load...')\n loaderPromise = loadWidget(lastInitOpts)\n return loaderPromise\n}\n\nconst HFChat: HFChatGlobal & { __HFCHAT_STUB__?: true; __real?: HFChatAPI } = {\n init,\n\n show: () => callOrQueue('show', []),\n hide: () => callOrQueue('hide', []),\n open: (options) => callOrQueue('open', [options]),\n close: () => callOrQueue('close', []),\n toggle: () => callOrQueue('toggle', []),\n isOpen: () => {\n const api = getRealApi()\n return api?.isOpen?.() ?? false\n },\n identify: (meta) => callOrQueue('identify', [meta]),\n configure: (settings) => callOrQueue('configure', [settings]),\n onReady: (callback) => {\n if (typeof callback !== 'function') return\n const api = getRealApi()\n if (api?.ready) {\n try {\n callback()\n } catch (error) {\n console.error('[HumanFirst Chat SDK] Error in onReady callback:', error)\n }\n return\n }\n callOrQueue('onReady', [callback])\n },\n onOpen: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onOpen', [callback])\n },\n onClose: (callback) => {\n if (typeof callback !== 'function') return\n callOrQueue('onClose', [callback])\n },\n get ready() {\n const api = getRealApi()\n return api?.ready ?? false\n },\n}\n\nHFChat.__HFCHAT_STUB__ = true\n\nif (typeof window !== 'undefined') {\n // Expose a stable global singleton, without breaking when the real widget assigns window.HFChat\n if (!window.HFChat) {\n window.HFChat = HFChat\n }\n}\n\nexport { HFChat }\nexport default HFChat\n"],"mappings":";AA0CA,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAGzB,IAAI,WAA2B;AAE/B,SAAS,IAAI,YAAoB,MAAiB;AAChD,MAAI,aAAa,OAAQ;AACzB,UAAQ,IAAI,yBAAyB,OAAO,IAAI,GAAG,IAAI;AACzD;AAEA,SAAS,QAAQ,YAAoB,MAAiB;AACpD,MAAI,aAAa,OAAQ;AACzB,UAAQ,IAAI,yBAAyB,OAAO,IAAI,GAAG,IAAI;AACzD;AAEA,SAAS,SAAS,YAAoB,MAAiB;AACrD,MAAI,aAAa,OAAQ;AACzB,UAAQ,MAAM,yBAAyB,OAAO,IAAI,GAAG,IAAI;AAC3D;AAEA,IAAI,gBAA2C;AAC/C,IAAI;AAEJ,SAAS,WAAyB;AAChC,MAAI,OAAO,WAAW,YAAa,QAAO,CAAC;AAC3C,MAAI,CAAC,OAAO,kBAAkB;AAC5B,WAAO,mBAAmB,CAAC;AAAA,EAC7B;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,QAAQ,QAAyB,MAAiB;AACzD,MAAI,OAAO,WAAW,YAAa;AACnC,WAAS,EAAE,KAAK,EAAE,QAAQ,KAAK,CAAC;AAClC;AAEA,SAAS,aAA+B;AACtC,MAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,QAAM,aAAa,OAAO;AAC1B,MAAI,cAAe,WAAmB,wBAAwB,MAAM;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO;AACzB,MAAI,aAAa,UAAU,wBAAwB,MAAM;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,UAAU,UAAU,UAAU,OAAO,wBAAwB,MAAM;AAClF,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,QAAyB,MAAiB;AAC7D,MAAI,OAAO,WAAW,YAAa;AACnC,QAAM,MAAM,WAAW;AACvB,QAAM,KAAK,MAAO,IAAY,MAAM,IAAI;AAExC,MAAI,OAAO,OAAO,OAAO,YAAY;AACnC,YAAQ,YAAY,OAAO,MAAM,CAAC,eAAe;AACjD,OAAG,MAAM,KAAK,IAAI;AAClB;AAAA,EACF;AAEA,UAAQ,aAAa,OAAO,MAAM,CAAC,2BAA2B;AAC9D,UAAQ,QAAQ,IAAI;AACtB;AAEA,SAAS,aAAa,KAA4B;AAChD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,aAAa,YAAa,QAAO,QAAQ;AACpD,QAAI,OAAO,gBAAgB;AACzB,cAAQ,0DAA0D;AAClE,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,WAAW,SAAS;AAAA,MACxB,UAAU,gBAAgB;AAAA,IAC5B;AACA,QAAI,UAAU;AACZ,cAAQ,gDAAgD;AACxD,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,QAAI,4BAA4B,GAAG;AACnC,WAAO,6BAA6B;AACpC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,MAAM;AACb,WAAO,aAAa,kBAAkB,GAAG;AACzC,WAAO,aAAa,kBAAkB,OAAO;AAC7C,WAAO,UAAU,MAAM;AACrB,eAAS,iCAAiC,GAAG;AAC7C,aAAO,IAAI,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAAA,IAC1D;AACA,WAAO,SAAS,MAAM;AACpB,iBAAW,MAAM;AACf,YAAI,OAAO,gBAAgB;AACzB,cAAI,mCAAmC;AACvC,kBAAQ;AAAA,QACV,OAAO;AACL,mBAAS,mDAAmD;AAC5D,iBAAO,IAAI,MAAM,gDAAgD,CAAC;AAAA,QACpE;AAAA,MACF,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,UAAQ,qCAAqC,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAE/E,QAAM,aAAa,SAAS;AAE5B,MAAI,CAAC,OAAO,gBAAgB,MAAM;AAChC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,MAAI,+BAA+B;AACnC,QAAM,MAAM,OAAO,eAAe,KAAK;AAAA,IACrC,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK;AAAA,IAClB,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,EACb,CAAC;AAED,QAAM,UAAU,WAAW;AAC3B,UAAQ,mCAAmC,EAAE,aAAc,SAAiB,oBAAoB,CAAC;AACjG,SAAO,WAAW;AACpB;AAEA,eAAe,KAAK,OAA2B,CAAC,GAAuB;AACrE,MAAI,KAAK,MAAM;AACb,eAAW,KAAK;AAAA,EAClB;AAEA,iBAAe,EAAE,GAAG,cAAc,GAAG,KAAK;AAC1C,MAAI,+BAA+B,EAAE,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK,CAAC;AAE3E,QAAM,cAAc,WAAW;AAC/B,MAAI,aAAa;AACf,QAAI,6BAA6B;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AACjB,YAAQ,mCAAmC;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,yBAAyB;AAC7B,kBAAgB,WAAW,YAAY;AACvC,SAAO;AACT;AAEA,IAAM,SAAwE;AAAA,EAC5E;AAAA,EAEA,MAAM,MAAM,YAAY,QAAQ,CAAC,CAAC;AAAA,EAClC,MAAM,MAAM,YAAY,QAAQ,CAAC,CAAC;AAAA,EAClC,MAAM,CAAC,YAAY,YAAY,QAAQ,CAAC,OAAO,CAAC;AAAA,EAChD,OAAO,MAAM,YAAY,SAAS,CAAC,CAAC;AAAA,EACpC,QAAQ,MAAM,YAAY,UAAU,CAAC,CAAC;AAAA,EACtC,QAAQ,MAAM;AACZ,UAAM,MAAM,WAAW;AACvB,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AAAA,EACA,UAAU,CAAC,SAAS,YAAY,YAAY,CAAC,IAAI,CAAC;AAAA,EAClD,WAAW,CAAC,aAAa,YAAY,aAAa,CAAC,QAAQ,CAAC;AAAA,EAC5D,SAAS,CAAC,aAAa;AACrB,QAAI,OAAO,aAAa,WAAY;AACpC,UAAM,MAAM,WAAW;AACvB,QAAI,KAAK,OAAO;AACd,UAAI;AACF,iBAAS;AAAA,MACX,SAAS,OAAO;AACd,gBAAQ,MAAM,oDAAoD,KAAK;AAAA,MACzE;AACA;AAAA,IACF;AACA,gBAAY,WAAW,CAAC,QAAQ,CAAC;AAAA,EACnC;AAAA,EACA,QAAQ,CAAC,aAAa;AACpB,QAAI,OAAO,aAAa,WAAY;AACpC,gBAAY,UAAU,CAAC,QAAQ,CAAC;AAAA,EAClC;AAAA,EACA,SAAS,CAAC,aAAa;AACrB,QAAI,OAAO,aAAa,WAAY;AACpC,gBAAY,WAAW,CAAC,QAAQ,CAAC;AAAA,EACnC;AAAA,EACA,IAAI,QAAQ;AACV,UAAM,MAAM,WAAW;AACvB,WAAO,KAAK,SAAS;AAAA,EACvB;AACF;AAEA,OAAO,kBAAkB;AAEzB,IAAI,OAAO,WAAW,aAAa;AAEjC,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,SAAS;AAAA,EAClB;AACF;AAGA,IAAO,gBAAQ;","names":[]}
|