@junobuild/analytics 0.0.3 → 0.0.4

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.
@@ -0,0 +1,2 @@
1
+ function i(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}function a(e,t){let n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);let r=i(n);return(o,u)=>r.then(l=>u(l.transaction(t,o).objectStore(t)))}var s;function c(){return s||(s=a("keyval-store","keyval")),s}function d(e,t,n=c()){return n("readwrite",r=>(r.put(t,e),i(r.transaction)))}function p(e,t=c()){return t("readwrite",n=>(e.forEach(r=>n.delete(r)),i(n.transaction)))}function h(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},i(e.transaction)}function f(e=c()){return e("readonly",t=>{if(t.getAll&&t.getAllKeys)return Promise.all([i(t.getAllKeys()),i(t.getAll())]).then(([r,o])=>r.map((u,l)=>[u,o[l]]));let n=[];return e("readonly",r=>h(r,o=>n.push([o.key,o.value])).then(()=>n))})}var g=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,n)=>(n&=63,n<36?t+=n.toString(36):n<62?t+=(n-26).toString(36).toUpperCase():n>62?t+="-":t+="_",t),"");var m=a("juno-views","views"),y=a("juno-events","events"),A=e=>d(g(),e,m),V=()=>f(m),k=e=>p(e,m),I=e=>d(g(),e,y),E=()=>f(y),K=e=>p(e,y);export{k as delPageViews,K as delTrackEvents,V as getPageViews,E as getTrackEvents,A as setPageView,I as setTrackEvent};
2
+ //# sourceMappingURL=idb.services-ZAVXGYMZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/index.browser.js", "../../src/services/idb.services.ts"],
4
+ "sourcesContent": ["function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n"],
5
+ "mappings": "AAAA,SAASA,EAAiBC,EAAS,CAC/B,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CAEpCF,EAAQ,WAAaA,EAAQ,UAAY,IAAMC,EAAQD,EAAQ,MAAM,EAErEA,EAAQ,QAAUA,EAAQ,QAAU,IAAME,EAAOF,EAAQ,KAAK,CAClE,CAAC,CACL,CACA,SAASG,EAAYC,EAAQC,EAAW,CACpC,IAAML,EAAU,UAAU,KAAKI,CAAM,EACrCJ,EAAQ,gBAAkB,IAAMA,EAAQ,OAAO,kBAAkBK,CAAS,EAC1E,IAAMC,EAAMP,EAAiBC,CAAO,EACpC,MAAO,CAACO,EAAQC,IAAaF,EAAI,KAAMG,GAAOD,EAASC,EAAG,YAAYJ,EAAWE,CAAM,EAAE,YAAYF,CAAS,CAAC,CAAC,CACpH,CACA,IAAIK,EACJ,SAASC,GAAkB,CACvB,OAAKD,IACDA,EAAsBP,EAAY,eAAgB,QAAQ,GAEvDO,CACX,CAiBA,SAASE,EAAIC,EAAKC,EAAOC,EAAcC,EAAgB,EAAG,CACtD,OAAOD,EAAY,YAAcE,IAC7BA,EAAM,IAAIH,EAAOD,CAAG,EACbK,EAAiBD,EAAM,WAAW,EAC5C,CACL,CAiEA,SAASE,EAAQC,EAAMC,EAAcC,EAAgB,EAAG,CACpD,OAAOD,EAAY,YAAcE,IAC7BH,EAAK,QAASI,GAAQD,EAAM,OAAOC,CAAG,CAAC,EAChCC,EAAiBF,EAAM,WAAW,EAC5C,CACL,CAYA,SAASG,EAAWC,EAAOC,EAAU,CACjC,OAAAD,EAAM,WAAW,EAAE,UAAY,UAAY,CAClC,KAAK,SAEVC,EAAS,KAAK,MAAM,EACpB,KAAK,OAAO,SAAS,EACzB,EACOC,EAAiBF,EAAM,WAAW,CAC7C,CAoCA,SAASG,EAAQC,EAAcC,EAAgB,EAAG,CAC9C,OAAOD,EAAY,WAAaE,GAAU,CAGtC,GAAIA,EAAM,QAAUA,EAAM,WACtB,OAAO,QAAQ,IAAI,CACfC,EAAiBD,EAAM,WAAW,CAAC,EACnCC,EAAiBD,EAAM,OAAO,CAAC,CACnC,CAAC,EAAE,KAAK,CAAC,CAACE,EAAMC,CAAM,IAAMD,EAAK,IAAI,CAACE,EAAKC,IAAM,CAACD,EAAKD,EAAOE,CAAC,CAAC,CAAC,CAAC,EAEtE,IAAMC,EAAQ,CAAC,EACf,OAAOR,EAAY,WAAaE,GAAUO,EAAWP,EAAQQ,GAAWF,EAAM,KAAK,CAACE,EAAO,IAAKA,EAAO,KAAK,CAAC,CAAC,EAAE,KAAK,IAAMF,CAAK,CAAC,CACrI,CAAC,CACL,CClKO,IAAIG,EAAS,CAACC,EAAO,KAC1B,OAAO,gBAAgB,IAAI,WAAWA,CAAI,CAAC,EAAE,OAAO,CAACC,EAAIC,KACvDA,GAAQ,GACJA,EAAO,GACTD,GAAMC,EAAK,SAAS,EAAE,EACbA,EAAO,GAChBD,IAAOC,EAAO,IAAI,SAAS,EAAE,EAAE,YAAY,EAClCA,EAAO,GAChBD,GAAM,IAENA,GAAM,IAEDA,GACN,EAAE,EC5BP,IAAME,EAAaC,EAAY,aAAc,OAAO,EAC9CC,EAAcD,EAAY,cAAe,QAAQ,EAE1CE,EAAeC,GAAqCC,EAAIC,EAAO,EAAGF,EAAMJ,CAAU,EAElFO,EAAe,IAA6CC,EAAQR,CAAU,EAE9ES,EAAgBC,GAAuCC,EAAQD,EAAMV,CAAU,EAE/EY,EAAiBC,GAC5BR,EAAIC,EAAO,EAAGO,EAAOX,CAAW,EAErBY,EAAiB,IAA+CN,EAAQN,CAAW,EAEnFa,EAAkBL,GAAuCC,EAAQD,EAAMR,CAAW",
6
+ "names": ["promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStoreFunc", "defaultGetStore", "set", "key", "value", "customStore", "defaultGetStore", "store", "promisifyRequest", "delMany", "keys", "customStore", "defaultGetStore", "store", "key", "promisifyRequest", "eachCursor", "store", "callback", "promisifyRequest", "entries", "customStore", "defaultGetStore", "store", "promisifyRequest", "keys", "values", "key", "i", "items", "eachCursor", "cursor", "nanoid", "size", "id", "byte", "viewsStore", "createStore", "eventsStore", "setPageView", "view", "set", "nanoid", "getPageViews", "entries", "delPageViews", "keys", "delMany", "setTrackEvent", "track", "getTrackEvents", "delTrackEvents"]
7
+ }
@@ -1,2 +1,2 @@
1
- var y=e=>e==null,u=e=>!y(e),A=class extends Error{},a=(e,t)=>{if(y(e))throw new A(t)},g=e=>u(e)?[e]:[];var w=()=>typeof window<"u";function v(e){return new Promise((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)})}function l(e,t){let r=indexedDB.open(e);r.onupgradeneeded=()=>r.result.createObjectStore(t);let o=v(r);return(i,c)=>o.then(b=>c(b.transaction(t,i).objectStore(t)))}var p;function S(){return p||(p=l("keyval-store","keyval")),p}function d(e,t,r=S()){return r("readwrite",o=>(o.put(t,e),v(o.transaction)))}var m=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,r)=>(r&=63,r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r>62?t+="-":t+="_",t),"");var I=l("juno-views","views"),M=l("juno-events","events"),h=e=>d(m(),e,I);var k=e=>d(m(),e,M);var n,P=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),j(e)},E=()=>{let e=async()=>await x(),t=new Proxy(history.pushState,{apply:async(r,o,i)=>{r.apply(o,i),await e()}});return history.pushState=t,addEventListener("popstate",e,{passive:!0}),{cleanup(){t=null,removeEventListener("popstate",e,!1)}}},s="Analytics worker not initialized. Did you call `initWorker`?",f=async()=>{let{title:e,location:{href:t},referrer:r}=document,{innerWidth:o,innerHeight:i}=window,c={title:e,href:t,referrer:g(u(r)&&r!==""?r:void 0),device:{inner_width:o,inner_height:i}};await h(c)},x=async()=>{a(n,s),await f(),n?.postMessage({msg:"junoTrackPageView"})},N=async e=>{a(n,s),await k(e),n?.postMessage({msg:"junoTrackEvent"})},j=e=>{a(n,s),n?.postMessage({msg:"junoInitEnvironment",data:e})},T=()=>{a(n,s),n?.postMessage({msg:"junoStartTrackTimer"})},V=()=>{a(n,s),n?.postMessage({msg:"junoStopTrackTimer"})};var z=async e=>{if(!w())return Promise.resolve;await f(),P(e);let{cleanup:t}=E();return T(),()=>{V(),t()}};export{z as initOrbiter,N as trackEvent,x as trackPageView};
1
+ var u=t=>t==null,p=t=>!u(t),v=class extends Error{},a=(t,e)=>{if(u(t))throw new v(e)},m=t=>p(t)?[t]:[];var c=()=>typeof window<"u";var r,w=t=>{let{path:e}=t.worker??{},n=e===void 0?"./workers/analytics.worker.js":e;r=new Worker(n),E(t)},y=()=>{let t=async()=>await d(),e=new Proxy(history.pushState,{apply:async(n,s,i)=>{n.apply(s,i),await t()}});return history.pushState=e,addEventListener("popstate",t,{passive:!0}),{cleanup(){e=null,removeEventListener("popstate",t,!1)}}},o="Analytics worker not initialized. Did you call `initWorker`?",l=async()=>{if(!c())return;let{title:t,location:{href:e},referrer:n}=document,{innerWidth:s,innerHeight:i}=window,f={title:t,href:e,referrer:m(p(n)&&n!==""?n:void 0),device:{inner_width:s,inner_height:i}};await(await import("./idb.services-ZAVXGYMZ.js")).setPageView(f)},d=async()=>{a(r,o),await l(),r?.postMessage({msg:"junoTrackPageView"})},h=async t=>{if(!c())return;a(r,o),await(await import("./idb.services-ZAVXGYMZ.js")).setTrackEvent(t),r?.postMessage({msg:"junoTrackEvent"})},E=t=>{a(r,o),r?.postMessage({msg:"junoInitEnvironment",data:t})},k=()=>{a(r,o),r?.postMessage({msg:"junoStartTrackTimer"})},g=()=>{a(r,o),r?.postMessage({msg:"junoStopTrackTimer"})};var W=async t=>{await l(),w(t);let{cleanup:e}=y();return k(),()=>{g(),e()}};export{W as initOrbiter,h as trackEvent,d as trackPageView};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/index.browser.js", "../../src/services/idb.services.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
- "sourcesContent": ["/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\nimport {setPageView as idbSetPageView, setTrackEvent} from './idb.services';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n await idbSetPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {isBrowser} from '@junobuild/utils';\nimport {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n if (!isBrowser()) {\n // Avoid pre-rendering issue when window and indexedDB is not available\n return Promise.resolve;\n }\n\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStoreFunc", "defaultGetStore", "set", "key", "value", "customStore", "defaultGetStore", "store", "promisifyRequest", "nanoid", "size", "id", "byte", "viewsStore", "createStore", "eventsStore", "setPageView", "view", "set", "nanoid", "setTrackEvent", "track", "set", "nanoid", "eventsStore", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "setTrackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "y", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
3
+ "sources": ["../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "import {assertNonNullish, isBrowser, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n if (!isBrowser()) {\n return;\n }\n\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n const idb = await import('./idb.services');\n await idb.setPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n if (!isBrowser()) {\n return;\n }\n\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n const idb = await import('./idb.services');\n await idb.setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
+ "mappings": "ACCO,IAAMA,EAAgBC,GAC3BA,GAAa,KAGFC,EAAiBD,GAC5B,CAACD,EAAUC,CAAQ,EAERE,EAAN,cAA2B,KAAM,CAAC,EAE5BC,EAG0B,CAAIC,EAAUC,IAA2B,CAC9E,GAAIN,EAAUK,CAAK,EACjB,MAAM,IAAIF,EAAaG,CAAO,CAElC,ECfaC,EAAiBF,GACrBH,EAAWG,CAAK,EAAI,CAACA,CAAK,EAAI,CAAC,ECHjC,IAAMG,EAAY,IAAM,OAAO,OAAW,ICMjD,IAAIC,EAESC,EAAcC,GAAqB,CAC9C,GAAM,CAAC,KAAAC,CAAI,EAAuBD,EAAI,QAAU,CAAC,EAC3CE,EAAYD,IAAS,OAAY,gCAAkCA,EAEzEH,EAAS,IAAI,OAAOI,CAAS,EAE7BC,EAAsBH,CAAG,CAC3B,EAEaI,EAAqB,IAA6B,CAC7D,IAAMC,EAAa,SAAY,MAAMC,EAAc,EAE/CC,EAAkD,IAAI,MAAM,QAAQ,UAAW,CACjF,MAAO,MACLC,EACAC,EACAC,IACG,CACHF,EAAO,MAAMC,EAASC,CAAQ,EAC9B,MAAML,EAAW,CACnB,CACF,CAAC,EAED,eAAQ,UAAYE,EAEpB,iBAAiB,WAAYF,EAAY,CAAC,QAAS,EAAI,CAAC,EAEjD,CACL,SAAU,CACRE,EAAiB,KACjB,oBAAoB,WAAYF,EAAY,EAAK,CACnD,CACF,CACF,EAEMM,EACJ,+DAEWC,EAAc,SAAY,CACrC,GAAI,CAACC,EAAU,EACb,OAGF,GAAM,CACJ,MAAAC,EACA,SAAU,CAAC,KAAAC,CAAI,EACf,SAAAC,CACF,EAAI,SACE,CAAC,WAAAC,EAAY,YAAAC,CAAW,EAAI,OAE5BC,EAAoB,CACxB,MAAAL,EACA,KAAAC,EACA,SAAUK,EAAWC,EAAWL,CAAQ,GAAKA,IAAa,GAAKA,EAAW,MAAS,EACnF,OAAQ,CACN,YAAaC,EACb,aAAcC,CAChB,CACF,EAGA,MADY,KAAM,QAAO,4BAAgB,GAC/B,YAAYC,CAAI,CAC5B,EAEab,EAAgB,SAAY,CACvCgB,EAAiBxB,EAAQa,CAAoB,EAE7C,MAAMC,EAAY,EAElBd,GAAQ,YAAY,CAAC,IAAK,mBAAmB,CAAC,CAChD,EAEayB,EAAa,MAAOJ,GAAqB,CACpD,GAAI,CAACN,EAAU,EACb,OAGFS,EAAiBxB,EAAQa,CAAoB,EAG7C,MADY,KAAM,QAAO,4BAAgB,GAC/B,cAAcQ,CAAI,EAE5BrB,GAAQ,YAAY,CAAC,IAAK,gBAAgB,CAAC,CAC7C,EAEaK,EAAyBH,GAAgC,CACpEsB,EAAiBxB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,sBAAuB,KAAME,CAAG,CAAC,CAC7D,EAEawB,EAAgB,IAAM,CACjCF,EAAiBxB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,qBAAqB,CAAC,CAClD,EAEa2B,EAAe,IAAM,CAChCH,EAAiBxB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,oBAAoB,CAAC,CACjD,ECjGO,IAAM4B,EAAc,MAAOC,GAA0C,CAE1E,MAAMC,EAAY,EAElBC,EAAWF,CAAG,EAEd,GAAM,CAAC,QAAAG,CAAO,EAAIC,EAAmB,EAGrC,OAAAC,EAAc,EAEP,IAAM,CACXC,EAAa,EACbH,EAAQ,CACV,CACF",
6
+ "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "y", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
7
7
  }
@@ -1,4 +1,4 @@
1
1
  import { createRequire as topLevelCreateRequire } from 'module';
2
2
  const require = topLevelCreateRequire(import.meta.url);
3
- import{createRequire as N}from"module";var _=N(import.meta.url);var w=e=>e==null,d=e=>!w(e),j=class extends Error{},a=(e,t)=>{if(w(e))throw new j(t)},v=e=>d(e)?[e]:[];var h=()=>typeof window<"u";function k(e){return new Promise((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)})}function u(e,t){let r=indexedDB.open(e);r.onupgradeneeded=()=>r.result.createObjectStore(t);let o=k(r);return(l,p)=>o.then(M=>p(M.transaction(t,l).objectStore(t)))}var m;function B(){return m||(m=u("keyval-store","keyval")),m}function f(e,t,r=B()){return r("readwrite",o=>(o.put(t,e),k(o.transaction)))}import{randomFillSync as E}from"crypto";var P="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var D=128,i,s,W=e=>{!i||i.length<e?(i=Buffer.allocUnsafe(e*D),E(i),s=0):s+e>i.length&&(E(i),s=0),s+=e};var y=(e=21)=>{W(e-=0);let t="";for(let r=s-e;r<s;r++)t+=P[i[r]&63];return t};var K=u("juno-views","views"),O=u("juno-events","events"),x=e=>f(y(),e,K);var T=e=>f(y(),e,O);var n,b=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;n=new Worker(r),U(e)},V=()=>{let e=async()=>await I(),t=new Proxy(history.pushState,{apply:async(r,o,l)=>{r.apply(o,l),await e()}});return history.pushState=t,addEventListener("popstate",e,{passive:!0}),{cleanup(){t=null,removeEventListener("popstate",e,!1)}}},c="Analytics worker not initialized. Did you call `initWorker`?",g=async()=>{let{title:e,location:{href:t},referrer:r}=document,{innerWidth:o,innerHeight:l}=window,p={title:e,href:t,referrer:v(d(r)&&r!==""?r:void 0),device:{inner_width:o,inner_height:l}};await x(p)},I=async()=>{a(n,c),await g(),n?.postMessage({msg:"junoTrackPageView"})},R=async e=>{a(n,c),await T(e),n?.postMessage({msg:"junoTrackEvent"})},U=e=>{a(n,c),n?.postMessage({msg:"junoInitEnvironment",data:e})},S=()=>{a(n,c),n?.postMessage({msg:"junoStartTrackTimer"})},A=()=>{a(n,c),n?.postMessage({msg:"junoStopTrackTimer"})};var ie=async e=>{if(!h())return Promise.resolve;await g(),b(e);let{cleanup:t}=V();return S(),()=>{A(),t()}};export{ie as initOrbiter,R as trackEvent,I as trackPageView};
3
+ var L=Object.defineProperty;var m=(e,t)=>()=>(e&&(t=e(e=0)),t);var _=(e,t)=>{for(var r in t)L(e,r,{get:t[r],enumerable:!0})};function l(e){return new Promise((t,r)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>r(e.error)})}function f(e,t){let r=indexedDB.open(e);r.onupgradeneeded=()=>r.result.createObjectStore(t);let n=l(r);return(i,u)=>n.then(d=>u(d.transaction(t,i).objectStore(t)))}function v(){return g||(g=f("keyval-store","keyval")),g}function h(e,t,r=v()){return r("readwrite",n=>(n.put(t,e),l(n.transaction)))}function k(e,t=v()){return t("readwrite",r=>(e.forEach(n=>r.delete(n)),l(r.transaction)))}function G(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},l(e.transaction)}function P(e=v()){return e("readonly",t=>{if(t.getAll&&t.getAllKeys)return Promise.all([l(t.getAllKeys()),l(t.getAll())]).then(([n,i])=>n.map((u,d)=>[u,i[d]]));let r=[];return e("readonly",n=>G(n,i=>r.push([i.key,i.value])).then(()=>r))})}var g,M=m(()=>{});var N,j=m(()=>{N="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{randomFillSync as B}from"crypto";var J,a,c,H,E,D=m(()=>{j();J=128,H=e=>{!a||a.length<e?(a=Buffer.allocUnsafe(e*J),B(a),c=0):c+e>a.length&&(B(a),c=0),c+=e},E=(e=21)=>{H(e-=0);let t="";for(let r=c-e;r<c;r++)t+=N[a[r]&63];return t}});var b={};_(b,{delPageViews:()=>z,delTrackEvents:()=>Y,getPageViews:()=>q,getTrackEvents:()=>X,setPageView:()=>Z,setTrackEvent:()=>Q});var x,T,Z,q,z,Q,X,Y,V=m(()=>{"use strict";M();D();x=f("juno-views","views"),T=f("juno-events","events"),Z=e=>h(E(),e,x),q=()=>P(x),z=e=>k(e,x),Q=e=>h(E(),e,T),X=()=>P(T),Y=e=>k(e,T)});import{createRequire as C}from"module";var ne=C(import.meta.url);var A=e=>e==null,y=e=>!A(e),F=class extends Error{},s=(e,t)=>{if(A(e))throw new F(t)},S=e=>y(e)?[e]:[];var w=()=>typeof window<"u";var o,W=e=>{let{path:t}=e.worker??{},r=t===void 0?"./workers/analytics.worker.js":t;o=new Worker(r),ee(e)},K=()=>{let e=async()=>await O(),t=new Proxy(history.pushState,{apply:async(r,n,i)=>{r.apply(n,i),await e()}});return history.pushState=t,addEventListener("popstate",e,{passive:!0}),{cleanup(){t=null,removeEventListener("popstate",e,!1)}}},p="Analytics worker not initialized. Did you call `initWorker`?",I=async()=>{if(!w())return;let{title:e,location:{href:t},referrer:r}=document,{innerWidth:n,innerHeight:i}=window,u={title:e,href:t,referrer:S(y(r)&&r!==""?r:void 0),device:{inner_width:n,inner_height:i}};await(await Promise.resolve().then(()=>(V(),b))).setPageView(u)},O=async()=>{s(o,p),await I(),o?.postMessage({msg:"junoTrackPageView"})},$=async e=>{if(!w())return;s(o,p),await(await Promise.resolve().then(()=>(V(),b))).setTrackEvent(e),o?.postMessage({msg:"junoTrackEvent"})},ee=e=>{s(o,p),o?.postMessage({msg:"junoInitEnvironment",data:e})},R=()=>{s(o,p),o?.postMessage({msg:"junoStartTrackTimer"})},U=()=>{s(o,p),o?.postMessage({msg:"junoStopTrackTimer"})};var we=async e=>{await I(),W(e);let{cleanup:t}=K();return R(),()=>{U(),t()}};export{we as initOrbiter,$ as trackEvent,O as trackPageView};
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/index.js", "../../../../node_modules/nanoid/url-alphabet/index.js", "../../src/services/idb.services.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
- "sourcesContent": ["/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "import { randomFillSync } from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet }\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport let random = bytes => {\n fillPool((bytes -= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) => {\n fillPool((size -= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\n", "export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n", "import {assertNonNullish, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\nimport {setPageView as idbSetPageView, setTrackEvent} from './idb.services';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n await idbSetPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {isBrowser} from '@junobuild/utils';\nimport {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n if (!isBrowser()) {\n // Avoid pre-rendering issue when window and indexedDB is not available\n return Promise.resolve;\n }\n\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
- "mappings": ";;gECCO,IAAMA,EAAgBC,GAC3BA,GAAa,KAGFC,EAAiBD,GAC5B,CAACD,EAAUC,CAAQ,EAERE,EAAN,cAA2B,KAAM,CAAC,EAE5BC,EAG0B,CAAIC,EAAUC,IAA2B,CAC9E,GAAIN,EAAUK,CAAK,EACjB,MAAM,IAAIF,EAAaG,CAAO,CAElC,ECfaC,EAAiBF,GACrBH,EAAWG,CAAK,EAAI,CAACA,CAAK,EAAI,CAAC,ECHjC,IAAMG,EAAY,IAAM,OAAO,OAAW,ICAjD,SAASC,EAAiBC,EAAS,CAC/B,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CAEpCF,EAAQ,WAAaA,EAAQ,UAAY,IAAMC,EAAQD,EAAQ,MAAM,EAErEA,EAAQ,QAAUA,EAAQ,QAAU,IAAME,EAAOF,EAAQ,KAAK,CAClE,CAAC,CACL,CACA,SAASG,EAAYC,EAAQC,EAAW,CACpC,IAAML,EAAU,UAAU,KAAKI,CAAM,EACrCJ,EAAQ,gBAAkB,IAAMA,EAAQ,OAAO,kBAAkBK,CAAS,EAC1E,IAAMC,EAAMP,EAAiBC,CAAO,EACpC,MAAO,CAACO,EAAQC,IAAaF,EAAI,KAAMG,GAAOD,EAASC,EAAG,YAAYJ,EAAWE,CAAM,EAAE,YAAYF,CAAS,CAAC,CAAC,CACpH,CACA,IAAIK,EACJ,SAASC,GAAkB,CACvB,OAAKD,IACDA,EAAsBP,EAAY,eAAgB,QAAQ,GAEvDO,CACX,CAiBA,SAASE,EAAIC,EAAKC,EAAOC,EAAcC,EAAgB,EAAG,CACtD,OAAOD,EAAY,YAAcE,IAC7BA,EAAM,IAAIH,EAAOD,CAAG,EACbK,EAAiBD,EAAM,WAAW,EAC5C,CACL,CC1CA,OAAS,kBAAAE,MAAsB,SCAxB,IAAMC,EACX,mEDEF,IAAMC,EAAuB,IACzBC,EAAMC,EACNC,EAAWC,GAAS,CAClB,CAACH,GAAQA,EAAK,OAASG,GACzBH,EAAO,OAAO,YAAYG,EAAQJ,CAAoB,EACtDK,EAAeJ,CAAI,EACnBC,EAAa,GACJA,EAAaE,EAAQH,EAAK,SACnCI,EAAeJ,CAAI,EACnBC,EAAa,GAEfA,GAAcE,CAChB,EAsBO,IAAIE,EAAS,CAACC,EAAO,KAAO,CACjCC,EAAUD,GAAQ,CAAE,EACpB,IAAIE,EAAK,GACT,QAASC,EAAIC,EAAaJ,EAAMG,EAAIC,EAAYD,IAC9CD,GAAMG,EAAYC,EAAKH,CAAC,EAAI,EAAE,EAEhC,OAAOD,CACT,EExCA,IAAMK,EAAaC,EAAY,aAAc,OAAO,EAC9CC,EAAcD,EAAY,cAAe,QAAQ,EAE1CE,EAAeC,GAAqCC,EAAIC,EAAO,EAAGF,EAAMJ,CAAU,EAMxF,IAAMO,EAAiBC,GAC5BC,EAAIC,EAAO,EAAGF,EAAOG,CAAW,ECPlC,IAAIC,EAESC,EAAcC,GAAqB,CAC9C,GAAM,CAAC,KAAAC,CAAI,EAAuBD,EAAI,QAAU,CAAC,EAC3CE,EAAYD,IAAS,OAAY,gCAAkCA,EAEzEH,EAAS,IAAI,OAAOI,CAAS,EAE7BC,EAAsBH,CAAG,CAC3B,EAEaI,EAAqB,IAA6B,CAC7D,IAAMC,EAAa,SAAY,MAAMC,EAAc,EAE/CC,EAAkD,IAAI,MAAM,QAAQ,UAAW,CACjF,MAAO,MACLC,EACAC,EACAC,IACG,CACHF,EAAO,MAAMC,EAASC,CAAQ,EAC9B,MAAML,EAAW,CACnB,CACF,CAAC,EAED,eAAQ,UAAYE,EAEpB,iBAAiB,WAAYF,EAAY,CAAC,QAAS,EAAI,CAAC,EAEjD,CACL,SAAU,CACRE,EAAiB,KACjB,oBAAoB,WAAYF,EAAY,EAAK,CACnD,CACF,CACF,EAEMM,EACJ,+DAEWC,EAAc,SAAY,CACrC,GAAM,CACJ,MAAAC,EACA,SAAU,CAAC,KAAAC,CAAI,EACf,SAAAC,CACF,EAAI,SACE,CAAC,WAAAC,EAAY,YAAAC,CAAW,EAAI,OAE5BC,EAAoB,CACxB,MAAAL,EACA,KAAAC,EACA,SAAUK,EAAWC,EAAWL,CAAQ,GAAKA,IAAa,GAAKA,EAAW,MAAS,EACnF,OAAQ,CACN,YAAaC,EACb,aAAcC,CAChB,CACF,EAEA,MAAML,EAAeM,CAAI,CAC3B,EAEaZ,EAAgB,SAAY,CACvCe,EAAiBvB,EAAQa,CAAoB,EAE7C,MAAMC,EAAY,EAElBd,GAAQ,YAAY,CAAC,IAAK,mBAAmB,CAAC,CAChD,EAEawB,EAAa,MAAOJ,GAAqB,CACpDG,EAAiBvB,EAAQa,CAAoB,EAE7C,MAAMY,EAAcL,CAAI,EAExBpB,GAAQ,YAAY,CAAC,IAAK,gBAAgB,CAAC,CAC7C,EAEaK,EAAyBH,GAAgC,CACpEqB,EAAiBvB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,sBAAuB,KAAME,CAAG,CAAC,CAC7D,EAEawB,EAAgB,IAAM,CACjCH,EAAiBvB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,qBAAqB,CAAC,CAClD,EAEa2B,EAAe,IAAM,CAChCJ,EAAiBvB,EAAQa,CAAoB,EAE7Cb,GAAQ,YAAY,CAAC,IAAK,oBAAoB,CAAC,CACjD,ECvFO,IAAM4B,GAAc,MAAOC,GAA0C,CAC1E,GAAI,CAACC,EAAU,EAEb,OAAO,QAAQ,QAIjB,MAAMC,EAAY,EAElBC,EAAWH,CAAG,EAEd,GAAM,CAAC,QAAAI,CAAO,EAAIC,EAAmB,EAGrC,OAAAC,EAAc,EAEP,IAAM,CACXC,EAAa,EACbH,EAAQ,CACV,CACF",
6
- "names": ["isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStoreFunc", "defaultGetStore", "set", "key", "value", "customStore", "defaultGetStore", "store", "promisifyRequest", "randomFillSync", "urlAlphabet", "POOL_SIZE_MULTIPLIER", "pool", "poolOffset", "fillPool", "bytes", "randomFillSync", "nanoid", "size", "fillPool", "id", "i", "poolOffset", "urlAlphabet", "pool", "viewsStore", "createStore", "eventsStore", "setPageView", "view", "set", "nanoid", "setTrackEvent", "track", "set", "nanoid", "eventsStore", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "setTrackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "y", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
3
+ "sources": ["../../../../node_modules/idb-keyval/dist/index.js", "../../../../node_modules/nanoid/url-alphabet/index.js", "../../../../node_modules/nanoid/index.js", "../../src/services/idb.services.ts", "../../../utils/src/utils/debounce.utils.ts", "../../../utils/src/utils/null.utils.ts", "../../../utils/src/utils/did.utils.ts", "../../../utils/src/utils/env.utils.ts", "../../src/services/analytics.services.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic \u2013 if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n", "export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n", "import { randomFillSync } from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet }\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport let random = bytes => {\n fillPool((bytes -= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) => {\n fillPool((size -= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\n", "import {createStore, delMany, entries, set} from 'idb-keyval';\nimport {nanoid} from 'nanoid';\nimport type {IdbPageView, IdbTrackEvent} from '../types/idb';\n\nconst viewsStore = createStore('juno-views', 'views');\nconst eventsStore = createStore('juno-events', 'events');\n\nexport const setPageView = (view: IdbPageView): Promise<void> => set(nanoid(), view, viewsStore);\n\nexport const getPageViews = (): Promise<[IDBValidKey, IdbPageView][]> => entries(viewsStore);\n\nexport const delPageViews = (keys: IDBValidKey[]): Promise<void> => delMany(keys, viewsStore);\n\nexport const setTrackEvent = (track: IdbTrackEvent): Promise<void> =>\n set(nanoid(), track, eventsStore);\n\nexport const getTrackEvents = (): Promise<[IDBValidKey, IdbTrackEvent][]> => entries(eventsStore);\n\nexport const delTrackEvents = (keys: IDBValidKey[]): Promise<void> => delMany(keys, eventsStore);\n", "/* eslint-disable-next-line @typescript-eslint/ban-types */\nexport const debounce = (func: Function, timeout?: number) => {\n let timer: NodeJS.Timer | undefined;\n\n return (...args: unknown[]) => {\n const next = () => func(...args);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(next, timeout !== undefined && timeout > 0 ? timeout : 300);\n };\n};\n", "/** Is null or undefined */\nexport const isNullish = <T>(argument: T | undefined | null): argument is undefined | null =>\n argument === null || argument === undefined;\n\n/** Not null and not undefined */\nexport const nonNullish = <T>(argument: T | undefined | null): argument is NonNullable<T> =>\n !isNullish(argument);\n\nexport class NullishError extends Error {}\n\nexport const assertNonNullish: <T>(\n value: T,\n message?: string\n) => asserts value is NonNullable<T> = <T>(value: T, message?: string): void => {\n if (isNullish(value)) {\n throw new NullishError(message);\n }\n};\n", "import {nonNullish} from './null.utils';\n\nexport const toNullable = <T>(value?: T): [] | [T] => {\n return nonNullish(value) ? [value] : [];\n};\n\nexport const fromNullable = <T>(value: [] | [T]): T | undefined => {\n return value?.[0];\n};\n\nexport const toArray = async <T>(data: T): Promise<Uint8Array> => {\n const blob: Blob = new Blob([JSON.stringify(data)], {\n type: 'application/json; charset=utf-8'\n });\n return new Uint8Array(await blob.arrayBuffer());\n};\n\nexport const fromArray = async <T>(data: Uint8Array | number[]): Promise<T> => {\n const blob: Blob = new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)], {\n type: 'application/json; charset=utf-8'\n });\n return JSON.parse(await blob.text());\n};\n", "export const isBrowser = () => typeof window !== `undefined`;\n", "import {assertNonNullish, isBrowser, nonNullish, toNullable} from '@junobuild/utils';\nimport type {Environment, EnvironmentWorker} from '../types/env';\nimport type {IdbPageView} from '../types/idb';\nimport type {PostMessageInitEnvData} from '../types/post-message';\nimport type {TrackEvent} from '../types/track';\n\nlet worker: Worker | undefined;\n\nexport const initWorker = (env: Environment) => {\n const {path}: EnvironmentWorker = env.worker ?? {};\n const workerUrl = path === undefined ? './workers/analytics.worker.js' : path;\n\n worker = new Worker(workerUrl);\n\n initWorkerEnvironment(env);\n};\n\nexport const initTrackPageViews = (): {cleanup: () => void} => {\n const trackPages = async () => await trackPageView();\n\n let pushStateProxy: typeof history.pushState | null = new Proxy(history.pushState, {\n apply: async (\n target,\n thisArg,\n argArray: [data: unknown, unused: string, url?: string | URL | null | undefined]\n ) => {\n target.apply(thisArg, argArray);\n await trackPages();\n }\n });\n\n history.pushState = pushStateProxy;\n\n addEventListener('popstate', trackPages, {passive: true});\n\n return {\n cleanup() {\n pushStateProxy = null;\n removeEventListener('popstate', trackPages, false);\n }\n };\n};\n\nconst WORKER_UNDEFINED_MSG =\n 'Analytics worker not initialized. Did you call `initWorker`?' as const;\n\nexport const setPageView = async () => {\n if (!isBrowser()) {\n return;\n }\n\n const {\n title,\n location: {href},\n referrer\n } = document;\n const {innerWidth, innerHeight} = window;\n\n const data: IdbPageView = {\n title,\n href,\n referrer: toNullable(nonNullish(referrer) && referrer !== '' ? referrer : undefined),\n device: {\n inner_width: innerWidth,\n inner_height: innerHeight\n }\n };\n\n const idb = await import('./idb.services');\n await idb.setPageView(data);\n};\n\nexport const trackPageView = async () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n await setPageView();\n\n worker?.postMessage({msg: 'junoTrackPageView'});\n};\n\nexport const trackEvent = async (data: TrackEvent) => {\n if (!isBrowser()) {\n return;\n }\n\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n const idb = await import('./idb.services');\n await idb.setTrackEvent(data);\n\n worker?.postMessage({msg: 'junoTrackEvent'});\n};\n\nexport const initWorkerEnvironment = (env: PostMessageInitEnvData) => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoInitEnvironment', data: env});\n};\n\nexport const startTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStartTrackTimer'});\n};\n\nexport const stopTracking = () => {\n assertNonNullish(worker, WORKER_UNDEFINED_MSG);\n\n worker?.postMessage({msg: 'junoStopTrackTimer'});\n};\n", "import {\n initTrackPageViews,\n initWorker,\n setPageView,\n startTracking,\n stopTracking\n} from './services/analytics.services';\nimport type {Environment} from './types/env';\n\nexport {trackEvent, trackPageView} from './services/analytics.services';\nexport * from './types/env';\n\nexport const initOrbiter = async (env: Environment): Promise<() => void> => {\n // Save first page as soon as possible\n await setPageView();\n\n initWorker(env);\n\n const {cleanup} = initTrackPageViews();\n\n // Starting tracking will instantly sync the first page and the data from previous sessions that have not been synced yet\n startTracking();\n\n return () => {\n stopTracking();\n cleanup();\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["promisifyRequest", "request", "resolve", "reject", "createStore", "dbName", "storeName", "dbp", "txMode", "callback", "db", "defaultGetStore", "defaultGetStoreFunc", "set", "key", "value", "customStore", "store", "delMany", "keys", "eachCursor", "entries", "values", "i", "items", "cursor", "init_dist", "__esmMin", "urlAlphabet", "init_url_alphabet", "__esmMin", "randomFillSync", "POOL_SIZE_MULTIPLIER", "pool", "poolOffset", "fillPool", "nanoid", "init_nanoid", "__esmMin", "init_url_alphabet", "bytes", "size", "id", "i", "urlAlphabet", "idb_services_exports", "__export", "delPageViews", "delTrackEvents", "getPageViews", "getTrackEvents", "setPageView", "setTrackEvent", "viewsStore", "eventsStore", "init_idb_services", "__esmMin", "init_dist", "init_nanoid", "createStore", "view", "set", "nanoid", "entries", "keys", "delMany", "track", "isNullish", "argument", "nonNullish", "NullishError", "assertNonNullish", "value", "message", "toNullable", "isBrowser", "worker", "initWorker", "env", "path", "workerUrl", "initWorkerEnvironment", "initTrackPageViews", "trackPages", "trackPageView", "pushStateProxy", "target", "thisArg", "argArray", "WORKER_UNDEFINED_MSG", "setPageView", "y", "title", "href", "referrer", "innerWidth", "innerHeight", "data", "T", "s", "f", "trackEvent", "startTracking", "stopTracking", "initOrbiter", "env", "setPageView", "initWorker", "cleanup", "initTrackPageViews", "startTracking", "stopTracking"]
7
7
  }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@junobuild/analytics",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Tracker for Juno analytics",
5
5
  "author": "David Dal Busco (https://daviddalbusco.com)",
6
6
  "license": "MIT",