@encatch/web-sdk 0.0.35-beta.8 → 1.0.0-beta.0
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 +140 -638
- package/dist/encatch.es.js +2 -0
- package/dist/encatch.es.js.map +1 -0
- package/dist/encatch.iife.js +2 -0
- package/dist/encatch.iife.js.map +1 -0
- package/dist/index.d.ts +191 -0
- package/package.json +32 -50
- package/dist-sdk/plugin/sdk/core-wrapper-BMvOyc0u.js +0 -22926
- package/dist-sdk/plugin/sdk/module-DC2Edddk.js +0 -481
- package/dist-sdk/plugin/sdk/module.js +0 -5
- package/dist-sdk/plugin/sdk/preview-sdk.html +0 -1182
- package/dist-sdk/plugin/sdk/vite.svg +0 -15
- package/dist-sdk/plugin/sdk/web-form-engine-core.css +0 -1
- package/index.d.ts +0 -207
- package/src/@types/encatch-type.ts +0 -111
- package/src/encatch-instance.ts +0 -161
- package/src/feedback-api-types.ts +0 -18
- package/src/hooks/useDevice.ts +0 -30
- package/src/hooks/useFeedbackInterval.ts +0 -71
- package/src/hooks/useFeedbackTriggers.ts +0 -342
- package/src/hooks/useFetchElligibleFeedbackConfiguration.ts +0 -363
- package/src/hooks/useFetchFeedbackConfigurationDetails.ts +0 -92
- package/src/hooks/usePageChangeTracker.ts +0 -88
- package/src/hooks/usePrepopulatedAnswers.ts +0 -123
- package/src/hooks/useRefineTextForm.ts +0 -55
- package/src/hooks/useSubmitFeedbackForm.ts +0 -134
- package/src/hooks/useUserSession.ts +0 -53
- package/src/module.tsx +0 -428
- package/src/store/formResponses.ts +0 -211
- package/src/utils/browser-details.ts +0 -36
- package/src/utils/duration-utils.ts +0 -158
- package/src/utils/feedback-frequency-storage.ts +0 -214
- package/src/utils/feedback-storage.ts +0 -166
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e="encatch-sdk-script";let n=!1,t=!1,i=null;function o(e,n){return function(...t){e.push([n,...t])}}const r=["init","identifyUser","setLocale","setCountry","setTheme","trackEvent","trackScreen","startSession","resetUser","showForm","addToResponse"];function c(){const c=[],s=[],a={_q:c,_eventSubscriptions:s,_initialized:!1,_apiKey:null,_config:{},init(o,r){a._initialized?console.warn("[Encatch] SDK already initialized. Ignoring init call."):(a._apiKey=o,a._config=r||{},a._initialized=!0,c.push(["init",o,r]),"undefined"!=typeof window&&"undefined"!=typeof document&&function(o){return t?Promise.resolve():i?Promise.reject(i):n?new Promise((e,n)=>{const o=setInterval(()=>{t?(clearInterval(o),e()):i&&(clearInterval(o),n(i))},50)}):(n=!0,new Promise((r,c)=>{if(document.getElementById(e))return n=!1,t=!0,void r();const s=(o.webHost||"https://app.encatch.com")+"/s/sdk/v1/encatch.js",a=document.createElement("script");a.id=e,a.src=s,a.type="module",a.async=!0,a.onload=()=>{n=!1,t=!0,r()},a.onerror=e=>{n=!1,i=new Error(`[Encatch] Failed to load SDK from ${s}. Please check your network connection and web host configuration.`),console.error(i.message,e),c(i)};const d=document.getElementsByTagName("script")[0];d&&d.parentNode?d.parentNode.insertBefore(a,d):document.head.appendChild(a)}))}(a._config).catch(e=>{console.error("[Encatch] Failed to initialize SDK:",e)}))},on(e,n){const t={event:e,callback:n};return s.push(t),()=>{const e=s.indexOf(t);e>-1&&s.splice(e,1)}},off(e,n){const t=s.findIndex(t=>t.event===e&&t.callback===n);t>-1&&s.splice(t,1)},identifyUser:()=>{},setLocale:()=>{},setCountry:()=>{},setTheme:()=>{},trackEvent:()=>{},trackScreen:()=>{},startSession:()=>{},resetUser:()=>{},showForm:()=>{},addToResponse:()=>{}},d=r.filter(e=>"init"!==e);for(const e of d)a[e]=o(c,e);return a}const s=function(){if("undefined"!=typeof window){const e=window._encatch;if(e&&Array.isArray(e._q)){const n=c();return n._q.push(...e._q),Array.isArray(e._eventSubscriptions)&&n._eventSubscriptions.push(...e._eventSubscriptions),e._initialized&&(n._initialized=e._initialized,n._apiKey=e._apiKey,n._config=e._config||{}),window._encatch=n,n}const n=c();return window._encatch=n,n}return c()}();export{s as _encatch,s as default};
|
|
2
|
+
//# sourceMappingURL=encatch.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encatch.es.js","sources":["../src/loader.ts","../src/queue.ts","../src/index.ts"],"sourcesContent":["/**\n * Script Loader Utility\n * \n * Handles the dynamic loading of the remote SDK implementation script.\n * Provides error handling and prevents duplicate script injection.\n */\n\nimport type { EncatchConfig } from './types';\n\n/** Default web host for the remote implementation script */\nconst DEFAULT_WEB_HOST = 'https://app.encatch.com';\n\n/** Fixed path for the SDK script */\nconst SDK_SCRIPT_PATH = '/s/sdk/v1/encatch.js';\n\n/** Script element ID to prevent duplicate injections */\nconst SCRIPT_ID = 'encatch-sdk-script';\n\n/** Track loading state */\nlet isLoading = false;\nlet isLoaded = false;\nlet loadError: Error | null = null;\n\n/**\n * Load the remote SDK implementation script\n * \n * @param config - Configuration containing optional custom web host\n * @returns Promise that resolves when script loads, rejects on error\n */\nexport function loadRemoteScript(config: EncatchConfig): Promise<void> {\n // Return early if already loaded\n if (isLoaded) {\n return Promise.resolve();\n }\n\n // Return error if previous load failed\n if (loadError) {\n return Promise.reject(loadError);\n }\n\n // Return existing promise if already loading\n if (isLoading) {\n return new Promise((resolve, reject) => {\n const checkInterval = setInterval(() => {\n if (isLoaded) {\n clearInterval(checkInterval);\n resolve();\n } else if (loadError) {\n clearInterval(checkInterval);\n reject(loadError);\n }\n }, 50);\n });\n }\n\n isLoading = true;\n\n return new Promise((resolve, reject) => {\n // Check if script already exists in DOM\n const existingScript = document.getElementById(SCRIPT_ID);\n if (existingScript) {\n isLoading = false;\n isLoaded = true;\n resolve();\n return;\n }\n\n // Determine script URL from webHost\n const webHost = config.webHost || DEFAULT_WEB_HOST;\n const scriptUrl = webHost + SDK_SCRIPT_PATH;\n\n // Create and configure script element\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = scriptUrl;\n script.type = 'module';\n script.async = true;\n\n // Handle successful load\n script.onload = () => {\n isLoading = false;\n isLoaded = true;\n resolve();\n };\n\n // Handle load error\n script.onerror = (event) => {\n isLoading = false;\n loadError = new Error(\n `[Encatch] Failed to load SDK from ${scriptUrl}. ` +\n `Please check your network connection and web host configuration.`\n );\n console.error(loadError.message, event);\n reject(loadError);\n };\n\n // Inject script into document head\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(script, firstScript);\n } else {\n document.head.appendChild(script);\n }\n });\n}\n\n/**\n * Check if the remote script has been loaded\n */\nexport function isScriptLoaded(): boolean {\n return isLoaded;\n}\n\n/**\n * Reset loader state (useful for testing)\n */\nexport function resetLoaderState(): void {\n isLoading = false;\n isLoaded = false;\n loadError = null;\n}\n\n/**\n * Get the default script URL\n */\nexport function getDefaultScriptUrl(): string {\n return DEFAULT_WEB_HOST + SDK_SCRIPT_PATH;\n}\n","/**\n * Command Queue Implementation\n * \n * Manages the queue of SDK method calls that occur before the remote\n * implementation script has loaded. Commands are stored as tuples\n * and processed FIFO when the remote script becomes available.\n */\n\nimport type { Command, EncatchSDK } from './types';\n\n/**\n * Process all queued commands by calling the corresponding methods\n * on the SDK instance. This is called by the remote script once loaded.\n * \n * @param sdk - The SDK instance with real implementations\n * @param queue - Array of queued commands to process\n */\nexport function processQueue(sdk: EncatchSDK, queue: Command[]): void {\n while (queue.length > 0) {\n const command = queue.shift();\n if (!command) continue;\n\n const [method, ...args] = command;\n \n // Skip internal properties\n if (method.startsWith('_')) continue;\n\n // Get the method from the SDK\n const fn = sdk[method as keyof EncatchSDK];\n \n if (typeof fn === 'function') {\n try {\n (fn as (...args: unknown[]) => void).apply(sdk, args);\n } catch (error) {\n console.error(`[Encatch] Error processing queued command \"${method}\":`, error);\n }\n } else {\n console.warn(`[Encatch] Unknown method in queue: \"${method}\"`);\n }\n }\n}\n\n/**\n * Creates a stub method that queues calls for later processing\n * \n * @param queue - The command queue array\n * @param methodName - Name of the method being stubbed\n * @returns A function that pushes calls to the queue\n */\nexport function createQueuedMethod(\n queue: Command[],\n methodName: string\n): (...args: unknown[]) => void {\n return function (...args: unknown[]): void {\n queue.push([methodName, ...args]);\n };\n}\n\n/**\n * List of SDK methods that should be queued before initialization\n */\nexport const QUEUED_METHODS = [\n 'init',\n 'identifyUser',\n 'setLocale',\n 'setCountry',\n 'setTheme',\n 'trackEvent',\n 'trackScreen',\n 'startSession',\n 'resetUser',\n 'showForm',\n 'addToResponse',\n] as const;\n\nexport type QueuedMethodName = typeof QUEUED_METHODS[number];\n","/**\n * Encatch Web SDK\n * \n * A lightweight, type-safe SDK for integrating Encatch forms and surveys.\n * This module creates the _encatch global object that queues commands\n * until the remote implementation script loads.\n */\n\nimport type {\n EncatchSDK,\n EncatchConfig,\n UserTraits,\n IdentifyOptions,\n EventType,\n EventCallback,\n EventSubscription,\n Command,\n} from './types';\nimport { loadRemoteScript } from './loader';\nimport { createQueuedMethod, QUEUED_METHODS } from './queue';\n\n// Re-export types for consumers\nexport type {\n EncatchSDK,\n EncatchConfig,\n UserTraits,\n IdentifyOptions,\n EventType,\n EventCallback,\n EventPayload,\n Theme,\n} from './types';\n\n/**\n * Creates the Encatch SDK stub instance\n * All method calls are queued until setProject() is called and the\n * remote implementation script loads.\n */\nfunction createEncatchStub(): EncatchSDK {\n // Command queue for calls made before remote script loads\n const queue: Command[] = [];\n \n // Event subscriptions\n const eventSubscriptions: EventSubscription[] = [];\n\n // Create the SDK object\n const sdk: EncatchSDK = {\n // Internal state\n _q: queue,\n _eventSubscriptions: eventSubscriptions,\n _initialized: false,\n _apiKey: null,\n _config: {},\n\n // init is special - it triggers script loading\n init(apiKey: string, config?: EncatchConfig): void {\n if (sdk._initialized) {\n console.warn('[Encatch] SDK already initialized. Ignoring init call.');\n return;\n }\n\n sdk._apiKey = apiKey;\n sdk._config = config || {};\n sdk._initialized = true;\n\n // Queue this call for the remote implementation\n queue.push(['init', apiKey, config]);\n\n // Load the remote script\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n loadRemoteScript(sdk._config).catch((error) => {\n console.error('[Encatch] Failed to initialize SDK:', error);\n });\n }\n },\n\n // Event subscription - handled locally, persists across script load\n on(event: EventType, callback: EventCallback): () => void {\n const subscription: EventSubscription = { event, callback };\n eventSubscriptions.push(subscription);\n\n // Return unsubscribe function\n return () => {\n const index = eventSubscriptions.indexOf(subscription);\n if (index > -1) {\n eventSubscriptions.splice(index, 1);\n }\n };\n },\n\n // Event unsubscription\n off(event: EventType, callback: EventCallback): void {\n const index = eventSubscriptions.findIndex(\n (sub) => sub.event === event && sub.callback === callback\n );\n if (index > -1) {\n eventSubscriptions.splice(index, 1);\n }\n },\n\n // Stub implementations - will be replaced by remote script\n identifyUser: () => {},\n setLocale: () => {},\n setCountry: () => {},\n setTheme: () => {},\n trackEvent: () => {},\n trackScreen: () => {},\n startSession: () => {},\n resetUser: () => {},\n showForm: () => {},\n addToResponse: () => {},\n };\n\n // Replace stub methods with queue-based versions\n // Skip init (handled specially above) and on/off (handled locally)\n const methodsToQueue = QUEUED_METHODS.filter(m => m !== 'init');\n \n for (const method of methodsToQueue) {\n // Use type assertion to assign queued methods\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (sdk as any)[method] = createQueuedMethod(queue, method);\n }\n\n return sdk;\n}\n\n/**\n * Initialize the global _encatch object\n * This runs immediately when the script loads\n */\nfunction initGlobal(): EncatchSDK {\n // Check for existing instance (may have been created by snippet)\n if (typeof window !== 'undefined') {\n // If _encatch already exists with a queue, preserve it\n const existing = window._encatch;\n if (existing && Array.isArray(existing._q)) {\n // Merge existing queue into new instance\n const sdk = createEncatchStub();\n sdk._q.push(...existing._q);\n \n // Copy over any existing subscriptions\n if (Array.isArray(existing._eventSubscriptions)) {\n sdk._eventSubscriptions.push(...existing._eventSubscriptions);\n }\n \n // Copy initialization state\n if (existing._initialized) {\n sdk._initialized = existing._initialized;\n sdk._apiKey = existing._apiKey;\n sdk._config = existing._config || {};\n }\n \n window._encatch = sdk;\n return sdk;\n }\n\n // Create fresh instance\n const sdk = createEncatchStub();\n window._encatch = sdk;\n return sdk;\n }\n\n // Non-browser environment\n return createEncatchStub();\n}\n\n// Initialize and export\nexport const _encatch = initGlobal();\n\n// Default export for convenience\nexport default _encatch;\n"],"names":["SCRIPT_ID","isLoading","isLoaded","loadError","createQueuedMethod","queue","methodName","args","push","QUEUED_METHODS","createEncatchStub","eventSubscriptions","sdk","_q","_eventSubscriptions","_initialized","_apiKey","_config","init","apiKey","config","console","warn","window","document","Promise","resolve","reject","checkInterval","setInterval","clearInterval","getElementById","scriptUrl","webHost","script","createElement","id","src","type","async","onload","onerror","event","Error","error","message","firstScript","getElementsByTagName","parentNode","insertBefore","head","appendChild","loadRemoteScript","catch","on","callback","subscription","index","indexOf","splice","off","findIndex","sub","identifyUser","setLocale","setCountry","setTheme","trackEvent","trackScreen","startSession","resetUser","showForm","addToResponse","methodsToQueue","filter","m","method","_encatch","existing","Array","isArray","initGlobal"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e){"use strict";const n="encatch-sdk-script";let t=!1,i=!1,o=null;function c(e,n){return function(...t){e.push([n,...t])}}const r=["init","identifyUser","setLocale","setCountry","setTheme","trackEvent","trackScreen","startSession","resetUser","showForm","addToResponse"];function s(){const e=[],s=[],a={_q:e,_eventSubscriptions:s,_initialized:!1,_apiKey:null,_config:{},init(c,r){a._initialized?console.warn("[Encatch] SDK already initialized. Ignoring init call."):(a._apiKey=c,a._config=r||{},a._initialized=!0,e.push(["init",c,r]),"undefined"!=typeof window&&"undefined"!=typeof document&&function(e){return i?Promise.resolve():o?Promise.reject(o):t?new Promise((e,n)=>{const t=setInterval(()=>{i?(clearInterval(t),e()):o&&(clearInterval(t),n(o))},50)}):(t=!0,new Promise((c,r)=>{if(document.getElementById(n))return t=!1,i=!0,void c();const s=(e.webHost||"https://app.encatch.com")+"/s/sdk/v1/encatch.js",a=document.createElement("script");a.id=n,a.src=s,a.type="module",a.async=!0,a.onload=()=>{t=!1,i=!0,c()},a.onerror=e=>{t=!1,o=new Error(`[Encatch] Failed to load SDK from ${s}. Please check your network connection and web host configuration.`),console.error(o.message,e),r(o)};const d=document.getElementsByTagName("script")[0];d&&d.parentNode?d.parentNode.insertBefore(a,d):document.head.appendChild(a)}))}(a._config).catch(e=>{console.error("[Encatch] Failed to initialize SDK:",e)}))},on(e,n){const t={event:e,callback:n};return s.push(t),()=>{const e=s.indexOf(t);e>-1&&s.splice(e,1)}},off(e,n){const t=s.findIndex(t=>t.event===e&&t.callback===n);t>-1&&s.splice(t,1)},identifyUser:()=>{},setLocale:()=>{},setCountry:()=>{},setTheme:()=>{},trackEvent:()=>{},trackScreen:()=>{},startSession:()=>{},resetUser:()=>{},showForm:()=>{},addToResponse:()=>{}},d=r.filter(e=>"init"!==e);for(const n of d)a[n]=c(e,n);return a}const a=function(){if("undefined"!=typeof window){const e=window._encatch;if(e&&Array.isArray(e._q)){const n=s();return n._q.push(...e._q),Array.isArray(e._eventSubscriptions)&&n._eventSubscriptions.push(...e._eventSubscriptions),e._initialized&&(n._initialized=e._initialized,n._apiKey=e._apiKey,n._config=e._config||{}),window._encatch=n,n}const n=s();return window._encatch=n,n}return s()}();e._encatch=a,e.default=a,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}(this._encatch=this._encatch||{});
|
|
2
|
+
//# sourceMappingURL=encatch.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encatch.iife.js","sources":["../src/loader.ts","../src/queue.ts","../src/index.ts"],"sourcesContent":["/**\n * Script Loader Utility\n * \n * Handles the dynamic loading of the remote SDK implementation script.\n * Provides error handling and prevents duplicate script injection.\n */\n\nimport type { EncatchConfig } from './types';\n\n/** Default web host for the remote implementation script */\nconst DEFAULT_WEB_HOST = 'https://app.encatch.com';\n\n/** Fixed path for the SDK script */\nconst SDK_SCRIPT_PATH = '/s/sdk/v1/encatch.js';\n\n/** Script element ID to prevent duplicate injections */\nconst SCRIPT_ID = 'encatch-sdk-script';\n\n/** Track loading state */\nlet isLoading = false;\nlet isLoaded = false;\nlet loadError: Error | null = null;\n\n/**\n * Load the remote SDK implementation script\n * \n * @param config - Configuration containing optional custom web host\n * @returns Promise that resolves when script loads, rejects on error\n */\nexport function loadRemoteScript(config: EncatchConfig): Promise<void> {\n // Return early if already loaded\n if (isLoaded) {\n return Promise.resolve();\n }\n\n // Return error if previous load failed\n if (loadError) {\n return Promise.reject(loadError);\n }\n\n // Return existing promise if already loading\n if (isLoading) {\n return new Promise((resolve, reject) => {\n const checkInterval = setInterval(() => {\n if (isLoaded) {\n clearInterval(checkInterval);\n resolve();\n } else if (loadError) {\n clearInterval(checkInterval);\n reject(loadError);\n }\n }, 50);\n });\n }\n\n isLoading = true;\n\n return new Promise((resolve, reject) => {\n // Check if script already exists in DOM\n const existingScript = document.getElementById(SCRIPT_ID);\n if (existingScript) {\n isLoading = false;\n isLoaded = true;\n resolve();\n return;\n }\n\n // Determine script URL from webHost\n const webHost = config.webHost || DEFAULT_WEB_HOST;\n const scriptUrl = webHost + SDK_SCRIPT_PATH;\n\n // Create and configure script element\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = scriptUrl;\n script.type = 'module';\n script.async = true;\n\n // Handle successful load\n script.onload = () => {\n isLoading = false;\n isLoaded = true;\n resolve();\n };\n\n // Handle load error\n script.onerror = (event) => {\n isLoading = false;\n loadError = new Error(\n `[Encatch] Failed to load SDK from ${scriptUrl}. ` +\n `Please check your network connection and web host configuration.`\n );\n console.error(loadError.message, event);\n reject(loadError);\n };\n\n // Inject script into document head\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(script, firstScript);\n } else {\n document.head.appendChild(script);\n }\n });\n}\n\n/**\n * Check if the remote script has been loaded\n */\nexport function isScriptLoaded(): boolean {\n return isLoaded;\n}\n\n/**\n * Reset loader state (useful for testing)\n */\nexport function resetLoaderState(): void {\n isLoading = false;\n isLoaded = false;\n loadError = null;\n}\n\n/**\n * Get the default script URL\n */\nexport function getDefaultScriptUrl(): string {\n return DEFAULT_WEB_HOST + SDK_SCRIPT_PATH;\n}\n","/**\n * Command Queue Implementation\n * \n * Manages the queue of SDK method calls that occur before the remote\n * implementation script has loaded. Commands are stored as tuples\n * and processed FIFO when the remote script becomes available.\n */\n\nimport type { Command, EncatchSDK } from './types';\n\n/**\n * Process all queued commands by calling the corresponding methods\n * on the SDK instance. This is called by the remote script once loaded.\n * \n * @param sdk - The SDK instance with real implementations\n * @param queue - Array of queued commands to process\n */\nexport function processQueue(sdk: EncatchSDK, queue: Command[]): void {\n while (queue.length > 0) {\n const command = queue.shift();\n if (!command) continue;\n\n const [method, ...args] = command;\n \n // Skip internal properties\n if (method.startsWith('_')) continue;\n\n // Get the method from the SDK\n const fn = sdk[method as keyof EncatchSDK];\n \n if (typeof fn === 'function') {\n try {\n (fn as (...args: unknown[]) => void).apply(sdk, args);\n } catch (error) {\n console.error(`[Encatch] Error processing queued command \"${method}\":`, error);\n }\n } else {\n console.warn(`[Encatch] Unknown method in queue: \"${method}\"`);\n }\n }\n}\n\n/**\n * Creates a stub method that queues calls for later processing\n * \n * @param queue - The command queue array\n * @param methodName - Name of the method being stubbed\n * @returns A function that pushes calls to the queue\n */\nexport function createQueuedMethod(\n queue: Command[],\n methodName: string\n): (...args: unknown[]) => void {\n return function (...args: unknown[]): void {\n queue.push([methodName, ...args]);\n };\n}\n\n/**\n * List of SDK methods that should be queued before initialization\n */\nexport const QUEUED_METHODS = [\n 'init',\n 'identifyUser',\n 'setLocale',\n 'setCountry',\n 'setTheme',\n 'trackEvent',\n 'trackScreen',\n 'startSession',\n 'resetUser',\n 'showForm',\n 'addToResponse',\n] as const;\n\nexport type QueuedMethodName = typeof QUEUED_METHODS[number];\n","/**\n * Encatch Web SDK\n * \n * A lightweight, type-safe SDK for integrating Encatch forms and surveys.\n * This module creates the _encatch global object that queues commands\n * until the remote implementation script loads.\n */\n\nimport type {\n EncatchSDK,\n EncatchConfig,\n UserTraits,\n IdentifyOptions,\n EventType,\n EventCallback,\n EventSubscription,\n Command,\n} from './types';\nimport { loadRemoteScript } from './loader';\nimport { createQueuedMethod, QUEUED_METHODS } from './queue';\n\n// Re-export types for consumers\nexport type {\n EncatchSDK,\n EncatchConfig,\n UserTraits,\n IdentifyOptions,\n EventType,\n EventCallback,\n EventPayload,\n Theme,\n} from './types';\n\n/**\n * Creates the Encatch SDK stub instance\n * All method calls are queued until setProject() is called and the\n * remote implementation script loads.\n */\nfunction createEncatchStub(): EncatchSDK {\n // Command queue for calls made before remote script loads\n const queue: Command[] = [];\n \n // Event subscriptions\n const eventSubscriptions: EventSubscription[] = [];\n\n // Create the SDK object\n const sdk: EncatchSDK = {\n // Internal state\n _q: queue,\n _eventSubscriptions: eventSubscriptions,\n _initialized: false,\n _apiKey: null,\n _config: {},\n\n // init is special - it triggers script loading\n init(apiKey: string, config?: EncatchConfig): void {\n if (sdk._initialized) {\n console.warn('[Encatch] SDK already initialized. Ignoring init call.');\n return;\n }\n\n sdk._apiKey = apiKey;\n sdk._config = config || {};\n sdk._initialized = true;\n\n // Queue this call for the remote implementation\n queue.push(['init', apiKey, config]);\n\n // Load the remote script\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n loadRemoteScript(sdk._config).catch((error) => {\n console.error('[Encatch] Failed to initialize SDK:', error);\n });\n }\n },\n\n // Event subscription - handled locally, persists across script load\n on(event: EventType, callback: EventCallback): () => void {\n const subscription: EventSubscription = { event, callback };\n eventSubscriptions.push(subscription);\n\n // Return unsubscribe function\n return () => {\n const index = eventSubscriptions.indexOf(subscription);\n if (index > -1) {\n eventSubscriptions.splice(index, 1);\n }\n };\n },\n\n // Event unsubscription\n off(event: EventType, callback: EventCallback): void {\n const index = eventSubscriptions.findIndex(\n (sub) => sub.event === event && sub.callback === callback\n );\n if (index > -1) {\n eventSubscriptions.splice(index, 1);\n }\n },\n\n // Stub implementations - will be replaced by remote script\n identifyUser: () => {},\n setLocale: () => {},\n setCountry: () => {},\n setTheme: () => {},\n trackEvent: () => {},\n trackScreen: () => {},\n startSession: () => {},\n resetUser: () => {},\n showForm: () => {},\n addToResponse: () => {},\n };\n\n // Replace stub methods with queue-based versions\n // Skip init (handled specially above) and on/off (handled locally)\n const methodsToQueue = QUEUED_METHODS.filter(m => m !== 'init');\n \n for (const method of methodsToQueue) {\n // Use type assertion to assign queued methods\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (sdk as any)[method] = createQueuedMethod(queue, method);\n }\n\n return sdk;\n}\n\n/**\n * Initialize the global _encatch object\n * This runs immediately when the script loads\n */\nfunction initGlobal(): EncatchSDK {\n // Check for existing instance (may have been created by snippet)\n if (typeof window !== 'undefined') {\n // If _encatch already exists with a queue, preserve it\n const existing = window._encatch;\n if (existing && Array.isArray(existing._q)) {\n // Merge existing queue into new instance\n const sdk = createEncatchStub();\n sdk._q.push(...existing._q);\n \n // Copy over any existing subscriptions\n if (Array.isArray(existing._eventSubscriptions)) {\n sdk._eventSubscriptions.push(...existing._eventSubscriptions);\n }\n \n // Copy initialization state\n if (existing._initialized) {\n sdk._initialized = existing._initialized;\n sdk._apiKey = existing._apiKey;\n sdk._config = existing._config || {};\n }\n \n window._encatch = sdk;\n return sdk;\n }\n\n // Create fresh instance\n const sdk = createEncatchStub();\n window._encatch = sdk;\n return sdk;\n }\n\n // Non-browser environment\n return createEncatchStub();\n}\n\n// Initialize and export\nexport const _encatch = initGlobal();\n\n// Default export for convenience\nexport default _encatch;\n"],"names":["SCRIPT_ID","isLoading","isLoaded","loadError","createQueuedMethod","queue","methodName","args","push","QUEUED_METHODS","createEncatchStub","eventSubscriptions","sdk","_q","_eventSubscriptions","_initialized","_apiKey","_config","init","apiKey","config","console","warn","window","document","Promise","resolve","reject","checkInterval","setInterval","clearInterval","getElementById","scriptUrl","webHost","script","createElement","id","src","type","async","onload","onerror","event","Error","error","message","firstScript","getElementsByTagName","parentNode","insertBefore","head","appendChild","loadRemoteScript","catch","on","callback","subscription","index","indexOf","splice","off","findIndex","sub","identifyUser","setLocale","setCountry","setTheme","trackEvent","trackScreen","startSession","resetUser","showForm","addToResponse","methodsToQueue","filter","m","method","_encatch","existing","Array","isArray","initGlobal"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal command tuple type for the queue
|
|
3
|
+
*/
|
|
4
|
+
declare type Command = [string, ...unknown[]];
|
|
5
|
+
|
|
6
|
+
declare const _encatch: EncatchSDK;
|
|
7
|
+
export { _encatch }
|
|
8
|
+
export default _encatch;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Configuration options for the SDK
|
|
12
|
+
*/
|
|
13
|
+
export declare interface EncatchConfig {
|
|
14
|
+
/** Override the default web host for loading the SDK script */
|
|
15
|
+
webHost?: string;
|
|
16
|
+
/** Theme setting - defaults to 'system' */
|
|
17
|
+
theme?: Theme;
|
|
18
|
+
/** API base URL - defaults to 'https://app.encatch.com' */
|
|
19
|
+
apiBaseUrl?: string;
|
|
20
|
+
/** When true, displays the form inline at full height without modal overlay */
|
|
21
|
+
isFullScreen?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The Encatch SDK interface
|
|
26
|
+
*/
|
|
27
|
+
export declare interface EncatchSDK {
|
|
28
|
+
/**
|
|
29
|
+
* Initialize the SDK with an API key
|
|
30
|
+
* This triggers the loading of the remote implementation script
|
|
31
|
+
* @param apiKey - Your Encatch API key
|
|
32
|
+
* @param config - Optional configuration options
|
|
33
|
+
*/
|
|
34
|
+
init(apiKey: string, config?: EncatchConfig): void;
|
|
35
|
+
/**
|
|
36
|
+
* Identify the current user
|
|
37
|
+
* @param id - Unique user identifier (required)
|
|
38
|
+
* @param traits - Optional user traits with nested operations ($set, $setOnce, $increment, $decrement, $unset)
|
|
39
|
+
* @param options - Optional settings like locale, country, and secure signature
|
|
40
|
+
*/
|
|
41
|
+
identifyUser(id: string, traits?: UserTraits, options?: IdentifyOptions): void;
|
|
42
|
+
/**
|
|
43
|
+
* Set the user's preferred locale
|
|
44
|
+
* @param locale - Comma-separated ISO 639-1 language codes (e.g., 'fr,en,es')
|
|
45
|
+
*/
|
|
46
|
+
setLocale(locale: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Set the user's country
|
|
49
|
+
* @param country - ISO 3166 country code (e.g., 'US', 'FR')
|
|
50
|
+
*/
|
|
51
|
+
setCountry(country: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Set the theme
|
|
54
|
+
* @param theme - Theme value ('light', 'dark', or 'system')
|
|
55
|
+
*/
|
|
56
|
+
setTheme(theme: Theme): void;
|
|
57
|
+
/**
|
|
58
|
+
* Track a custom event
|
|
59
|
+
* @param eventName - Name of the event to track
|
|
60
|
+
*/
|
|
61
|
+
trackEvent(eventName: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Track a screen view
|
|
64
|
+
* @param screenName - Name of the screen to track
|
|
65
|
+
*/
|
|
66
|
+
trackScreen(screenName: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Manually start a new session
|
|
69
|
+
* Useful after user login to reset session timing
|
|
70
|
+
*/
|
|
71
|
+
startSession(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Reset the current user (logout)
|
|
74
|
+
* Reverts the SDK to anonymous mode
|
|
75
|
+
*/
|
|
76
|
+
resetUser(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Show a specific form by ID
|
|
79
|
+
* @param formId - The ID of the form to display
|
|
80
|
+
* @param force - Force show even if already shown (optional)
|
|
81
|
+
*/
|
|
82
|
+
showForm(formId: string, force?: boolean): void;
|
|
83
|
+
/**
|
|
84
|
+
* Prepopulate a form response
|
|
85
|
+
* @param questionId - The ID of the question to prepopulate
|
|
86
|
+
* @param value - The value to set
|
|
87
|
+
*/
|
|
88
|
+
addToResponse(questionId: string, value: unknown): void;
|
|
89
|
+
/**
|
|
90
|
+
* Subscribe to SDK events
|
|
91
|
+
* @param event - The event type to listen for
|
|
92
|
+
* @param callback - Function to call when event occurs
|
|
93
|
+
* @returns Unsubscribe function
|
|
94
|
+
*/
|
|
95
|
+
on(event: EventType, callback: EventCallback): () => void;
|
|
96
|
+
/**
|
|
97
|
+
* Unsubscribe from SDK events
|
|
98
|
+
* @param event - The event type to stop listening for
|
|
99
|
+
* @param callback - The callback to remove
|
|
100
|
+
*/
|
|
101
|
+
off(event: EventType, callback: EventCallback): void;
|
|
102
|
+
/** Internal: Command queue for calls made before script loads */
|
|
103
|
+
_q: Command[];
|
|
104
|
+
/** Internal: Event subscriptions */
|
|
105
|
+
_eventSubscriptions: EventSubscription[];
|
|
106
|
+
/** Internal: Whether the SDK has been initialized */
|
|
107
|
+
_initialized: boolean;
|
|
108
|
+
/** Internal: The API key */
|
|
109
|
+
_apiKey: string | null;
|
|
110
|
+
/** Internal: Configuration */
|
|
111
|
+
_config: EncatchConfig;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Event callback function type
|
|
116
|
+
*/
|
|
117
|
+
export declare type EventCallback = (payload: EventPayload) => void;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Event payload structure
|
|
121
|
+
*/
|
|
122
|
+
export declare interface EventPayload {
|
|
123
|
+
/** The form ID related to the event */
|
|
124
|
+
formId?: string;
|
|
125
|
+
/** Timestamp of the event */
|
|
126
|
+
timestamp: number;
|
|
127
|
+
/** Additional event-specific data */
|
|
128
|
+
data?: Record<string, unknown>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Event subscription entry
|
|
133
|
+
*/
|
|
134
|
+
declare interface EventSubscription {
|
|
135
|
+
event: EventType;
|
|
136
|
+
callback: EventCallback;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Event types that can be subscribed to
|
|
141
|
+
*/
|
|
142
|
+
export declare type EventType = 'form:show' | 'form:submit' | 'form:close' | 'form:complete' | 'form:error';
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Options for the identifyUser method
|
|
146
|
+
*/
|
|
147
|
+
export declare interface IdentifyOptions {
|
|
148
|
+
/** User's preferred locale (ISO 639-1 codes, comma-separated) */
|
|
149
|
+
locale?: string;
|
|
150
|
+
/** User's country (ISO 3166 country code) */
|
|
151
|
+
country?: string;
|
|
152
|
+
/** Secure identification options with signature */
|
|
153
|
+
secure?: SecureOptions;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Secure options for user identification
|
|
158
|
+
*/
|
|
159
|
+
declare interface SecureOptions {
|
|
160
|
+
/** User signature (required when secure is set) */
|
|
161
|
+
signature: string;
|
|
162
|
+
/** Optional datetime in UTC when the signature was generated */
|
|
163
|
+
generatedDateTimeinUTC?: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Theme options
|
|
168
|
+
*/
|
|
169
|
+
export declare type Theme = 'light' | 'dark' | 'system';
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Encatch Web SDK Type Definitions
|
|
173
|
+
*/
|
|
174
|
+
/**
|
|
175
|
+
* User traits for identifying users
|
|
176
|
+
* Supports nested operations: $set, $setOnce, $increment, $decrement, $unset
|
|
177
|
+
*/
|
|
178
|
+
export declare interface UserTraits {
|
|
179
|
+
/** Set user attributes (overwrites existing values) */
|
|
180
|
+
$set?: Record<string, any>;
|
|
181
|
+
/** Set user attributes only if they don't already exist */
|
|
182
|
+
$setOnce?: Record<string, any>;
|
|
183
|
+
/** Increment numeric user attributes */
|
|
184
|
+
$increment?: Record<string, number>;
|
|
185
|
+
/** Decrement numeric user attributes */
|
|
186
|
+
$decrement?: Record<string, number>;
|
|
187
|
+
/** Remove user attributes */
|
|
188
|
+
$unset?: string[];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export { }
|
package/package.json
CHANGED
|
@@ -1,72 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@encatch/web-sdk",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
|
+
"description": "A lightweight, type-safe JavaScript SDK for integrating Encatch forms and surveys",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist
|
|
7
|
-
"module": "dist
|
|
8
|
-
"types": "index.d.ts",
|
|
6
|
+
"main": "dist/encatch.es.js",
|
|
7
|
+
"module": "dist/encatch.es.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/encatch.es.js",
|
|
13
|
+
"require": "./dist/encatch.iife.js"
|
|
13
14
|
},
|
|
14
|
-
"./
|
|
15
|
-
"import": "./dist
|
|
16
|
-
},
|
|
17
|
-
"./embedded": {
|
|
18
|
-
"import": "./dist-sdk/plugin/sdk/embedded-sdk.js"
|
|
19
|
-
},
|
|
20
|
-
"./preview": {
|
|
21
|
-
"import": "./dist-sdk/plugin/sdk/preview-sdk.js"
|
|
15
|
+
"./iife": {
|
|
16
|
+
"import": "./dist/encatch.iife.js"
|
|
22
17
|
}
|
|
23
18
|
},
|
|
24
19
|
"files": [
|
|
25
|
-
"dist
|
|
26
|
-
"index.d.ts",
|
|
27
|
-
"src/@types",
|
|
28
|
-
"src/hooks",
|
|
29
|
-
"src/utils",
|
|
30
|
-
"src/store",
|
|
31
|
-
"src/feedback-api-types.ts",
|
|
32
|
-
"src/module.tsx",
|
|
33
|
-
"src/encatch-instance.ts",
|
|
20
|
+
"dist",
|
|
34
21
|
"README.md"
|
|
35
22
|
],
|
|
23
|
+
"sideEffects": false,
|
|
36
24
|
"keywords": [
|
|
37
|
-
"feedback",
|
|
38
|
-
"survey",
|
|
39
|
-
"sdk",
|
|
40
25
|
"encatch",
|
|
26
|
+
"sdk",
|
|
27
|
+
"forms",
|
|
28
|
+
"surveys",
|
|
29
|
+
"feedback",
|
|
30
|
+
"analytics",
|
|
41
31
|
"user-feedback",
|
|
42
32
|
"web-sdk"
|
|
43
33
|
],
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"@preact/signals": "^2.5.1",
|
|
46
|
-
"json-logic-js": "2.0.5",
|
|
47
|
-
"lucide-preact": "^0.555.0",
|
|
48
|
-
"path-to-regexp": "^8.3.0",
|
|
49
|
-
"preact": "^10.27.2",
|
|
50
|
-
"preact-iso": "^2.11.0",
|
|
51
|
-
"ua-parser-js": "^2.0.6",
|
|
52
|
-
"@encatch/api-sdk": "0.0.11-beta.4",
|
|
53
|
-
"@encatch/schema": "0.1.38-beta.6",
|
|
54
|
-
"@encatch/event-publisher": "0.0.2-beta.2"
|
|
55
|
-
},
|
|
56
34
|
"devDependencies": {
|
|
57
|
-
"
|
|
58
|
-
"vite": "^7.
|
|
59
|
-
"
|
|
35
|
+
"typescript": "^5.9.3",
|
|
36
|
+
"vite": "^7.3.1",
|
|
37
|
+
"vite-plugin-dts": "^4.5.4",
|
|
38
|
+
"terser": "^5.44.1"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/encatch/web-sdk"
|
|
60
43
|
},
|
|
61
|
-
"
|
|
62
|
-
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18"
|
|
63
47
|
},
|
|
64
48
|
"scripts": {
|
|
65
|
-
"dev": "vite",
|
|
66
|
-
"build": "vite build
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"preview:sdk": "vite preview --config vite.config.ts",
|
|
70
|
-
"clean": "rm -rf dist-sdk"
|
|
49
|
+
"dev": "vite build --watch",
|
|
50
|
+
"build": "vite build",
|
|
51
|
+
"clean": "rm -rf dist",
|
|
52
|
+
"typecheck": "tsc --noEmit"
|
|
71
53
|
}
|
|
72
54
|
}
|