@coveo/relay 0.5.0 → 0.6.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.
@@ -1,2 +1,2 @@
1
- async function e({event:e,config:t,environment:n}){const{url:r,token:o}=t,c={"Content-Type":"application/json",Authorization:`Bearer ${o}`},a=await n.fetch(`${r}${"validate"==t.mode?"/validate":""}`,{method:"POST",body:JSON.stringify([e]),headers:c}),i=await a.json();if(!a.ok)throw new Error({...i});return i}let t;const n=new Uint8Array(16);function r(){if(!t&&(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!t))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;const c=[];for(let e=0;e<256;++e)c.push((e+256).toString(16).slice(1));var a={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function i(e,t,n){if(a.randomUUID&&!t&&!e)return a.randomUUID();const o=(e=e||{}).random||(e.rng||r)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=o[e];return t}return function(e,t=0){return(c[e[t+0]]+c[e[t+1]]+c[e[t+2]]+c[e[t+3]]+"-"+c[e[t+4]]+c[e[t+5]]+"-"+c[e[t+6]]+c[e[t+7]]+"-"+c[e[t+8]]+c[e[t+9]]+"-"+c[e[t+10]]+c[e[t+11]]+c[e[t+12]]+c[e[t+13]]+c[e[t+14]]+c[e[t+15]]).toLowerCase()}(o)}function u(e){const t="visitorId";return{getClientId:()=>{const n=e.storage,r=n.getItem(t),c=r&&("string"==typeof(a=r)&&o.test(a))?r:e.generateUUID();var a;return n.setItem(t,c),c},clear:()=>{e.storage.removeItem(t)}}}const s=function(){const e="coveo_";return{getItem(t){const n=`${e}${t}=`,r=document.cookie.split(";");for(const e of r){const t=e.replace(/^\s+/,"");if(0===t.lastIndexOf(n,0))return t.substring(n.length,t.length)}return null},setItem(t,n,r){const o=(e=>{const t=e.split(".").slice(-2);return 2==t.length?t.join("."):""})(window.location.hostname),c=`;expires=${new Date((new Date).getTime()+r).toUTCString()}`,a=o?`;domain=${o}`:"";document.cookie=`${e}${t}=${n}${c}${a};path=/;SameSite=Lax`},removeItem(e){this.setItem(e,"",-1)}}}();async function l(e,t){return fetch(e,t).catch((e=>{throw new Error(`${e.message}: The "host" value is invalid or a network error occured, according to the FetchAPI's response.`,{cause:e})}))}function f(){return{runtime:"browser",fetch:(e,t)=>l(e,t),getReferrerUrl:()=>function(){const e=document.referrer;return""===e?null:e}(),getUrl:()=>window.location.href,getUserAgent:()=>navigator.userAgent,generateUUID:()=>i(),storage:{getItem:e=>s.getItem(e)||localStorage.getItem(e),removeItem(e){s.removeItem(e),localStorage.removeItem(e)},setItem(e,t){localStorage.setItem(e,t),s.setItem(e,t,31556952e3)}}}}function g(){return{getItem:()=>null,removeItem(){},setItem(){}}}function d(){return function(){try{return"object"==typeof window}catch(e){return!1}}()?f():{runtime:"node",fetch:(e,t)=>l(e,t),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>i(),storage:g()}}const m="0.5.0";function p(e,t,n,r){const{getReferrerUrl:o,getUrl:c,getUserAgent:a}=n,i=function(e){const{trackingId:t}=e;return{trackingId:t}}(t),u=r.getClientId();return Object.freeze({type:e,config:i,ts:Date.now(),source:`relay@${m}`,clientId:u,userAgent:a(),referrerUrl:o(),url:c()})}const I="*";function y(){const e=[];function t({type:t,callback:n}){return e.findIndex((e=>e.type===t&&e.callback===n))}function n(n,r){r?function(n){const r=t(n);r>=0&&e.splice(r,1)}({type:n,callback:r}):function(t){if(t===I)e.length=0;else for(let n=e.length-1;n>=0;n--)e[n].type===t&&e.splice(n,1)}(n)}return{add:function(r){return t(r)<0&&e.push(r),()=>n(r.type,r.callback)},call:function(t){e.forEach((e=>{if(function(e,t){return"*"===e.type||t===e.type}(e,t.meta.type))try{e.callback(t)}catch(e){console.error(e)}}))},remove:n}}function h({url:e,token:t,trackingId:n,...r}){return Object.freeze({url:e,token:t,trackingId:n,...!!r.mode&&{mode:r.mode}})}function U(t){const n=function(e){let t=h(e);return{get:()=>t,update:e=>{t=h({...t,...e})}}}(t),r=()=>"disabled"==n.get().mode?{runtime:"null",fetch:()=>Promise.resolve(new Response(JSON.stringify(""))),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>"",storage:g()}:d(),o=u(r()),{add:c,call:a,remove:i}=y();return{emit:(t,c)=>{const i=function(e,t,n,r,o){return{...t,meta:p(e,n,r,o)}}(t,c,n.get(),r(),o);a(i);const u={config:n.get(),environment:r(),event:i};return"validate"===n.get().mode?async function(t){const n=await e(t);if(!n)return{valid:!1,errors:[{type:"",message:"disabled",path:""}]};const{valid:r,errors:o}=n[0];return{valid:r,errors:o??[]}}(u):async function(t){await e(t)}(u)},getMeta:e=>p(e,n.get(),r(),o),on:(e,t)=>c({type:e,callback:t}),off:(e,t)=>i(e,t),updateConfig:e=>n.update(e),version:m,clearStorage:()=>{o.clear()}}}export{U as createRelay};
1
+ async function e({event:e,config:t,environment:n}){const{url:r,token:o}=t,c={"Content-Type":"application/json",Authorization:`Bearer ${o}`},a=await n.fetch(`${r}${"validate"==t.mode?"/validate":""}`,{method:"POST",body:JSON.stringify([e]),headers:c}),i=await a.json();if(!a.ok)throw new Error({...i});return i}async function t(t){const{listenerManager:n,event:r,config:o}=t;return"disabled"!==o.mode&&n.call(r),"validate"===o.mode?async function(t){const n=await e(t);if(!n)return{valid:!1,errors:[{type:"",message:"disabled",path:""}]};const{valid:r,errors:o}=n[0];return{valid:r,errors:o??[]}}(t):async function(t){await e(t)}(t)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){const t="visitorId";return{getClientId:()=>{const r=e.storage,o=r.getItem(t),c=o&&("string"==typeof(a=o)&&n.test(a))?o:e.generateUUID();var a;return r.setItem(t,c),c},clear:()=>{e.storage.removeItem(t)}}}const o=function(){const e="coveo_";return{getItem(t){const n=`${e}${t}=`,r=document.cookie.split(";");for(const e of r){const t=e.replace(/^\s+/,"");if(0===t.lastIndexOf(n,0))return t.substring(n.length,t.length)}return null},setItem(t,n,r){const o=(e=>{const t=e.split(".").slice(-2);return 2==t.length?t.join("."):""})(window.location.hostname),c=`;expires=${new Date((new Date).getTime()+r).toUTCString()}`,a=o?`;domain=${o}`:"";document.cookie=`${e}${t}=${n}${c}${a};path=/;SameSite=Lax`},removeItem(e){this.setItem(e,"",-1)}}}();async function c(e,t){return fetch(e,t).catch((e=>{throw new Error(`${e.message}: The "host" value is invalid or a network error occured, according to the FetchAPI's response.`,{cause:e})}))}function a(){return{runtime:"browser",fetch:(e,t)=>c(e,t),getReferrerUrl:()=>function(){const e=document.referrer;return""===e?null:e}(),getUrl:()=>window.location.href,getUserAgent:()=>navigator.userAgent,generateUUID:()=>crypto.randomUUID(),storage:{getItem:e=>o.getItem(e)||localStorage.getItem(e),removeItem(e){o.removeItem(e),localStorage.removeItem(e)},setItem(e,t){localStorage.setItem(e,t),o.setItem(e,t,31556952e3)}}}}function i(){return{getItem:()=>null,removeItem(){},setItem(){}}}function l(){return function(){try{return"object"==typeof window}catch(e){return!1}}()?a():{runtime:"node",fetch:(e,t)=>c(e,t),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>crypto.randomUUID(),storage:i()}}const s="0.6.1";function u(e,t,n,r){const{getReferrerUrl:o,getUrl:c,getUserAgent:a}=n,i=function(e){const{trackingId:t}=e;return{trackingId:t}}(t),l=r.getClientId();return Object.freeze({type:e,config:i,ts:Date.now(),source:`relay@${s}`,clientId:l,userAgent:a(),referrerUrl:o(),url:c()})}const g="*";function f(){const e=[];function t({type:t,callback:n}){return e.findIndex((e=>e.type===t&&e.callback===n))}function n(n,r){r?function(n){const r=t(n);r>=0&&e.splice(r,1)}({type:n,callback:r}):function(t){if(t===g)e.length=0;else for(let n=e.length-1;n>=0;n--)e[n].type===t&&e.splice(n,1)}(n)}return{add:function(r){return t(r)<0&&e.push(r),()=>n(r.type,r.callback)},call:function(t){e.forEach((e=>{if(function(e,t){return"*"===e.type||t===e.type}(e,t.meta.type))try{e.callback(t)}catch(e){console.error(e)}}))},remove:n}}function m({url:e,token:t,trackingId:n,...r}){return Object.freeze({url:e,token:t,trackingId:n,...!!r.mode&&{mode:r.mode}})}function d(e){const n=function(e){let t=m(e);return{get:()=>t,update:e=>{t=m({...t,...e})}}}(e),o=f(),c=()=>"disabled"==n.get().mode?{runtime:"null",fetch:()=>Promise.resolve(new Response(JSON.stringify(""))),getReferrerUrl:()=>null,getUrl:()=>null,getUserAgent:()=>null,generateUUID:()=>"",storage:i()}:l(),a=r(c());return{emit:(e,r)=>{const i=n.get(),l=c(),s=function(e,t,n,r,o){return{...t,meta:u(e,n,r,o)}}(e,r,i,l,a);return t({config:i,environment:l,event:s,listenerManager:o})},getMeta:e=>u(e,n.get(),c(),a),on:(e,t)=>o.add({type:e,callback:t}),off:(e,t)=>o.remove(e,t),updateConfig:e=>n.update(e),version:s,clearStorage:()=>{a.clear()}}}export{d as createRelay};
2
2
  //# sourceMappingURL=relay.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay.min.js","sources":["../../src/event-api-call/event-api-caller.ts","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/regex.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/v4.js","../../src/client-id/client-id.ts","../../../../node_modules/.pnpm/uuid@9.0.0/node_modules/uuid/dist/esm-browser/validate.js","../../src/environment/browser/storage/cookie.ts","../../src/environment/utils/fetch.ts","../../src/environment/browser/browser.ts","../../src/environment/browser/storage/storage.ts","../../src/environment/storage.ts","../../src/environment/environment.ts","../../src/environment/node/node.ts","../../src/version.ts","../../src/event/meta/meta.ts","../../src/listener/listener.ts","../../src/config/config.ts","../../src/relay.ts","../../src/environment/null/null.ts","../../src/event/relay-event.ts","../../src/validate/validate.ts","../../src/emit/emit.ts"],"sourcesContent":["import { Environment } from \"../environment/environment\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { RelayConfig } from \"../config/config\";\nimport { ValidationResponse } from \"../relay\";\n\nexport interface EventApiCallParams {\n config: RelayConfig;\n environment: Environment;\n event: Readonly<RelayEvent>;\n}\n\nexport async function callEventApi<T>({\n event,\n config,\n environment,\n}: EventApiCallParams): Promise<T> {\n const { url, token } = config;\n const headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n const response = await environment.fetch(\n `${url}${config.mode == \"validate\" ? \"/validate\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify([event]),\n headers,\n }\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error({\n ...data,\n });\n }\n\n return data;\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { validate } from \"uuid\";\nimport { Environment } from \"../environment/environment\";\n\nexport interface ClientIdManager {\n getClientId: () => string;\n clear: () => void;\n}\n\nexport function createClientIdManager(\n environment: Environment\n): ClientIdManager {\n const key = \"visitorId\";\n return {\n getClientId: () => {\n const storage = environment.storage;\n\n const existingClientId = storage.getItem(key);\n const clientId =\n existingClientId && validate(existingClientId)\n ? existingClientId\n : environment.generateUUID();\n storage.setItem(key, clientId);\n return clientId;\n },\n clear: () => {\n environment.storage.removeItem(key);\n },\n };\n}\n","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","export interface CookieManager {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string, expire: number) => void;\n}\n\nexport const cookieManager: CookieManager = createCookieManager();\n\nfunction createCookieManager(): CookieManager {\n const prefix = \"coveo_\";\n const getDomain = (host: string) => {\n const parts = host.split(\".\").slice(-2);\n return parts.length == 2 ? parts.join(\".\") : \"\";\n };\n\n return {\n getItem(key: string): string | null {\n const cookiePrefix = `${prefix}${key}=`;\n const cookieArray = document.cookie.split(\";\");\n for (const cookie of cookieArray) {\n const prettifyCookie = cookie.replace(/^\\s+/, \"\");\n if (prettifyCookie.lastIndexOf(cookiePrefix, 0) === 0) {\n return prettifyCookie.substring(\n cookiePrefix.length,\n prettifyCookie.length\n );\n }\n }\n return null;\n },\n setItem(key: string, data: string, expire: number): void {\n const domain = getDomain(window.location.hostname);\n const expireSection = `;expires=${new Date(\n new Date().getTime() + expire\n ).toUTCString()}`;\n const domainSection = domain ? `;domain=${domain}` : \"\";\n document.cookie = `${prefix}${key}=${data}${expireSection}${domainSection};path=/;SameSite=Lax`;\n },\n\n removeItem(key: string): void {\n this.setItem(key, \"\", -1);\n },\n };\n}\n","export async function fetchAPI(\n url: string,\n init?: RequestInit\n): Promise<Response> {\n return fetch(url, init).catch((err: Error) => {\n throw new Error(\n `${err.message}: The \"host\" value is invalid or a network error occured, according to the FetchAPI's response.`,\n { cause: err }\n );\n });\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { Environment } from \"../environment\";\nimport { createBrowserStorage } from \"./storage/storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nfunction getReferrerUrl() {\n const referrer = document.referrer;\n\n return referrer === \"\" ? null : referrer;\n}\n\nexport function buildBrowserEnvironment(): Environment {\n return {\n runtime: \"browser\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => getReferrerUrl(),\n getUrl: () => window.location.href,\n getUserAgent: () => navigator.userAgent,\n generateUUID: () => uuidv4(),\n storage: createBrowserStorage(),\n };\n}\n","import { Storage } from \"../../storage\";\nimport { cookieManager } from \"./cookie\";\n\nexport function createBrowserStorage(): Storage {\n return {\n getItem(key: string): string | null {\n return cookieManager.getItem(key) || localStorage.getItem(key);\n },\n\n removeItem(key: string): void {\n cookieManager.removeItem(key);\n localStorage.removeItem(key);\n },\n\n setItem(key: string, data: string): void {\n const oneYear = 31556952000;\n localStorage.setItem(key, data);\n cookieManager.setItem(key, data, oneYear);\n },\n };\n}\n","export interface Storage {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string) => void;\n}\n\nexport function createNullStorage(): Storage {\n return {\n getItem(): string | null {\n return null;\n },\n removeItem(): void {\n return;\n },\n setItem(): void {\n return;\n },\n };\n}\n","import { buildBrowserEnvironment } from \"./browser/browser\";\nimport { buildNodeEnvironment } from \"./node/node\";\nimport { Storage } from \"./storage\";\n\nexport interface Environment {\n runtime: \"browser\" | \"node\" | \"null\";\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n getReferrerUrl: () => string | null;\n getUrl: () => string | null;\n getUserAgent: () => string | null;\n generateUUID: () => string;\n storage: Storage;\n}\n\nexport function currentEnvironment(): Environment {\n return isBrowser() ? buildBrowserEnvironment() : buildNodeEnvironment();\n}\n\nfunction isBrowser() {\n try {\n return typeof window === \"object\";\n } catch (e) {\n return false;\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nexport function buildNodeEnvironment(): Environment {\n return {\n runtime: \"node\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => uuidv4(),\n storage: createNullStorage(),\n };\n}\n","export const version: string = process.env.VERSION ?? \"\";\n","import { ClientIdManager } from \"../../client-id/client-id\";\nimport { Environment } from \"../../environment/environment\";\nimport { RelayConfig } from \"../../config/config\";\nimport { version } from \"../../version\";\n\ninterface EventConfig {\n trackingId: string;\n}\n\nexport interface Meta {\n type: string;\n config: EventConfig;\n ts: number;\n source: string;\n clientId: string;\n userAgent: string | null;\n referrerUrl: string | null;\n url: string | null;\n}\n\nfunction getEventConfig(config: RelayConfig): EventConfig {\n const { trackingId } = config;\n return { trackingId };\n}\n\nfunction getSource(): string {\n return `relay@${version}`;\n}\n\nexport function createMeta(\n type: string,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<Meta> {\n const { getReferrerUrl, getUrl, getUserAgent } = environment;\n const eventConfig = getEventConfig(config);\n const clientId = clientIdManager.getClientId();\n\n return Object.freeze({\n type,\n config: eventConfig,\n ts: Date.now(),\n source: getSource(),\n clientId,\n userAgent: getUserAgent(),\n referrerUrl: getReferrerUrl(),\n url: getUrl(),\n });\n}\n","import { RelayEvent } from \"../event/relay-event\";\n\nconst ANY_EVENT_TYPE = \"*\";\n\nexport type EventCallback = (event: RelayEvent) => void;\n\ninterface Listener {\n type: string;\n callback: EventCallback;\n}\n\ninterface ListenerManager {\n add: (listener: Listener) => () => void;\n call: (event: RelayEvent) => void;\n remove: (type: string, callback?: EventCallback) => void;\n}\n\nexport function createListenerManager(): ListenerManager {\n const listeners: Listener[] = [];\n\n function getListenerIndex({ type, callback }: Listener): number {\n return listeners.findIndex(\n (listener) => listener.type === type && listener.callback === callback\n );\n }\n\n function isMatchesType(listener: Listener, type: string): boolean {\n return listener.type === \"*\" || type === listener.type;\n }\n\n function add(listener: Listener): () => void {\n if (getListenerIndex(listener) < 0) {\n listeners.push(listener);\n }\n return () => remove(listener.type, listener.callback);\n }\n\n function call(event: RelayEvent) {\n listeners.forEach((listener) => {\n if (isMatchesType(listener, event.meta.type)) {\n try {\n listener.callback(event);\n } catch (e) {\n console.error(e);\n }\n }\n });\n }\n\n function removeMultiple(type: string) {\n if (type === ANY_EVENT_TYPE) {\n listeners.length = 0;\n } else {\n for (let i = listeners.length - 1; i >= 0; i--) {\n if (listeners[i].type === type) {\n listeners.splice(i, 1);\n }\n }\n }\n }\n\n function removeOne(listener: Listener) {\n const index = getListenerIndex(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n function remove(type: string, callback?: EventCallback) {\n !!callback ? removeOne({ type, callback }) : removeMultiple(type);\n }\n\n return {\n add,\n call,\n remove,\n };\n}\n","export type RelayMode = \"emit\" | \"validate\" | \"disabled\";\n\nexport interface RelayConfig {\n url: string;\n token: string;\n trackingId: string;\n mode?: RelayMode;\n}\n\nexport interface ConfigManager {\n get: () => Readonly<RelayConfig>;\n update: (updatedConfig: Partial<RelayConfig>) => void;\n}\n\nfunction pick({\n url,\n token,\n trackingId,\n ...rest\n}: RelayConfig): Readonly<RelayConfig> {\n return Object.freeze({\n url,\n token,\n trackingId,\n ...(!!rest.mode && { mode: rest.mode }),\n });\n}\n\nexport function createConfigManager(\n initialConfig: RelayConfig\n): Readonly<ConfigManager> {\n let _config: Readonly<RelayConfig> = pick(initialConfig);\n\n return {\n get: () => _config,\n update: (updatedConfig: Partial<RelayConfig>) => {\n _config = pick({ ..._config, ...updatedConfig });\n },\n };\n}\n","import { emit } from \"./emit/emit\";\nimport { createClientIdManager } from \"./client-id/client-id\";\nimport { currentEnvironment } from \"./environment/environment\";\nimport { createRelayEvent } from \"./event/relay-event\";\nimport { version } from \"./version\";\nimport { createMeta, Meta } from \"./event/meta/meta\";\nimport { createListenerManager, EventCallback } from \"./listener/listener\";\nimport { createConfigManager, RelayConfig } from \"./config/config\";\nimport {\n validate,\n ValidationError,\n ValidationResponse,\n} from \"./validate/validate\";\nimport { buildNullEnvironment } from \"./environment/null/null\";\n\ntype RelayPayload = Record<string, unknown>;\ntype Off = () => void;\n\ninterface Relay {\n emit: (\n type: string,\n payload: RelayPayload\n ) => Promise<void | ValidationResponse>;\n getMeta: (type: string) => Meta;\n on: (type: string, callback: EventCallback) => Off;\n off: (type: string, callback?: EventCallback) => void;\n updateConfig: (config: Partial<RelayConfig>) => void;\n version: string;\n clearStorage: () => void;\n}\n\nexport function createRelay(initialConfig: RelayConfig): Relay {\n const configManager = createConfigManager(initialConfig);\n const getEnvironment = () =>\n configManager.get().mode == \"disabled\"\n ? buildNullEnvironment()\n : currentEnvironment();\n const clientIdManager = createClientIdManager(getEnvironment());\n\n const { add, call, remove } = createListenerManager();\n\n return {\n emit: (type: string, payload: RelayPayload) => {\n const event = createRelayEvent(\n type,\n payload,\n configManager.get(),\n getEnvironment(),\n clientIdManager\n );\n\n call(event);\n\n const params = {\n config: configManager.get(),\n environment: getEnvironment(),\n event,\n };\n\n return configManager.get().mode === \"validate\"\n ? validate(params)\n : emit(params);\n },\n getMeta: (type: string) =>\n createMeta(type, configManager.get(), getEnvironment(), clientIdManager),\n on: (type: string, callback: EventCallback) => add({ type, callback }),\n off: (type: string, callback?: EventCallback) => remove(type, callback),\n updateConfig: (config: Partial<RelayConfig>) =>\n configManager.update(config),\n version,\n clearStorage: () => {\n clientIdManager.clear();\n },\n };\n}\n\nexport type { RelayPayload, RelayConfig, ValidationError, ValidationResponse };\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\n\nexport function buildNullEnvironment(): Environment {\n return {\n runtime: \"null\",\n fetch: () => Promise.resolve(new Response(JSON.stringify(\"\"))),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => \"\",\n storage: createNullStorage(),\n };\n}\n","import { ClientIdManager } from \"../client-id/client-id\";\nimport { Environment } from \"../environment/environment\";\nimport { RelayConfig, RelayPayload } from \"../relay\";\nimport { createMeta, Meta } from \"./meta/meta\";\n\nexport interface RelayEvent extends RelayPayload {\n meta: Readonly<Meta>;\n}\n\nexport function createRelayEvent(\n type: string,\n payload: RelayPayload,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<RelayEvent> {\n return {\n ...payload,\n meta: createMeta(type, config, environment, clientIdManager),\n };\n}\n","import {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\n\nexport interface ValidationError {\n type: string;\n message: string;\n path: string;\n}\n\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\nexport async function validate(\n params: EventApiCallParams\n): Promise<Readonly<ValidationResponse>> {\n const data = await callEventApi<ValidationResponse[] | \"\">(params);\n\n if (!data) {\n return {\n valid: false,\n errors: [{ type: \"\", message: \"disabled\", path: \"\" }],\n };\n }\n\n const { valid, errors } = data[0];\n\n return { valid, errors: errors ?? [] };\n}\n","import {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\n\nexport async function emit(params: EventApiCallParams) {\n await callEventApi(params);\n}\n"],"names":["async","callEventApi","event","config","environment","url","token","headers","Authorization","response","fetch","mode","method","body","JSON","stringify","data","json","ok","Error","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","REGEX","byteToHex","i","push","toString","slice","native","randomUUID","v4","options","buf","offset","rnds","random","arr","toLowerCase","unsafeStringify","createClientIdManager","key","getClientId","storage","existingClientId","getItem","clientId","uuid","test","generateUUID","setItem","clear","removeItem","cookieManager","prefix","cookiePrefix","cookieArray","document","cookie","split","prettifyCookie","replace","lastIndexOf","substring","length","expire","domain","host","parts","join","getDomain","window","location","hostname","expireSection","Date","getTime","toUTCString","domainSection","this","createCookieManager","fetchAPI","init","catch","err","message","cause","buildBrowserEnvironment","runtime","getReferrerUrl","referrer","getUrl","href","getUserAgent","navigator","userAgent","uuidv4","localStorage","createNullStorage","currentEnvironment","e","isBrowser","version","createMeta","type","clientIdManager","eventConfig","trackingId","getEventConfig","Object","freeze","ts","now","source","referrerUrl","ANY_EVENT_TYPE","createListenerManager","listeners","getListenerIndex","callback","findIndex","listener","remove","index","splice","removeOne","removeMultiple","add","call","forEach","isMatchesType","meta","console","error","pick","rest","createRelay","initialConfig","configManager","_config","get","update","updatedConfig","createConfigManager","getEnvironment","Promise","resolve","Response","emit","payload","createRelayEvent","params","valid","errors","path","validate","getMeta","on","off","updateConfig","clearStorage"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,7]}
1
+ {"version":3,"file":"relay.min.js","sources":["../../src/event-api-call/event-api-caller.ts","../../src/emit/emit.ts","../../src/validate/validate.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/regex.js","../../src/client-id/client-id.ts","../../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/validate.js","../../src/environment/browser/storage/cookie.ts","../../src/environment/utils/fetch.ts","../../src/environment/browser/browser.ts","../../src/environment/browser/storage/storage.ts","../../src/environment/storage.ts","../../src/environment/environment.ts","../../src/environment/node/node.ts","../../src/version.ts","../../src/event/meta/meta.ts","../../src/listener/listener.ts","../../src/config/config.ts","../../src/relay.ts","../../src/environment/null/null.ts","../../src/event/relay-event.ts"],"sourcesContent":["import { Environment } from \"../environment/environment\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { RelayConfig } from \"../config/config\";\nimport { ValidationResponse } from \"../relay\";\n\nexport interface EventApiCallParams {\n config: RelayConfig;\n environment: Environment;\n event: Readonly<RelayEvent>;\n}\n\nexport async function callEventApi<T>({\n event,\n config,\n environment,\n}: EventApiCallParams): Promise<T> {\n const { url, token } = config;\n const headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n const response = await environment.fetch(\n `${url}${config.mode == \"validate\" ? \"/validate\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify([event]),\n headers,\n }\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error({\n ...data,\n });\n }\n\n return data;\n}\n","import { Environment } from \"../environment/environment\";\nimport {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\nimport { RelayEvent } from \"../event/relay-event\";\nimport { ListenerManager } from \"../listener/listener\";\nimport { RelayConfig } from \"../relay\";\nimport { validate } from \"../validate/validate\";\n\nexport interface EmitParams {\n config: RelayConfig;\n environment: Environment;\n event: RelayEvent;\n listenerManager: ListenerManager;\n}\n\nexport async function emit(params: EmitParams) {\n const { listenerManager, event, config } = params;\n const isEnabled = config.mode !== \"disabled\";\n\n isEnabled && listenerManager.call(event);\n return config.mode === \"validate\" ? validate(params) : emitEvent(params);\n}\n\nasync function emitEvent(params: EventApiCallParams) {\n await callEventApi(params);\n}\n","import {\n callEventApi,\n EventApiCallParams,\n} from \"../event-api-call/event-api-caller\";\n\nexport interface ValidationError {\n type: string;\n message: string;\n path: string;\n}\n\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\nexport async function validate(\n params: EventApiCallParams\n): Promise<Readonly<ValidationResponse>> {\n const data = await callEventApi<ValidationResponse[] | \"\">(params);\n\n if (!data) {\n return {\n valid: false,\n errors: [{ type: \"\", message: \"disabled\", path: \"\" }],\n };\n }\n\n const { valid, errors } = data[0];\n\n return { valid, errors: errors ?? [] };\n}\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import { validate } from \"uuid\";\nimport { Environment } from \"../environment/environment\";\n\nexport interface ClientIdManager {\n getClientId: () => string;\n clear: () => void;\n}\n\nexport function createClientIdManager(\n environment: Environment\n): ClientIdManager {\n const key = \"visitorId\";\n return {\n getClientId: () => {\n const storage = environment.storage;\n\n const existingClientId = storage.getItem(key);\n const clientId =\n existingClientId && validate(existingClientId)\n ? existingClientId\n : environment.generateUUID();\n storage.setItem(key, clientId);\n return clientId;\n },\n clear: () => {\n environment.storage.removeItem(key);\n },\n };\n}\n","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","export interface CookieManager {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string, expire: number) => void;\n}\n\nexport const cookieManager: CookieManager = createCookieManager();\n\nfunction createCookieManager(): CookieManager {\n const prefix = \"coveo_\";\n const getDomain = (host: string) => {\n const parts = host.split(\".\").slice(-2);\n return parts.length == 2 ? parts.join(\".\") : \"\";\n };\n\n return {\n getItem(key: string): string | null {\n const cookiePrefix = `${prefix}${key}=`;\n const cookieArray = document.cookie.split(\";\");\n for (const cookie of cookieArray) {\n const prettifyCookie = cookie.replace(/^\\s+/, \"\");\n if (prettifyCookie.lastIndexOf(cookiePrefix, 0) === 0) {\n return prettifyCookie.substring(\n cookiePrefix.length,\n prettifyCookie.length\n );\n }\n }\n return null;\n },\n setItem(key: string, data: string, expire: number): void {\n const domain = getDomain(window.location.hostname);\n const expireSection = `;expires=${new Date(\n new Date().getTime() + expire\n ).toUTCString()}`;\n const domainSection = domain ? `;domain=${domain}` : \"\";\n document.cookie = `${prefix}${key}=${data}${expireSection}${domainSection};path=/;SameSite=Lax`;\n },\n\n removeItem(key: string): void {\n this.setItem(key, \"\", -1);\n },\n };\n}\n","export async function fetchAPI(\n url: string,\n init?: RequestInit\n): Promise<Response> {\n return fetch(url, init).catch((err: Error) => {\n throw new Error(\n `${err.message}: The \"host\" value is invalid or a network error occured, according to the FetchAPI's response.`,\n { cause: err }\n );\n });\n}\n","import { Environment } from \"../environment\";\nimport { createBrowserStorage } from \"./storage/storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nfunction getReferrerUrl() {\n const referrer = document.referrer;\n\n return referrer === \"\" ? null : referrer;\n}\n\nexport function buildBrowserEnvironment(): Environment {\n return {\n runtime: \"browser\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => getReferrerUrl(),\n getUrl: () => window.location.href,\n getUserAgent: () => navigator.userAgent,\n generateUUID: () => crypto.randomUUID(),\n storage: createBrowserStorage(),\n };\n}\n","import { Storage } from \"../../storage\";\nimport { cookieManager } from \"./cookie\";\n\nexport function createBrowserStorage(): Storage {\n return {\n getItem(key: string): string | null {\n return cookieManager.getItem(key) || localStorage.getItem(key);\n },\n\n removeItem(key: string): void {\n cookieManager.removeItem(key);\n localStorage.removeItem(key);\n },\n\n setItem(key: string, data: string): void {\n const oneYear = 31556952000;\n localStorage.setItem(key, data);\n cookieManager.setItem(key, data, oneYear);\n },\n };\n}\n","export interface Storage {\n getItem: (key: string) => string | null;\n removeItem: (key: string) => void;\n setItem: (key: string, data: string) => void;\n}\n\nexport function createNullStorage(): Storage {\n return {\n getItem(): string | null {\n return null;\n },\n removeItem(): void {\n return;\n },\n setItem(): void {\n return;\n },\n };\n}\n","import { buildBrowserEnvironment } from \"./browser/browser\";\nimport { buildNodeEnvironment } from \"./node/node\";\nimport { Storage } from \"./storage\";\n\nexport interface Environment {\n runtime: \"browser\" | \"node\" | \"null\";\n fetch: (url: string, init?: RequestInit) => Promise<Response>;\n getReferrerUrl: () => string | null;\n getUrl: () => string | null;\n getUserAgent: () => string | null;\n generateUUID: () => string;\n storage: Storage;\n}\n\nexport function currentEnvironment(): Environment {\n return isBrowser() ? buildBrowserEnvironment() : buildNodeEnvironment();\n}\n\nfunction isBrowser() {\n try {\n return typeof window === \"object\";\n } catch (e) {\n return false;\n }\n}\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\nimport { fetchAPI } from \"../utils/fetch\";\n\nexport function buildNodeEnvironment(): Environment {\n return {\n runtime: \"node\",\n fetch: (url: string, init?: RequestInit) => fetchAPI(url, init),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => crypto.randomUUID(),\n storage: createNullStorage(),\n };\n}\n","export const version: string = process.env.VERSION ?? \"\";\n","import { ClientIdManager } from \"../../client-id/client-id\";\nimport { Environment } from \"../../environment/environment\";\nimport { RelayConfig } from \"../../config/config\";\nimport { version } from \"../../version\";\n\ninterface EventConfig {\n trackingId: string;\n}\n\nexport interface Meta {\n type: string;\n config: EventConfig;\n ts: number;\n source: string;\n clientId: string;\n userAgent: string | null;\n referrerUrl: string | null;\n url: string | null;\n}\n\nfunction getEventConfig(config: RelayConfig): EventConfig {\n const { trackingId } = config;\n return { trackingId };\n}\n\nfunction getSource(): string {\n return `relay@${version}`;\n}\n\nexport function createMeta(\n type: string,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<Meta> {\n const { getReferrerUrl, getUrl, getUserAgent } = environment;\n const eventConfig = getEventConfig(config);\n const clientId = clientIdManager.getClientId();\n\n return Object.freeze({\n type,\n config: eventConfig,\n ts: Date.now(),\n source: getSource(),\n clientId,\n userAgent: getUserAgent(),\n referrerUrl: getReferrerUrl(),\n url: getUrl(),\n });\n}\n","import { RelayEvent } from \"../event/relay-event\";\n\nconst ANY_EVENT_TYPE = \"*\";\n\nexport type EventCallback = (event: RelayEvent) => void;\n\ninterface Listener {\n type: string;\n callback: EventCallback;\n}\n\nexport interface ListenerManager {\n add: (listener: Listener) => () => void;\n call: (event: RelayEvent) => void;\n remove: (type: string, callback?: EventCallback) => void;\n}\n\nexport function createListenerManager(): ListenerManager {\n const listeners: Listener[] = [];\n\n function getListenerIndex({ type, callback }: Listener): number {\n return listeners.findIndex(\n (listener) => listener.type === type && listener.callback === callback\n );\n }\n\n function isMatchesType(listener: Listener, type: string): boolean {\n return listener.type === \"*\" || type === listener.type;\n }\n\n function add(listener: Listener): () => void {\n if (getListenerIndex(listener) < 0) {\n listeners.push(listener);\n }\n return () => remove(listener.type, listener.callback);\n }\n\n function call(event: RelayEvent) {\n listeners.forEach((listener) => {\n if (isMatchesType(listener, event.meta.type)) {\n try {\n listener.callback(event);\n } catch (e) {\n console.error(e);\n }\n }\n });\n }\n\n function removeMultiple(type: string) {\n if (type === ANY_EVENT_TYPE) {\n listeners.length = 0;\n } else {\n for (let i = listeners.length - 1; i >= 0; i--) {\n if (listeners[i].type === type) {\n listeners.splice(i, 1);\n }\n }\n }\n }\n\n function removeOne(listener: Listener) {\n const index = getListenerIndex(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n function remove(type: string, callback?: EventCallback) {\n !!callback ? removeOne({ type, callback }) : removeMultiple(type);\n }\n\n return {\n add,\n call,\n remove,\n };\n}\n","export type RelayMode = \"emit\" | \"validate\" | \"disabled\";\n\nexport interface RelayConfig {\n url: string;\n token: string;\n trackingId: string;\n mode?: RelayMode;\n}\n\nexport interface ConfigManager {\n get: () => Readonly<RelayConfig>;\n update: (updatedConfig: Partial<RelayConfig>) => void;\n}\n\nfunction pick({\n url,\n token,\n trackingId,\n ...rest\n}: RelayConfig): Readonly<RelayConfig> {\n return Object.freeze({\n url,\n token,\n trackingId,\n ...(!!rest.mode && { mode: rest.mode }),\n });\n}\n\nexport function createConfigManager(\n initialConfig: RelayConfig\n): Readonly<ConfigManager> {\n let _config: Readonly<RelayConfig> = pick(initialConfig);\n\n return {\n get: () => _config,\n update: (updatedConfig: Partial<RelayConfig>) => {\n _config = pick({ ..._config, ...updatedConfig });\n },\n };\n}\n","import { emit } from \"./emit/emit\";\nimport { createClientIdManager } from \"./client-id/client-id\";\nimport { currentEnvironment } from \"./environment/environment\";\nimport { createRelayEvent } from \"./event/relay-event\";\nimport { version } from \"./version\";\nimport { createMeta, Meta } from \"./event/meta/meta\";\nimport { createListenerManager, EventCallback } from \"./listener/listener\";\nimport { createConfigManager, RelayConfig } from \"./config/config\";\nimport { ValidationError, ValidationResponse } from \"./validate/validate\";\nimport { buildNullEnvironment } from \"./environment/null/null\";\n\ntype RelayPayload = Record<string, unknown>;\ntype Off = () => void;\n\ninterface Relay {\n emit: (\n type: string,\n payload: RelayPayload\n ) => Promise<void | ValidationResponse>;\n getMeta: (type: string) => Meta;\n on: (type: string, callback: EventCallback) => Off;\n off: (type: string, callback?: EventCallback) => void;\n updateConfig: (config: Partial<RelayConfig>) => void;\n version: string;\n clearStorage: () => void;\n}\n\nexport function createRelay(initialConfig: RelayConfig): Relay {\n const configManager = createConfigManager(initialConfig);\n const listenerManager = createListenerManager();\n\n const getEnvironment = () =>\n configManager.get().mode == \"disabled\"\n ? buildNullEnvironment()\n : currentEnvironment();\n const clientIdManager = createClientIdManager(getEnvironment());\n\n return {\n emit: (type: string, payload: RelayPayload) => {\n const config = configManager.get();\n const environment = getEnvironment();\n\n const event = createRelayEvent(\n type,\n payload,\n config,\n environment,\n clientIdManager\n );\n\n return emit({\n config,\n environment,\n event,\n listenerManager,\n });\n },\n getMeta: (type: string) =>\n createMeta(type, configManager.get(), getEnvironment(), clientIdManager),\n on: (type: string, callback: EventCallback) =>\n listenerManager.add({ type, callback }),\n off: (type: string, callback?: EventCallback) =>\n listenerManager.remove(type, callback),\n updateConfig: (config: Partial<RelayConfig>) =>\n configManager.update(config),\n version,\n clearStorage: () => {\n clientIdManager.clear();\n },\n };\n}\n\nexport type { RelayPayload, RelayConfig, ValidationError, ValidationResponse };\n","import { Environment } from \"../environment\";\nimport { createNullStorage } from \"../storage\";\n\nexport function buildNullEnvironment(): Environment {\n return {\n runtime: \"null\",\n fetch: () => Promise.resolve(new Response(JSON.stringify(\"\"))),\n getReferrerUrl: () => null,\n getUrl: () => null,\n getUserAgent: () => null,\n generateUUID: () => \"\",\n storage: createNullStorage(),\n };\n}\n","import { ClientIdManager } from \"../client-id/client-id\";\nimport { Environment } from \"../environment/environment\";\nimport { RelayConfig, RelayPayload } from \"../relay\";\nimport { createMeta, Meta } from \"./meta/meta\";\n\nexport interface RelayEvent extends RelayPayload {\n meta: Readonly<Meta>;\n}\n\nexport function createRelayEvent(\n type: string,\n payload: RelayPayload,\n config: RelayConfig,\n environment: Environment,\n clientIdManager: ClientIdManager\n): Readonly<RelayEvent> {\n return {\n ...payload,\n meta: createMeta(type, config, environment, clientIdManager),\n };\n}\n"],"names":["async","callEventApi","event","config","environment","url","token","headers","Authorization","response","fetch","mode","method","body","JSON","stringify","data","json","ok","Error","emit","params","listenerManager","call","valid","errors","type","message","path","validate","emitEvent","REGEX","createClientIdManager","key","getClientId","storage","existingClientId","getItem","clientId","uuid","test","generateUUID","setItem","clear","removeItem","cookieManager","prefix","cookiePrefix","cookieArray","document","cookie","split","prettifyCookie","replace","lastIndexOf","substring","length","expire","domain","host","parts","slice","join","getDomain","window","location","hostname","expireSection","Date","getTime","toUTCString","domainSection","this","createCookieManager","fetchAPI","init","catch","err","cause","buildBrowserEnvironment","runtime","getReferrerUrl","referrer","getUrl","href","getUserAgent","navigator","userAgent","crypto","randomUUID","localStorage","createNullStorage","currentEnvironment","e","isBrowser","version","createMeta","clientIdManager","eventConfig","trackingId","getEventConfig","Object","freeze","ts","now","source","referrerUrl","ANY_EVENT_TYPE","createListenerManager","listeners","getListenerIndex","callback","findIndex","listener","remove","index","splice","removeOne","i","removeMultiple","add","push","forEach","isMatchesType","meta","console","error","pick","rest","createRelay","initialConfig","configManager","_config","get","update","updatedConfig","createConfigManager","getEnvironment","Promise","resolve","Response","payload","createRelayEvent","getMeta","on","off","updateConfig","clearStorage"],"mappings":"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","x_google_ignoreList":[3,5]}
@@ -1,3 +1,12 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
2
- export declare function emit(params: EventApiCallParams): Promise<void>;
1
+ import { Environment } from "../environment/environment";
2
+ import { RelayEvent } from "../event/relay-event";
3
+ import { ListenerManager } from "../listener/listener";
4
+ import { RelayConfig } from "../relay";
5
+ export interface EmitParams {
6
+ config: RelayConfig;
7
+ environment: Environment;
8
+ event: RelayEvent;
9
+ listenerManager: ListenerManager;
10
+ }
11
+ export declare function emit(params: EmitParams): Promise<void | Readonly<import("../relay").ValidationResponse>>;
3
12
  //# sourceMappingURL=emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,wBAAsB,IAAI,CAAC,MAAM,EAAE,kBAAkB,iBAEpD"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU,mEAM5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
@@ -4,7 +4,7 @@ interface Listener {
4
4
  type: string;
5
5
  callback: EventCallback;
6
6
  }
7
- interface ListenerManager {
7
+ export interface ListenerManager {
8
8
  add: (listener: Listener) => () => void;
9
9
  call: (event: RelayEvent) => void;
10
10
  remove: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEL,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
package/lib/relay.cjs CHANGED
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var crypto = require('crypto');
4
-
5
3
  async function callEventApi({ event, config, environment, }) {
6
4
  const { url, token } = config;
7
5
  const headers = {
@@ -22,80 +20,41 @@ async function callEventApi({ event, config, environment, }) {
22
20
  return data;
23
21
  }
24
22
 
25
- async function emit(params) {
26
- await callEventApi(params);
23
+ async function validate$1(params) {
24
+ const data = await callEventApi(params);
25
+ if (!data) {
26
+ return {
27
+ valid: false,
28
+ errors: [{ type: "", message: "disabled", path: "" }],
29
+ };
30
+ }
31
+ const { valid, errors } = data[0];
32
+ return { valid, errors: errors ?? [] };
27
33
  }
28
34
 
29
- const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate
30
-
31
- let poolPtr = rnds8Pool.length;
32
- function rng() {
33
- if (poolPtr > rnds8Pool.length - 16) {
34
- crypto.randomFillSync(rnds8Pool);
35
- poolPtr = 0;
36
- }
37
-
38
- return rnds8Pool.slice(poolPtr, poolPtr += 16);
35
+ async function emit(params) {
36
+ const { listenerManager, event, config } = params;
37
+ const isEnabled = config.mode !== "disabled";
38
+ isEnabled && listenerManager.call(event);
39
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
40
+ }
41
+ async function emitEvent(params) {
42
+ await callEventApi(params);
39
43
  }
40
44
 
41
45
  var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
42
46
 
43
- function validate$1(uuid) {
47
+ function validate(uuid) {
44
48
  return typeof uuid === 'string' && REGEX.test(uuid);
45
49
  }
46
50
 
47
- /**
48
- * Convert array of 16 byte values to UUID string format of the form:
49
- * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
50
- */
51
-
52
- const byteToHex = [];
53
-
54
- for (let i = 0; i < 256; ++i) {
55
- byteToHex.push((i + 0x100).toString(16).slice(1));
56
- }
57
-
58
- function unsafeStringify(arr, offset = 0) {
59
- // Note: Be careful editing this code! It's been tuned for performance
60
- // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
61
- return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
62
- }
63
-
64
- var native = {
65
- randomUUID: crypto.randomUUID
66
- };
67
-
68
- function v4(options, buf, offset) {
69
- if (native.randomUUID && !buf && !options) {
70
- return native.randomUUID();
71
- }
72
-
73
- options = options || {};
74
- const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
75
-
76
- rnds[6] = rnds[6] & 0x0f | 0x40;
77
- rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
78
-
79
- if (buf) {
80
- offset = offset || 0;
81
-
82
- for (let i = 0; i < 16; ++i) {
83
- buf[offset + i] = rnds[i];
84
- }
85
-
86
- return buf;
87
- }
88
-
89
- return unsafeStringify(rnds);
90
- }
91
-
92
51
  function createClientIdManager(environment) {
93
52
  const key = "visitorId";
94
53
  return {
95
54
  getClientId: () => {
96
55
  const storage = environment.storage;
97
56
  const existingClientId = storage.getItem(key);
98
- const clientId = existingClientId && validate$1(existingClientId)
57
+ const clientId = existingClientId && validate(existingClientId)
99
58
  ? existingClientId
100
59
  : environment.generateUUID();
101
60
  storage.setItem(key, clientId);
@@ -172,7 +131,7 @@ function buildBrowserEnvironment() {
172
131
  getReferrerUrl: () => getReferrerUrl(),
173
132
  getUrl: () => window.location.href,
174
133
  getUserAgent: () => navigator.userAgent,
175
- generateUUID: () => v4(),
134
+ generateUUID: () => crypto.randomUUID(),
176
135
  storage: createBrowserStorage(),
177
136
  };
178
137
  }
@@ -198,7 +157,7 @@ function buildNodeEnvironment() {
198
157
  getReferrerUrl: () => null,
199
158
  getUrl: () => null,
200
159
  getUserAgent: () => null,
201
- generateUUID: () => v4(),
160
+ generateUUID: () => crypto.randomUUID(),
202
161
  storage: createNullStorage(),
203
162
  };
204
163
  }
@@ -215,7 +174,7 @@ function isBrowser() {
215
174
  }
216
175
  }
217
176
 
218
- const version = "0.5.0" ;
177
+ const version = "0.6.1" ;
219
178
 
220
179
  function getEventConfig(config) {
221
180
  const { trackingId } = config;
@@ -320,18 +279,6 @@ function createConfigManager(initialConfig) {
320
279
  };
321
280
  }
322
281
 
323
- async function validate(params) {
324
- const data = await callEventApi(params);
325
- if (!data) {
326
- return {
327
- valid: false,
328
- errors: [{ type: "", message: "disabled", path: "" }],
329
- };
330
- }
331
- const { valid, errors } = data[0];
332
- return { valid, errors: errors ?? [] };
333
- }
334
-
335
282
  function buildNullEnvironment() {
336
283
  return {
337
284
  runtime: "null",
@@ -346,27 +293,26 @@ function buildNullEnvironment() {
346
293
 
347
294
  function createRelay(initialConfig) {
348
295
  const configManager = createConfigManager(initialConfig);
296
+ const listenerManager = createListenerManager();
349
297
  const getEnvironment = () => configManager.get().mode == "disabled"
350
298
  ? buildNullEnvironment()
351
299
  : currentEnvironment();
352
300
  const clientIdManager = createClientIdManager(getEnvironment());
353
- const { add, call, remove } = createListenerManager();
354
301
  return {
355
302
  emit: (type, payload) => {
356
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
357
- call(event);
358
- const params = {
359
- config: configManager.get(),
360
- environment: getEnvironment(),
303
+ const config = configManager.get();
304
+ const environment = getEnvironment();
305
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
306
+ return emit({
307
+ config,
308
+ environment,
361
309
  event,
362
- };
363
- return configManager.get().mode === "validate"
364
- ? validate(params)
365
- : emit(params);
310
+ listenerManager,
311
+ });
366
312
  },
367
313
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
368
- on: (type, callback) => add({ type, callback }),
369
- off: (type, callback) => remove(type, callback),
314
+ on: (type, callback) => listenerManager.add({ type, callback }),
315
+ off: (type, callback) => listenerManager.remove(type, callback),
370
316
  updateConfig: (config) => configManager.update(config),
371
317
  version,
372
318
  clearStorage: () => {
package/lib/relay.js CHANGED
@@ -18,79 +18,32 @@ async function callEventApi({ event, config, environment, }) {
18
18
  return data;
19
19
  }
20
20
 
21
- async function emit(params) {
22
- await callEventApi(params);
23
- }
24
-
25
- // Unique ID creation requires a high quality random # generator. In the browser we therefore
26
- // require the crypto API and do not support built-in fallback to lower quality random number
27
- // generators (like Math.random()).
28
- let getRandomValues;
29
- const rnds8 = new Uint8Array(16);
30
- function rng() {
31
- // lazy load so that environments that need to polyfill have a chance to do so
32
- if (!getRandomValues) {
33
- // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
34
- getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
35
-
36
- if (!getRandomValues) {
37
- throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
21
+ async function validate$1(params) {
22
+ const data = await callEventApi(params);
23
+ if (!data) {
24
+ return {
25
+ valid: false,
26
+ errors: [{ type: "", message: "disabled", path: "" }],
27
+ };
38
28
  }
39
- }
40
-
41
- return getRandomValues(rnds8);
42
- }
43
-
44
- var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
45
-
46
- function validate$1(uuid) {
47
- return typeof uuid === 'string' && REGEX.test(uuid);
29
+ const { valid, errors } = data[0];
30
+ return { valid, errors: errors ?? [] };
48
31
  }
49
32
 
50
- /**
51
- * Convert array of 16 byte values to UUID string format of the form:
52
- * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
53
- */
54
-
55
- const byteToHex = [];
56
-
57
- for (let i = 0; i < 256; ++i) {
58
- byteToHex.push((i + 0x100).toString(16).slice(1));
33
+ async function emit(params) {
34
+ const { listenerManager, event, config } = params;
35
+ const isEnabled = config.mode !== "disabled";
36
+ isEnabled && listenerManager.call(event);
37
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
59
38
  }
60
-
61
- function unsafeStringify(arr, offset = 0) {
62
- // Note: Be careful editing this code! It's been tuned for performance
63
- // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
64
- return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
39
+ async function emitEvent(params) {
40
+ await callEventApi(params);
65
41
  }
66
42
 
67
- const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
68
- var native = {
69
- randomUUID
70
- };
71
-
72
- function v4(options, buf, offset) {
73
- if (native.randomUUID && !buf && !options) {
74
- return native.randomUUID();
75
- }
76
-
77
- options = options || {};
78
- const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
79
-
80
- rnds[6] = rnds[6] & 0x0f | 0x40;
81
- rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
82
-
83
- if (buf) {
84
- offset = offset || 0;
85
-
86
- for (let i = 0; i < 16; ++i) {
87
- buf[offset + i] = rnds[i];
88
- }
89
-
90
- return buf;
91
- }
43
+ var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
92
44
 
93
- return unsafeStringify(rnds);
45
+ function validate(uuid) {
46
+ return typeof uuid === 'string' && REGEX.test(uuid);
94
47
  }
95
48
 
96
49
  function createClientIdManager(environment) {
@@ -99,7 +52,7 @@ function createClientIdManager(environment) {
99
52
  getClientId: () => {
100
53
  const storage = environment.storage;
101
54
  const existingClientId = storage.getItem(key);
102
- const clientId = existingClientId && validate$1(existingClientId)
55
+ const clientId = existingClientId && validate(existingClientId)
103
56
  ? existingClientId
104
57
  : environment.generateUUID();
105
58
  storage.setItem(key, clientId);
@@ -176,7 +129,7 @@ function buildBrowserEnvironment() {
176
129
  getReferrerUrl: () => getReferrerUrl(),
177
130
  getUrl: () => window.location.href,
178
131
  getUserAgent: () => navigator.userAgent,
179
- generateUUID: () => v4(),
132
+ generateUUID: () => crypto.randomUUID(),
180
133
  storage: createBrowserStorage(),
181
134
  };
182
135
  }
@@ -202,7 +155,7 @@ function buildNodeEnvironment() {
202
155
  getReferrerUrl: () => null,
203
156
  getUrl: () => null,
204
157
  getUserAgent: () => null,
205
- generateUUID: () => v4(),
158
+ generateUUID: () => crypto.randomUUID(),
206
159
  storage: createNullStorage(),
207
160
  };
208
161
  }
@@ -219,7 +172,7 @@ function isBrowser() {
219
172
  }
220
173
  }
221
174
 
222
- const version = "0.5.0" ;
175
+ const version = "0.6.1" ;
223
176
 
224
177
  function getEventConfig(config) {
225
178
  const { trackingId } = config;
@@ -324,18 +277,6 @@ function createConfigManager(initialConfig) {
324
277
  };
325
278
  }
326
279
 
327
- async function validate(params) {
328
- const data = await callEventApi(params);
329
- if (!data) {
330
- return {
331
- valid: false,
332
- errors: [{ type: "", message: "disabled", path: "" }],
333
- };
334
- }
335
- const { valid, errors } = data[0];
336
- return { valid, errors: errors ?? [] };
337
- }
338
-
339
280
  function buildNullEnvironment() {
340
281
  return {
341
282
  runtime: "null",
@@ -350,27 +291,26 @@ function buildNullEnvironment() {
350
291
 
351
292
  function createRelay(initialConfig) {
352
293
  const configManager = createConfigManager(initialConfig);
294
+ const listenerManager = createListenerManager();
353
295
  const getEnvironment = () => configManager.get().mode == "disabled"
354
296
  ? buildNullEnvironment()
355
297
  : currentEnvironment();
356
298
  const clientIdManager = createClientIdManager(getEnvironment());
357
- const { add, call, remove } = createListenerManager();
358
299
  return {
359
300
  emit: (type, payload) => {
360
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
361
- call(event);
362
- const params = {
363
- config: configManager.get(),
364
- environment: getEnvironment(),
301
+ const config = configManager.get();
302
+ const environment = getEnvironment();
303
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
304
+ return emit({
305
+ config,
306
+ environment,
365
307
  event,
366
- };
367
- return configManager.get().mode === "validate"
368
- ? validate(params)
369
- : emit(params);
308
+ listenerManager,
309
+ });
370
310
  },
371
311
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
372
- on: (type, callback) => add({ type, callback }),
373
- off: (type, callback) => remove(type, callback),
312
+ on: (type, callback) => listenerManager.add({ type, callback }),
313
+ off: (type, callback) => listenerManager.remove(type, callback),
374
314
  updateConfig: (config) => configManager.update(config),
375
315
  version,
376
316
  clearStorage: () => {
package/lib/relay.mjs CHANGED
@@ -1,5 +1,3 @@
1
- import crypto from 'crypto';
2
-
3
1
  async function callEventApi({ event, config, environment, }) {
4
2
  const { url, token } = config;
5
3
  const headers = {
@@ -20,80 +18,41 @@ async function callEventApi({ event, config, environment, }) {
20
18
  return data;
21
19
  }
22
20
 
23
- async function emit(params) {
24
- await callEventApi(params);
21
+ async function validate$1(params) {
22
+ const data = await callEventApi(params);
23
+ if (!data) {
24
+ return {
25
+ valid: false,
26
+ errors: [{ type: "", message: "disabled", path: "" }],
27
+ };
28
+ }
29
+ const { valid, errors } = data[0];
30
+ return { valid, errors: errors ?? [] };
25
31
  }
26
32
 
27
- const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate
28
-
29
- let poolPtr = rnds8Pool.length;
30
- function rng() {
31
- if (poolPtr > rnds8Pool.length - 16) {
32
- crypto.randomFillSync(rnds8Pool);
33
- poolPtr = 0;
34
- }
35
-
36
- return rnds8Pool.slice(poolPtr, poolPtr += 16);
33
+ async function emit(params) {
34
+ const { listenerManager, event, config } = params;
35
+ const isEnabled = config.mode !== "disabled";
36
+ isEnabled && listenerManager.call(event);
37
+ return config.mode === "validate" ? validate$1(params) : emitEvent(params);
38
+ }
39
+ async function emitEvent(params) {
40
+ await callEventApi(params);
37
41
  }
38
42
 
39
43
  var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
40
44
 
41
- function validate$1(uuid) {
45
+ function validate(uuid) {
42
46
  return typeof uuid === 'string' && REGEX.test(uuid);
43
47
  }
44
48
 
45
- /**
46
- * Convert array of 16 byte values to UUID string format of the form:
47
- * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
48
- */
49
-
50
- const byteToHex = [];
51
-
52
- for (let i = 0; i < 256; ++i) {
53
- byteToHex.push((i + 0x100).toString(16).slice(1));
54
- }
55
-
56
- function unsafeStringify(arr, offset = 0) {
57
- // Note: Be careful editing this code! It's been tuned for performance
58
- // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
59
- return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
60
- }
61
-
62
- var native = {
63
- randomUUID: crypto.randomUUID
64
- };
65
-
66
- function v4(options, buf, offset) {
67
- if (native.randomUUID && !buf && !options) {
68
- return native.randomUUID();
69
- }
70
-
71
- options = options || {};
72
- const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
73
-
74
- rnds[6] = rnds[6] & 0x0f | 0x40;
75
- rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
76
-
77
- if (buf) {
78
- offset = offset || 0;
79
-
80
- for (let i = 0; i < 16; ++i) {
81
- buf[offset + i] = rnds[i];
82
- }
83
-
84
- return buf;
85
- }
86
-
87
- return unsafeStringify(rnds);
88
- }
89
-
90
49
  function createClientIdManager(environment) {
91
50
  const key = "visitorId";
92
51
  return {
93
52
  getClientId: () => {
94
53
  const storage = environment.storage;
95
54
  const existingClientId = storage.getItem(key);
96
- const clientId = existingClientId && validate$1(existingClientId)
55
+ const clientId = existingClientId && validate(existingClientId)
97
56
  ? existingClientId
98
57
  : environment.generateUUID();
99
58
  storage.setItem(key, clientId);
@@ -170,7 +129,7 @@ function buildBrowserEnvironment() {
170
129
  getReferrerUrl: () => getReferrerUrl(),
171
130
  getUrl: () => window.location.href,
172
131
  getUserAgent: () => navigator.userAgent,
173
- generateUUID: () => v4(),
132
+ generateUUID: () => crypto.randomUUID(),
174
133
  storage: createBrowserStorage(),
175
134
  };
176
135
  }
@@ -196,7 +155,7 @@ function buildNodeEnvironment() {
196
155
  getReferrerUrl: () => null,
197
156
  getUrl: () => null,
198
157
  getUserAgent: () => null,
199
- generateUUID: () => v4(),
158
+ generateUUID: () => crypto.randomUUID(),
200
159
  storage: createNullStorage(),
201
160
  };
202
161
  }
@@ -213,7 +172,7 @@ function isBrowser() {
213
172
  }
214
173
  }
215
174
 
216
- const version = "0.5.0" ;
175
+ const version = "0.6.1" ;
217
176
 
218
177
  function getEventConfig(config) {
219
178
  const { trackingId } = config;
@@ -318,18 +277,6 @@ function createConfigManager(initialConfig) {
318
277
  };
319
278
  }
320
279
 
321
- async function validate(params) {
322
- const data = await callEventApi(params);
323
- if (!data) {
324
- return {
325
- valid: false,
326
- errors: [{ type: "", message: "disabled", path: "" }],
327
- };
328
- }
329
- const { valid, errors } = data[0];
330
- return { valid, errors: errors ?? [] };
331
- }
332
-
333
280
  function buildNullEnvironment() {
334
281
  return {
335
282
  runtime: "null",
@@ -344,27 +291,26 @@ function buildNullEnvironment() {
344
291
 
345
292
  function createRelay(initialConfig) {
346
293
  const configManager = createConfigManager(initialConfig);
294
+ const listenerManager = createListenerManager();
347
295
  const getEnvironment = () => configManager.get().mode == "disabled"
348
296
  ? buildNullEnvironment()
349
297
  : currentEnvironment();
350
298
  const clientIdManager = createClientIdManager(getEnvironment());
351
- const { add, call, remove } = createListenerManager();
352
299
  return {
353
300
  emit: (type, payload) => {
354
- const event = createRelayEvent(type, payload, configManager.get(), getEnvironment(), clientIdManager);
355
- call(event);
356
- const params = {
357
- config: configManager.get(),
358
- environment: getEnvironment(),
301
+ const config = configManager.get();
302
+ const environment = getEnvironment();
303
+ const event = createRelayEvent(type, payload, config, environment, clientIdManager);
304
+ return emit({
305
+ config,
306
+ environment,
359
307
  event,
360
- };
361
- return configManager.get().mode === "validate"
362
- ? validate(params)
363
- : emit(params);
308
+ listenerManager,
309
+ });
364
310
  },
365
311
  getMeta: (type) => createMeta(type, configManager.get(), getEnvironment(), clientIdManager),
366
- on: (type, callback) => add({ type, callback }),
367
- off: (type, callback) => remove(type, callback),
312
+ on: (type, callback) => listenerManager.add({ type, callback }),
313
+ off: (type, callback) => listenerManager.remove(type, callback),
368
314
  updateConfig: (config) => configManager.update(config),
369
315
  version,
370
316
  clearStorage: () => {
@@ -1,3 +1,12 @@
1
- import { EventApiCallParams } from "../event-api-call/event-api-caller";
2
- export declare function emit(params: EventApiCallParams): Promise<void>;
1
+ import { Environment } from "../environment/environment";
2
+ import { RelayEvent } from "../event/relay-event";
3
+ import { ListenerManager } from "../listener/listener";
4
+ import { RelayConfig } from "../relay";
5
+ export interface EmitParams {
6
+ config: RelayConfig;
7
+ environment: Environment;
8
+ event: RelayEvent;
9
+ listenerManager: ListenerManager;
10
+ }
11
+ export declare function emit(params: EmitParams): Promise<void | Readonly<import("../relay").ValidationResponse>>;
3
12
  //# sourceMappingURL=emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,wBAAsB,IAAI,CAAC,MAAM,EAAE,kBAAkB,iBAEpD"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/emit/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,UAAU,mEAM5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/environment/browser/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,uBAAuB,IAAI,WAAW,CAUrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/environment/node/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,wBAAgB,oBAAoB,IAAI,WAAW,CAUlD"}
@@ -4,7 +4,7 @@ interface Listener {
4
4
  type: string;
5
5
  callback: EventCallback;
6
6
  }
7
- interface ListenerManager {
7
+ export interface ListenerManager {
8
8
  add: (listener: Listener) => () => void;
9
9
  call: (event: RelayEvent) => void;
10
10
  remove: (type: string, callback?: EventCallback) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/listener/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAExD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA4DvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEL,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;AAEtB,UAAU,KAAK;IACb,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,GAAG,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,WAAW,GAAG,KAAK,CA2C7D;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coveo/relay",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "A library for sending analytics events using Coveo's Event protocol.",
5
5
  "files": [
6
6
  "lib/**/*"
@@ -43,9 +43,10 @@
43
43
  "@rollup/plugin-terser": "^0.4.3",
44
44
  "@rollup/plugin-typescript": "^11.1.2",
45
45
  "@types/jest": "^29.5.3",
46
- "@types/uuid": "^9.0.2",
47
- "jest": "^29.6.2",
48
- "jest-environment-jsdom": "^29.6.2",
46
+ "@types/uuid": "^9.0.4",
47
+ "jest": "^29.7.0",
48
+ "jest-environment-jsdom": "^29.7.0",
49
+ "rimraf": "5.0.5",
49
50
  "rollup": "^3.28.0",
50
51
  "ts-jest": "^29.1.1",
51
52
  "typescript": "^5.1.6",
@@ -53,11 +54,14 @@
53
54
  "tsconfig": "0.0.0"
54
55
  },
55
56
  "dependencies": {
56
- "uuid": "^9.0.0"
57
+ "uuid": "^9.0.1"
58
+ },
59
+ "engines": {
60
+ "node": "^18.12.0 || ^20.0.0"
57
61
  },
58
62
  "scripts": {
59
63
  "build": "npm run clean && rollup --config ./config/rollup.config.mjs",
60
- "clean": "rm -rf ./lib",
64
+ "clean": "rimraf -rf ./lib",
61
65
  "test": "jest",
62
66
  "test:watch": "jest --watch",
63
67
  "npm:tag": "node ./scripts/update-npm-tag.mjs"