@obelism/numbers-sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,7 @@ No bundler needed:
15
15
  defer
16
16
  src="https://numbers.obelism.studio/script.js"
17
17
  data-organization="org_…"
18
+ data-space="space_…"
18
19
  data-environment="production"
19
20
  ></script>
20
21
  ```
@@ -27,6 +28,8 @@ client on `window.numbers`:
27
28
  numbers.track('sign_up', 'footer_form')
28
29
  ```
29
30
 
31
+ `data-space` names the space (one site or project of the organization) the
32
+ events belong to; without it they go to the organization's first space.
30
33
  `data-endpoint="https://…"` sends somewhere else, e.g. a proxy on your own
31
34
  domain. npm CDNs serve the same file from
32
35
  `@obelism/numbers-sdk/dist/script.global.js`.
@@ -42,6 +45,7 @@ import { createNumbers } from '@obelism/numbers-sdk'
42
45
 
43
46
  const numbers = createNumbers({
44
47
  organizationId: 'org_…',
48
+ spaceId: 'space_…', // optional: without it, the organization's first space
45
49
  environment: 'production', // default; or 'develop', 'staging'
46
50
  // endpoint: 'https://numbers.obelism.studio/api/log',
47
51
  // disableWarnings: true,
package/dist/index.d.mts CHANGED
@@ -12,6 +12,11 @@ type Device = {
12
12
  };
13
13
  type NumbersOptions = {
14
14
  organizationId: string;
15
+ /**
16
+ * The space (`space_…`) the events belong to: one site or project of the
17
+ * organization. Without it, the organization's first space.
18
+ */
19
+ spaceId?: string | undefined;
15
20
  /** Default `production`. */
16
21
  environment?: Environment;
17
22
  /**
@@ -60,6 +65,7 @@ type Exposure = {
60
65
  type BeaconCommon<T extends 'event' | 'exposure'> = {
61
66
  type: T;
62
67
  organizationId: string;
68
+ spaceId?: string;
63
69
  environment: Environment;
64
70
  visitorId: string;
65
71
  pointer: string;
@@ -105,6 +111,7 @@ type AutoTrackOptions = {
105
111
  type Sent = Promise<Response | undefined>;
106
112
  type NumbersClient = {
107
113
  readonly organizationId: string;
114
+ readonly spaceId: string | undefined;
108
115
  readonly environment: Environment;
109
116
  /** The visitor, from the cookie or new. `null` outside the browser. */
110
117
  visitor: () => Visitor | null;
@@ -124,7 +131,7 @@ type NumbersClient = {
124
131
  /** Starts page views and click tracking; returns a function that stops them. */
125
132
  autoTrack: (options?: AutoTrackOptions) => () => void;
126
133
  };
127
- declare const createNumbers: ({ organizationId, environment, endpoint, device: givenDevice, disableWarnings, }: NumbersOptions) => NumbersClient;
134
+ declare const createNumbers: ({ organizationId, spaceId, environment, endpoint, device: givenDevice, disableWarnings, }: NumbersOptions) => NumbersClient;
128
135
 
129
136
  declare const DEFAULT_ENDPOINT = "https://numbers.obelism.studio/api/log";
130
137
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sources":["../src/types.ts","../src/visitor.ts","../src/client.ts","../src/constants.ts","../src/device.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK,MAAM;AACX;AACA;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA,KAAK,SAAS,GAAG,oBAAoB;AACrC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW,GAAG,YAAY,YAAY,WAAW;AACtD;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,KAAK,cAAc,GAAG,YAAY,eAAe,QAAQ;;ACtFzD,KAAK,OAAO;AACZ;AACA;AACA;AACA;;ACFA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ;AAC5B,KAAK,aAAa;AAClB;AACA,0BAA0B,WAAW;AACrC;AACA,mBAAmB,OAAO;AAC1B;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS,4BAA4B,YAAY,KAAK,IAAI;AAC7E;AACA,oBAAoB,IAAI;AACxB;AACA,uBAAuB,QAAQ,KAAK,IAAI;AACxC;AACA,0BAA0B,gBAAgB;AAC1C;AACA,cAAc,aAAa,qFAAqF,cAAc,KAAK,aAAa;;AClChJ,cAAc,gBAAgB;;ACC9B,cAAc,YAAY,yBAAyB,MAAM;;","names":[]}
1
+ {"version":3,"file":"index.d.mts","sources":["../src/types.ts","../src/visitor.ts","../src/client.ts","../src/constants.ts","../src/device.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK,MAAM;AACX;AACA;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA,KAAK,SAAS,GAAG,oBAAoB;AACrC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW,GAAG,YAAY,YAAY,WAAW;AACtD;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,KAAK,cAAc,GAAG,YAAY,eAAe,QAAQ;;AC5FzD,KAAK,OAAO;AACZ;AACA;AACA;AACA;;ACFA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ;AAC5B,KAAK,aAAa;AAClB;AACA;AACA,0BAA0B,WAAW;AACrC;AACA,mBAAmB,OAAO;AAC1B;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS,4BAA4B,YAAY,KAAK,IAAI;AAC7E;AACA,oBAAoB,IAAI;AACxB;AACA,uBAAuB,QAAQ,KAAK,IAAI;AACxC;AACA,0BAA0B,gBAAgB;AAC1C;AACA,cAAc,aAAa,8FAA8F,cAAc,KAAK,aAAa;;ACnCzJ,cAAc,gBAAgB;;ACC9B,cAAc,YAAY,yBAAyB,MAAM;;","names":[]}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,11 @@ type Device = {
12
12
  };
13
13
  type NumbersOptions = {
14
14
  organizationId: string;
15
+ /**
16
+ * The space (`space_…`) the events belong to: one site or project of the
17
+ * organization. Without it, the organization's first space.
18
+ */
19
+ spaceId?: string | undefined;
15
20
  /** Default `production`. */
16
21
  environment?: Environment;
17
22
  /**
@@ -60,6 +65,7 @@ type Exposure = {
60
65
  type BeaconCommon<T extends 'event' | 'exposure'> = {
61
66
  type: T;
62
67
  organizationId: string;
68
+ spaceId?: string;
63
69
  environment: Environment;
64
70
  visitorId: string;
65
71
  pointer: string;
@@ -105,6 +111,7 @@ type AutoTrackOptions = {
105
111
  type Sent = Promise<Response | undefined>;
106
112
  type NumbersClient = {
107
113
  readonly organizationId: string;
114
+ readonly spaceId: string | undefined;
108
115
  readonly environment: Environment;
109
116
  /** The visitor, from the cookie or new. `null` outside the browser. */
110
117
  visitor: () => Visitor | null;
@@ -124,7 +131,7 @@ type NumbersClient = {
124
131
  /** Starts page views and click tracking; returns a function that stops them. */
125
132
  autoTrack: (options?: AutoTrackOptions) => () => void;
126
133
  };
127
- declare const createNumbers: ({ organizationId, environment, endpoint, device: givenDevice, disableWarnings, }: NumbersOptions) => NumbersClient;
134
+ declare const createNumbers: ({ organizationId, spaceId, environment, endpoint, device: givenDevice, disableWarnings, }: NumbersOptions) => NumbersClient;
128
135
 
129
136
  declare const DEFAULT_ENDPOINT = "https://numbers.obelism.studio/api/log";
130
137
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../src/types.ts","../src/visitor.ts","../src/client.ts","../src/constants.ts","../src/device.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK,MAAM;AACX;AACA;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA,KAAK,SAAS,GAAG,oBAAoB;AACrC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW,GAAG,YAAY,YAAY,WAAW;AACtD;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,KAAK,cAAc,GAAG,YAAY,eAAe,QAAQ;;ACtFzD,KAAK,OAAO;AACZ;AACA;AACA;AACA;;ACFA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ;AAC5B,KAAK,aAAa;AAClB;AACA,0BAA0B,WAAW;AACrC;AACA,mBAAmB,OAAO;AAC1B;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS,4BAA4B,YAAY,KAAK,IAAI;AAC7E;AACA,oBAAoB,IAAI;AACxB;AACA,uBAAuB,QAAQ,KAAK,IAAI;AACxC;AACA,0BAA0B,gBAAgB;AAC1C;AACA,cAAc,aAAa,qFAAqF,cAAc,KAAK,aAAa;;AClChJ,cAAc,gBAAgB;;ACC9B,cAAc,YAAY,yBAAyB,MAAM;;","names":[]}
1
+ {"version":3,"file":"index.d.ts","sources":["../src/types.ts","../src/visitor.ts","../src/client.ts","../src/constants.ts","../src/device.ts"],"mappings":"AAAA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK,MAAM;AACX;AACA;AACA;AACA;AACA;AACA,KAAK,cAAc;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA,KAAK,SAAS,GAAG,oBAAoB;AACrC,KAAK,YAAY;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,QAAQ;AACb;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY;AACjB;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW,GAAG,YAAY,YAAY,WAAW;AACtD;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,KAAK,cAAc,GAAG,YAAY,eAAe,QAAQ;;AC5FzD,KAAK,OAAO;AACZ;AACA;AACA;AACA;;ACFA,KAAK,gBAAgB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ;AAC5B,KAAK,aAAa;AAClB;AACA;AACA,0BAA0B,WAAW;AACrC;AACA,mBAAmB,OAAO;AAC1B;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS,4BAA4B,YAAY,KAAK,IAAI;AAC7E;AACA,oBAAoB,IAAI;AACxB;AACA,uBAAuB,QAAQ,KAAK,IAAI;AACxC;AACA,0BAA0B,gBAAgB;AAC1C;AACA,cAAc,aAAa,8FAA8F,cAAc,KAAK,aAAa;;ACnCzJ,cAAc,gBAAgB;;ACC9B,cAAc,YAAY,yBAAyB,MAAM;;","names":[]}
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ const parseRetryAfterMs = (header)=>{
112
112
  return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());
113
113
  };
114
114
  const isBrowser = ()=>typeof window !== 'undefined' && typeof document !== 'undefined';
115
- const createNumbers = ({ organizationId, environment = 'production', endpoint = DEFAULT_ENDPOINT, device: givenDevice, disableWarnings = false })=>{
115
+ const createNumbers = ({ organizationId, spaceId, environment = 'production', endpoint = DEFAULT_ENDPOINT, device: givenDevice, disableWarnings = false })=>{
116
116
  let visitor = null;
117
117
  let device = givenDevice;
118
118
  let url = endpoint;
@@ -137,6 +137,9 @@ const createNumbers = ({ organizationId, environment = 'production', endpoint =
137
137
  return {
138
138
  type,
139
139
  organizationId,
140
+ ...spaceId && {
141
+ spaceId
142
+ },
140
143
  environment,
141
144
  visitorId: current.id,
142
145
  pointer: device.pointer,
@@ -258,6 +261,7 @@ const createNumbers = ({ organizationId, environment = 'production', endpoint =
258
261
  };
259
262
  return {
260
263
  organizationId,
264
+ spaceId,
261
265
  environment,
262
266
  visitor: getVisitor,
263
267
  setDevice: (next)=>{
package/dist/index.mjs CHANGED
@@ -110,7 +110,7 @@ const parseRetryAfterMs = (header)=>{
110
110
  return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());
111
111
  };
112
112
  const isBrowser = ()=>typeof window !== 'undefined' && typeof document !== 'undefined';
113
- const createNumbers = ({ organizationId, environment = 'production', endpoint = DEFAULT_ENDPOINT, device: givenDevice, disableWarnings = false })=>{
113
+ const createNumbers = ({ organizationId, spaceId, environment = 'production', endpoint = DEFAULT_ENDPOINT, device: givenDevice, disableWarnings = false })=>{
114
114
  let visitor = null;
115
115
  let device = givenDevice;
116
116
  let url = endpoint;
@@ -135,6 +135,9 @@ const createNumbers = ({ organizationId, environment = 'production', endpoint =
135
135
  return {
136
136
  type,
137
137
  organizationId,
138
+ ...spaceId && {
139
+ spaceId
140
+ },
138
141
  environment,
139
142
  visitorId: current.id,
140
143
  pointer: device.pointer,
@@ -256,6 +259,7 @@ const createNumbers = ({ organizationId, environment = 'production', endpoint =
256
259
  };
257
260
  return {
258
261
  organizationId,
262
+ spaceId,
259
263
  environment,
260
264
  visitor: getVisitor,
261
265
  setDevice: (next)=>{
@@ -1 +1 @@
1
- !/*! Obelism numbers (@obelism/numbers-sdk), MIT. https://numbers.obelism.studio */function(){"use strict";let e="https://numbers.obelism.studio/api/log",t="visitorId",r="visi",n=(e,t)=>e.get(t)?.slice(0,256)||void 0,i="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",o=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,a=()=>"u">typeof window&&"u">typeof document;((s,l)=>{if(!l||s.numbers)return;let u=l.dataset.organization;if(!u)return;let c=(({organizationId:s,environment:l="production",endpoint:u=e,device:c,disableWarnings:d=!1})=>{let p=null,m=c,h=u,f=0,w=!0,b=new Set,g=new Set,v=new Set,y=(e,t)=>{!(d||v.has(e))&&(v.add(e),"u">typeof console&&console.warn(`[numbers] ${t}`))},$=()=>a()?(p??(p=(()=>{let e,n,o,a=(e=document.cookie.split("; ").find(e=>e.split("=")[0]===t))?e.split("=")[1]??"":"",s=2===(n=a.split("_")).length&&n[0]===r&&26===n[1].length,l=s?a:(()=>{let e=new Uint8Array(26);crypto.getRandomValues(e);let t="";for(let r of e)t+=i[r%i.length];return`${r}_${t}`})();return o=new Date(Date.now()+2592e6),document.cookie=`${t}=${l};path=/;expires=${o.toUTCString()};SameSite=Lax`+("https:"===location.protocol?";Secure":""),{id:l,recurring:s}})()),p):null,S=(e,t)=>{let r,n,i;return m??(r=navigator.userAgent.toLowerCase(),n=/ipad|tablet|android(?!.*mobile)/.test(r)?"tablet":/mobi|iphone|ipod|android/.test(r)?"mobile":"desktop",m={pointer:"desktop"===n?"fine":"coarse",device:n,browser:/edg\//.test(r)?"edge":/samsungbrowser/.test(r)?"samsung internet":/instagram|fban|fbav|tiktok|snapchat|wechat|line\//.test(r)?"social":/firefox|fxios/.test(r)?"firefox":/chrome|crios|chromium/.test(r)?"chrome":/safari/.test(r)?"safari":"other",os:/iphone|ipad|ipod/.test(r)?"ios":/android/.test(r)?"android":/windows/.test(r)?"windows":/mac os/.test(r)?"mac os":"unix"}),{type:e,organizationId:s,environment:l,visitorId:t.id,pointer:m.pointer,device:m.device,screen:(i=window.innerWidth)<=768?"small":i<=1024?"medium":i<=1200?"large":"huge",browser:m.browser,os:m.os,visitor:t.recurring?"recurring":"new"}},k=(e,t)=>{let r=JSON.stringify(e);return"u">typeof TextEncoder&&new TextEncoder().encode(r).length>8192&&y(`size:${t}`,`"${t}" is over 8192 bytes and will be refused: trim its \`params\`.`),fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:r,keepalive:!0}).then(e=>(429===e.status&&(f=Date.now()+((e=>{if(!e)return;let t=Number(e);if(Number.isFinite(t))return Math.max(0,1e3*t);let r=Date.parse(e);return Number.isNaN(r)?void 0:Math.max(0,r-Date.now())})(e.headers.get("Retry-After"))??6e4)),e),()=>void 0)},x=(e,t,r,i)=>{let o,a,s,l,u,c=$();if(!c||Date.now()<f)return null;let{value:d,currency:p,params:m,dedupeKey:h}=r;if(void 0!==h){let t=`${e}:${h}`;if(b.has(t))return null;b.add(t)}let w={...S("event",c),...(o=new URLSearchParams(location.search),a={path:location.pathname.slice(0,1024)},s=n(o,"utm_source"),l=n(o,"utm_medium"),u=n(o,"utm_campaign"),s&&(a.utmSource=s),l&&(a.utmMedium=l),u&&(a.utmCampaign=u),a),event:e.slice(0,256),scope:t.slice(0,256)};return i&&(w.referrer=i),"number"==typeof d&&Number.isFinite(d)&&(w.value=d),p&&(w.currency=p.slice(0,8)),m&&"object"==typeof m&&!Array.isArray(m)&&(w.params=m),k(w,e)},_=(e,t,r={})=>a()?(o.test(e)||y(`name:${e}`,`"${e}" isn't snake_case. Prefer GA4-style names like "add_to_cart" or "sign_up"; \`disableWarnings: true\` silences this.`),x(e,t||location.pathname,r)):null,L=()=>{if(!a())return null;let e=w?(()=>{if(document.referrer)try{let e=new URL(document.referrer);if(e.host===location.host)return;return`${e.origin}${e.pathname}`.slice(0,1024)}catch{return}})():void 0;return w=!1,x("page_view",location.pathname,{},e)};return{organizationId:s,environment:l,visitor:$,setDevice:e=>{m=e},setEndpoint:e=>{h=e},track:_,pageView:L,expose:e=>{let t=$();if(!t||Date.now()<f)return null;let r=`${e.subjectKind}:${e.subjectId}`;return g.has(r)?null:(g.add(r),k({...S("exposure",t),...e},r))},autoTrack:({pageViews:e=!0,clicks:t=!0}={})=>{if(!a())return()=>{};let r=[];if(e){let e=null,t=()=>{location.pathname!==e&&(e=location.pathname,L())},n=e=>{let n=history[e],i=function(...e){let r=n.apply(this,e);return t(),r};history[e]=i,r.push(()=>{history[e]===i&&(history[e]=n)})};n("pushState"),n("replaceState"),window.addEventListener("popstate",t),r.push(()=>window.removeEventListener("popstate",t)),t()}if(t){let e=e=>{let t=e.target,r=t?.closest?.("[data-numbers-id]")?.getAttribute("data-numbers-id");r&&_("click",r)};document.addEventListener("click",e,!0),r.push(()=>document.removeEventListener("click",e,!0))}return()=>{for(let e of r)e()}}}})({organizationId:u,environment:l.dataset.environment||"production",endpoint:l.dataset.endpoint||new URL("/api/log",l.src||location.href).href,disableWarnings:!0});return s.numbers=c,c.autoTrack()})(window,document.currentScript)}();
1
+ !/*! Obelism numbers (@obelism/numbers-sdk), MIT. https://numbers.obelism.studio */function(){"use strict";let e="https://numbers.obelism.studio/api/log",t="visitorId",r="visi",n=(e,t)=>e.get(t)?.slice(0,256)||void 0,i="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",o=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,a=()=>"u">typeof window&&"u">typeof document;((s,l)=>{if(!l||s.numbers)return;let u=l.dataset.organization;if(!u)return;let d=(({organizationId:s,spaceId:l,environment:u="production",endpoint:d=e,device:c,disableWarnings:p=!1})=>{let m=null,h=c,f=d,w=0,b=!0,g=new Set,v=new Set,y=new Set,$=(e,t)=>{!(p||y.has(e))&&(y.add(e),"u">typeof console&&console.warn(`[numbers] ${t}`))},S=()=>a()?(m??(m=(()=>{let e,n,o,a=(e=document.cookie.split("; ").find(e=>e.split("=")[0]===t))?e.split("=")[1]??"":"",s=2===(n=a.split("_")).length&&n[0]===r&&26===n[1].length,l=s?a:(()=>{let e=new Uint8Array(26);crypto.getRandomValues(e);let t="";for(let r of e)t+=i[r%i.length];return`${r}_${t}`})();return o=new Date(Date.now()+2592e6),document.cookie=`${t}=${l};path=/;expires=${o.toUTCString()};SameSite=Lax`+("https:"===location.protocol?";Secure":""),{id:l,recurring:s}})()),m):null,k=(e,t)=>{let r,n,i;return h??(r=navigator.userAgent.toLowerCase(),n=/ipad|tablet|android(?!.*mobile)/.test(r)?"tablet":/mobi|iphone|ipod|android/.test(r)?"mobile":"desktop",h={pointer:"desktop"===n?"fine":"coarse",device:n,browser:/edg\//.test(r)?"edge":/samsungbrowser/.test(r)?"samsung internet":/instagram|fban|fbav|tiktok|snapchat|wechat|line\//.test(r)?"social":/firefox|fxios/.test(r)?"firefox":/chrome|crios|chromium/.test(r)?"chrome":/safari/.test(r)?"safari":"other",os:/iphone|ipad|ipod/.test(r)?"ios":/android/.test(r)?"android":/windows/.test(r)?"windows":/mac os/.test(r)?"mac os":"unix"}),{type:e,organizationId:s,...l&&{spaceId:l},environment:u,visitorId:t.id,pointer:h.pointer,device:h.device,screen:(i=window.innerWidth)<=768?"small":i<=1024?"medium":i<=1200?"large":"huge",browser:h.browser,os:h.os,visitor:t.recurring?"recurring":"new"}},x=(e,t)=>{let r=JSON.stringify(e);return"u">typeof TextEncoder&&new TextEncoder().encode(r).length>8192&&$(`size:${t}`,`"${t}" is over 8192 bytes and will be refused: trim its \`params\`.`),fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:r,keepalive:!0}).then(e=>(429===e.status&&(w=Date.now()+((e=>{if(!e)return;let t=Number(e);if(Number.isFinite(t))return Math.max(0,1e3*t);let r=Date.parse(e);return Number.isNaN(r)?void 0:Math.max(0,r-Date.now())})(e.headers.get("Retry-After"))??6e4)),e),()=>void 0)},_=(e,t,r,i)=>{let o,a,s,l,u,d=S();if(!d||Date.now()<w)return null;let{value:c,currency:p,params:m,dedupeKey:h}=r;if(void 0!==h){let t=`${e}:${h}`;if(g.has(t))return null;g.add(t)}let f={...k("event",d),...(o=new URLSearchParams(location.search),a={path:location.pathname.slice(0,1024)},s=n(o,"utm_source"),l=n(o,"utm_medium"),u=n(o,"utm_campaign"),s&&(a.utmSource=s),l&&(a.utmMedium=l),u&&(a.utmCampaign=u),a),event:e.slice(0,256),scope:t.slice(0,256)};return i&&(f.referrer=i),"number"==typeof c&&Number.isFinite(c)&&(f.value=c),p&&(f.currency=p.slice(0,8)),m&&"object"==typeof m&&!Array.isArray(m)&&(f.params=m),x(f,e)},L=(e,t,r={})=>a()?(o.test(e)||$(`name:${e}`,`"${e}" isn't snake_case. Prefer GA4-style names like "add_to_cart" or "sign_up"; \`disableWarnings: true\` silences this.`),_(e,t||location.pathname,r)):null,D=()=>{if(!a())return null;let e=b?(()=>{if(document.referrer)try{let e=new URL(document.referrer);if(e.host===location.host)return;return`${e.origin}${e.pathname}`.slice(0,1024)}catch{return}})():void 0;return b=!1,_("page_view",location.pathname,{},e)};return{organizationId:s,spaceId:l,environment:u,visitor:S,setDevice:e=>{h=e},setEndpoint:e=>{f=e},track:L,pageView:D,expose:e=>{let t=S();if(!t||Date.now()<w)return null;let r=`${e.subjectKind}:${e.subjectId}`;return v.has(r)?null:(v.add(r),x({...k("exposure",t),...e},r))},autoTrack:({pageViews:e=!0,clicks:t=!0}={})=>{if(!a())return()=>{};let r=[];if(e){let e=null,t=()=>{location.pathname!==e&&(e=location.pathname,D())},n=e=>{let n=history[e],i=function(...e){let r=n.apply(this,e);return t(),r};history[e]=i,r.push(()=>{history[e]===i&&(history[e]=n)})};n("pushState"),n("replaceState"),window.addEventListener("popstate",t),r.push(()=>window.removeEventListener("popstate",t)),t()}if(t){let e=e=>{let t=e.target,r=t?.closest?.("[data-numbers-id]")?.getAttribute("data-numbers-id");r&&L("click",r)};document.addEventListener("click",e,!0),r.push(()=>document.removeEventListener("click",e,!0))}return()=>{for(let e of r)e()}}}})({organizationId:u,spaceId:l.dataset.space||void 0,environment:l.dataset.environment||"production",endpoint:l.dataset.endpoint||new URL("/api/log",l.src||location.href).href,disableWarnings:!0});return s.numbers=d,d.autoTrack()})(window,document.currentScript)}();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@obelism/numbers-sdk",
3
3
  "description": "Obelism numbers SDK: page views, events and clicks on tagged elements, sent to numbers.obelism.studio",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "keywords": [
6
6
  "analytics",
7
7
  "events",