@schematichq/schematic-js 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023-2025 Schematic, Inc.
3
+ Copyright (c) 2023-2026 Schematic, Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,3 +1,3 @@
1
- "use strict";(()=>{var we=Object.create;var ne=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Ue=Object.getPrototypeOf,Ge=Object.prototype.hasOwnProperty;var ve=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Le=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ve(e))!Ge.call(n,r)&&r!==t&&ne(n,r,{get:()=>e[r],enumerable:!(i=Ie(e,r))||i.enumerable});return n};var Me=(n,e,t)=>(t=n!=null?we(Ue(n)):{},Le(e||!n||!n.__esModule?ne(t,"default",{value:n,enumerable:!0}):t,n));var ae=ve(re=>{(function(n){var e=(function(t){var i=typeof globalThis<"u"&&globalThis||typeof n<"u"&&n||typeof global<"u"&&global||{},r={searchParams:"URLSearchParams"in i,iterable:"Symbol"in i&&"iterator"in Symbol,blob:"FileReader"in i&&"Blob"in i&&(function(){try{return new Blob,!0}catch{return!1}})(),formData:"FormData"in i,arrayBuffer:"ArrayBuffer"in i};function s(a){return a&&DataView.prototype.isPrototypeOf(a)}if(r.arrayBuffer)var l=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],p=ArrayBuffer.isView||function(a){return a&&l.indexOf(Object.prototype.toString.call(a))>-1};function u(a){if(typeof a!="string"&&(a=String(a)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(a)||a==="")throw new TypeError('Invalid character in header field name: "'+a+'"');return a.toLowerCase()}function f(a){return typeof a!="string"&&(a=String(a)),a}function D(a){var o={next:function(){var d=a.shift();return{done:d===void 0,value:d}}};return r.iterable&&(o[Symbol.iterator]=function(){return o}),o}function y(a){this.map={},a instanceof y?a.forEach(function(o,d){this.append(d,o)},this):Array.isArray(a)?a.forEach(function(o){if(o.length!=2)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+o.length);this.append(o[0],o[1])},this):a&&Object.getOwnPropertyNames(a).forEach(function(o){this.append(o,a[o])},this)}y.prototype.append=function(a,o){a=u(a),o=f(o);var d=this.map[a];this.map[a]=d?d+", "+o:o},y.prototype.delete=function(a){delete this.map[u(a)]},y.prototype.get=function(a){return a=u(a),this.has(a)?this.map[a]:null},y.prototype.has=function(a){return this.map.hasOwnProperty(u(a))},y.prototype.set=function(a,o){this.map[u(a)]=f(o)},y.prototype.forEach=function(a,o){for(var d in this.map)this.map.hasOwnProperty(d)&&a.call(o,this.map[d],d,this)},y.prototype.keys=function(){var a=[];return this.forEach(function(o,d){a.push(d)}),D(a)},y.prototype.values=function(){var a=[];return this.forEach(function(o){a.push(o)}),D(a)},y.prototype.entries=function(){var a=[];return this.forEach(function(o,d){a.push([d,o])}),D(a)},r.iterable&&(y.prototype[Symbol.iterator]=y.prototype.entries);function S(a){if(!a._noBody){if(a.bodyUsed)return Promise.reject(new TypeError("Already read"));a.bodyUsed=!0}}function x(a){return new Promise(function(o,d){a.onload=function(){o(a.result)},a.onerror=function(){d(a.error)}})}function N(a){var o=new FileReader,d=x(o);return o.readAsArrayBuffer(a),d}function Y(a){var o=new FileReader,d=x(o),m=/charset=([A-Za-z0-9_-]+)/.exec(a.type),g=m?m[1]:"utf-8";return o.readAsText(a,g),d}function Ne(a){for(var o=new Uint8Array(a),d=new Array(o.length),m=0;m<o.length;m++)d[m]=String.fromCharCode(o[m]);return d.join("")}function j(a){if(a.slice)return a.slice(0);var o=new Uint8Array(a.byteLength);return o.set(new Uint8Array(a)),o.buffer}function ee(){return this.bodyUsed=!1,this._initBody=function(a){this.bodyUsed=this.bodyUsed,this._bodyInit=a,a?typeof a=="string"?this._bodyText=a:r.blob&&Blob.prototype.isPrototypeOf(a)?this._bodyBlob=a:r.formData&&FormData.prototype.isPrototypeOf(a)?this._bodyFormData=a:r.searchParams&&URLSearchParams.prototype.isPrototypeOf(a)?this._bodyText=a.toString():r.arrayBuffer&&r.blob&&s(a)?(this._bodyArrayBuffer=j(a.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):r.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(a)||p(a))?this._bodyArrayBuffer=j(a):this._bodyText=a=Object.prototype.toString.call(a):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||(typeof a=="string"?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r.searchParams&&URLSearchParams.prototype.isPrototypeOf(a)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},r.blob&&(this.blob=function(){var a=S(this);if(a)return a;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var a=S(this);return a||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}else{if(r.blob)return this.blob().then(N);throw new Error("could not read as ArrayBuffer")}},this.text=function(){var a=S(this);if(a)return a;if(this._bodyBlob)return Y(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(Ne(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},r.formData&&(this.formData=function(){return this.text().then(Je)}),this.json=function(){return this.text().then(JSON.parse)},this}var Fe=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function Ee(a){var o=a.toUpperCase();return Fe.indexOf(o)>-1?o:a}function P(a,o){if(!(this instanceof P))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');o=o||{};var d=o.body;if(a instanceof P){if(a.bodyUsed)throw new TypeError("Already read");this.url=a.url,this.credentials=a.credentials,o.headers||(this.headers=new y(a.headers)),this.method=a.method,this.mode=a.mode,this.signal=a.signal,!d&&a._bodyInit!=null&&(d=a._bodyInit,a.bodyUsed=!0)}else this.url=String(a);if(this.credentials=o.credentials||this.credentials||"same-origin",(o.headers||!this.headers)&&(this.headers=new y(o.headers)),this.method=Ee(o.method||this.method||"GET"),this.mode=o.mode||this.mode||null,this.signal=o.signal||this.signal||(function(){if("AbortController"in i){var c=new AbortController;return c.signal}})(),this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&d)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(d),(this.method==="GET"||this.method==="HEAD")&&(o.cache==="no-store"||o.cache==="no-cache")){var m=/([?&])_=[^&]*/;if(m.test(this.url))this.url=this.url.replace(m,"$1_="+new Date().getTime());else{var g=/\?/;this.url+=(g.test(this.url)?"&":"?")+"_="+new Date().getTime()}}}P.prototype.clone=function(){return new P(this,{body:this._bodyInit})};function Je(a){var o=new FormData;return a.trim().split("&").forEach(function(d){if(d){var m=d.split("="),g=m.shift().replace(/\+/g," "),c=m.join("=").replace(/\+/g," ");o.append(decodeURIComponent(g),decodeURIComponent(c))}}),o}function ke(a){var o=new y,d=a.replace(/\r?\n[\t ]+/g," ");return d.split("\r").map(function(m){return m.indexOf(`
2
- `)===0?m.substr(1,m.length):m}).forEach(function(m){var g=m.split(":"),c=g.shift().trim();if(c){var F=g.join(":").trim();try{o.append(c,F)}catch(v){console.warn("Response "+v.message)}}}),o}ee.call(P.prototype);function R(a,o){if(!(this instanceof R))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(o||(o={}),this.type="default",this.status=o.status===void 0?200:o.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=o.statusText===void 0?"":""+o.statusText,this.headers=new y(o.headers),this.url=o.url||"",this._initBody(a)}ee.call(R.prototype),R.prototype.clone=function(){return new R(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new y(this.headers),url:this.url})},R.error=function(){var a=new R(null,{status:200,statusText:""});return a.ok=!1,a.status=0,a.type="error",a};var Ae=[301,302,303,307,308];R.redirect=function(a,o){if(Ae.indexOf(o)===-1)throw new RangeError("Invalid status code");return new R(null,{status:o,headers:{location:a}})},t.DOMException=i.DOMException;try{new t.DOMException}catch{t.DOMException=function(o,d){this.message=o,this.name=d;var m=Error(o);this.stack=m.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function G(a,o){return new Promise(function(d,m){var g=new P(a,o);if(g.signal&&g.signal.aborted)return m(new t.DOMException("Aborted","AbortError"));var c=new XMLHttpRequest;function F(){c.abort()}c.onload=function(){var T={statusText:c.statusText,headers:ke(c.getAllResponseHeaders()||"")};g.url.indexOf("file://")===0&&(c.status<200||c.status>599)?T.status=200:T.status=c.status,T.url="responseURL"in c?c.responseURL:T.headers.get("X-Request-URL");var b="response"in c?c.response:c.responseText;setTimeout(function(){d(new R(b,T))},0)},c.onerror=function(){setTimeout(function(){m(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){m(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){m(new t.DOMException("Aborted","AbortError"))},0)};function v(T){try{return T===""&&i.location.href?i.location.href:T}catch{return T}}if(c.open(g.method,v(g.url),!0),g.credentials==="include"?c.withCredentials=!0:g.credentials==="omit"&&(c.withCredentials=!1),"responseType"in c&&(r.blob?c.responseType="blob":r.arrayBuffer&&(c.responseType="arraybuffer")),o&&typeof o.headers=="object"&&!(o.headers instanceof y||i.Headers&&o.headers instanceof i.Headers)){var te=[];Object.getOwnPropertyNames(o.headers).forEach(function(T){te.push(u(T)),c.setRequestHeader(T,f(o.headers[T]))}),g.headers.forEach(function(T,b){te.indexOf(b)===-1&&c.setRequestHeader(b,T)})}else g.headers.forEach(function(T,b){c.setRequestHeader(b,T)});g.signal&&(g.signal.addEventListener("abort",F),c.onreadystatechange=function(){c.readyState===4&&g.signal.removeEventListener("abort",F)}),c.send(typeof g._bodyInit>"u"?null:g._bodyInit)})}return G.polyfill=!0,i.fetch||(i.fetch=G,i.Headers=y,i.Request=P,i.Response=R),t.Headers=y,t.Request=P,t.Response=R,t.fetch=G,t})({})})(typeof self<"u"?self:re)});var h=[];for(let n=0;n<256;++n)h.push((n+256).toString(16).slice(1));function ie(n,e=0){return(h[n[e+0]]+h[n[e+1]]+h[n[e+2]]+h[n[e+3]]+"-"+h[n[e+4]]+h[n[e+5]]+"-"+h[n[e+6]]+h[n[e+7]]+"-"+h[n[e+8]]+h[n[e+9]]+"-"+h[n[e+10]]+h[n[e+11]]+h[n[e+12]]+h[n[e+13]]+h[n[e+14]]+h[n[e+15]]).toLowerCase()}var L,qe=new Uint8Array(16);function M(){if(!L){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");L=crypto.getRandomValues.bind(crypto)}return L(qe)}var We=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),q={randomUUID:We};function $e(n,e,t){n=n||{};let i=n.random??n.rng?.()??M();if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){if(t=t||0,t<0||t+16>e.length)throw new RangeError(`UUID byte range ${t}:${t+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[t+r]=i[r];return e}return ie(i)}function ze(n,e,t){return q.randomUUID&&!e&&!n?q.randomUUID():$e(n,e,t)}var O=ze;var oy=Me(ae());function z(n){return mt(n,!1)}function mt(n,e){return n}function ue(n){return Tt(n,!1)}function Tt(n,e){return n==null?n:{allocation:n.allocation==null?void 0:n.allocation,creditId:n.credit_id==null?void 0:n.credit_id,creditRemaining:n.credit_remaining==null?void 0:n.credit_remaining,creditTotal:n.credit_total==null?void 0:n.credit_total,creditUsed:n.credit_used==null?void 0:n.credit_used,eventName:n.event_name==null?void 0:n.event_name,featureId:n.feature_id,featureKey:n.feature_key,metricPeriod:n.metric_period==null?void 0:n.metric_period,metricResetAt:n.metric_reset_at==null?void 0:new Date(n.metric_reset_at),monthReset:n.month_reset==null?void 0:n.month_reset,softLimit:n.soft_limit==null?void 0:n.soft_limit,usage:n.usage==null?void 0:n.usage,valueType:z(n.value_type)}}function C(n){return ht(n,!1)}function ht(n,e){return n==null?n:{companyId:n.company_id==null?void 0:n.company_id,entitlement:n.entitlement==null?void 0:ue(n.entitlement),error:n.error==null?void 0:n.error,featureAllocation:n.feature_allocation==null?void 0:n.feature_allocation,featureUsage:n.feature_usage==null?void 0:n.feature_usage,featureUsageEvent:n.feature_usage_event==null?void 0:n.feature_usage_event,featureUsagePeriod:n.feature_usage_period==null?void 0:n.feature_usage_period,featureUsageResetAt:n.feature_usage_reset_at==null?void 0:new Date(n.feature_usage_reset_at),flag:n.flag,flagId:n.flag_id==null?void 0:n.flag_id,reason:n.reason,ruleId:n.rule_id==null?void 0:n.rule_id,ruleType:n.rule_type==null?void 0:n.rule_type,userId:n.user_id==null?void 0:n.user_id,value:n.value}}function H(n){return St(n,!1)}function St(n,e){return n==null?n:{data:C(n.data),params:n.params}}function B(n){return _t(n,!1)}function _t(n,e){return n==null?n:{id:n.id,name:n.name,trialEndDate:n.trial_end_date==null?void 0:new Date(n.trial_end_date)}}function Q(n){return Rt(n,!1)}function Rt(n,e){return n==null?n:{flags:n.flags.map(C),plan:n.plan==null?void 0:B(n.plan)}}function K(n){return bt(n,!1)}function bt(n,e){return n==null?n:{data:Q(n.data),params:n.params}}function w(n){return Ot(n,!1)}function Ot(n,e=!1){return n==null?n:{company_id:n.companyId,error:n.error,flag_id:n.flagId,flag_key:n.flagKey,reason:n.reason,req_company:n.reqCompany,req_user:n.reqUser,rule_id:n.ruleId,user_id:n.userId,value:n.value}}var X=n=>{let{companyId:e,error:t,featureAllocation:i,featureUsage:r,featureUsageEvent:s,featureUsagePeriod:l,featureUsageResetAt:p,flag:u,flagId:f,reason:D,ruleId:y,ruleType:S,userId:x,value:N}=C(n);return{featureUsageExceeded:!N&&(S=="company_override_usage_exceeded"||S=="plan_entitlement_usage_exceeded"),companyId:e??void 0,error:t??void 0,featureAllocation:i??void 0,featureUsage:r??void 0,featureUsageEvent:s===null?void 0:s,featureUsagePeriod:l??void 0,featureUsageResetAt:p??void 0,flag:u,flagId:f??void 0,reason:D,ruleId:y??void 0,ruleType:S??void 0,userId:x??void 0,value:N}},xe=n=>{let{id:e,name:t,trialEndDate:i}=B(n);return{id:e,name:t,trialEndDate:i??void 0}};function _(n){let e=Object.keys(n).reduce((t,i)=>{let s=Object.keys(n[i]||{}).sort().reduce((l,p)=>(l[p]=n[i][p],l),{});return t[i]=s,t},{});return JSON.stringify(e)}var Z="1.3.0";var Be="schematicId";var U=class{additionalHeaders={};apiKey;apiUrl="https://api.schematichq.com";conn=null;context={};debugEnabled=!1;offlineEnabled=!1;eventQueue;contextDependentEventQueue;eventUrl="https://c.schematichq.com";flagCheckListeners={};flagValueListeners={};isPending=!0;isPendingListeners=new Set;planListeners=new Set;storage;useWebSocket=!1;checks={};featureUsageEventMap={};planChecks={};webSocketUrl="wss://api.schematichq.com";webSocketConnectionTimeout=1e4;webSocketReconnect=!0;webSocketMaxReconnectAttempts=7;webSocketMaxConnectionAttempts=3;webSocketInitialRetryDelay=1e3;webSocketMaxRetryDelay=3e4;wsReconnectAttempts=0;wsReconnectTimer=null;wsIntentionalDisconnect=!1;currentWebSocket=null;isConnecting=!1;maxEventQueueSize=100;maxEventRetries=5;eventRetryInitialDelay=1e3;eventRetryMaxDelay=3e4;retryTimer=null;flagValueDefaults={};flagCheckDefaults={};fallbackCheckCache={};constructor(e,t){if(this.apiKey=e,this.eventQueue=[],this.contextDependentEventQueue=[],this.useWebSocket=t?.useWebSocket??!1,this.debugEnabled=t?.debug??!1,this.offlineEnabled=t?.offline??!1,typeof window<"u"&&typeof window.location<"u"){let i=new URLSearchParams(window.location.search),r=i.get("schematic_debug");r!==null&&(r===""||r==="true"||r==="1")&&(this.debugEnabled=!0);let s=i.get("schematic_offline");s!==null&&(s===""||s==="true"||s==="1")&&(this.offlineEnabled=!0,this.debugEnabled=!0)}if(this.offlineEnabled&&t?.debug!==!1&&(this.debugEnabled=!0),this.offlineEnabled&&this.setIsPending(!1),this.additionalHeaders={"X-Schematic-Client-Version":`schematic-js@${Z}`,...t?.additionalHeaders??{}},t?.storage)this.storage=t.storage;else try{typeof localStorage<"u"&&(this.storage=localStorage)}catch{}t?.apiUrl!==void 0&&(this.apiUrl=t.apiUrl),t?.eventUrl!==void 0&&(this.eventUrl=t.eventUrl),t?.webSocketUrl!==void 0&&(this.webSocketUrl=t.webSocketUrl),t?.webSocketConnectionTimeout!==void 0&&(this.webSocketConnectionTimeout=t.webSocketConnectionTimeout),t?.webSocketReconnect!==void 0&&(this.webSocketReconnect=t.webSocketReconnect),t?.webSocketMaxReconnectAttempts!==void 0&&(this.webSocketMaxReconnectAttempts=t.webSocketMaxReconnectAttempts),t?.webSocketInitialRetryDelay!==void 0&&(this.webSocketInitialRetryDelay=t.webSocketInitialRetryDelay),t?.webSocketMaxRetryDelay!==void 0&&(this.webSocketMaxRetryDelay=t.webSocketMaxRetryDelay),t?.maxEventQueueSize!==void 0&&(this.maxEventQueueSize=t.maxEventQueueSize),t?.maxEventRetries!==void 0&&(this.maxEventRetries=t.maxEventRetries),t?.eventRetryInitialDelay!==void 0&&(this.eventRetryInitialDelay=t.eventRetryInitialDelay),t?.eventRetryMaxDelay!==void 0&&(this.eventRetryMaxDelay=t.eventRetryMaxDelay),t?.flagValueDefaults!==void 0&&(this.flagValueDefaults=t.flagValueDefaults),t?.flagCheckDefaults!==void 0&&(this.flagCheckDefaults=t.flagCheckDefaults),typeof window<"u"&&window?.addEventListener&&(window.addEventListener("beforeunload",()=>{this.flushEventQueue(),this.flushContextDependentEventQueue()}),this.useWebSocket&&(window.addEventListener("offline",()=>{this.debug("Browser went offline, closing WebSocket connection"),this.handleNetworkOffline()}),window.addEventListener("online",()=>{this.debug("Browser came online, attempting to reconnect WebSocket"),this.handleNetworkOnline()}))),this.offlineEnabled?this.debug("Initialized with offline mode enabled - no network requests will be made"):this.debugEnabled&&this.debug("Initialized with debug mode enabled")}resolveFallbackValue(e,t){return t!==void 0?t:e in this.flagCheckDefaults?this.flagCheckDefaults[e].value:e in this.flagValueDefaults?this.flagValueDefaults[e]:!1}resolveFallbackCheckFlagReturn(e,t,i="Fallback value used",r){if(t!==void 0)return{flag:e,value:t,reason:i,error:r};if(e in this.flagCheckDefaults){let s=this.flagCheckDefaults[e];return{...s,flag:e,reason:r!==void 0?i:s.reason,error:r}}return e in this.flagValueDefaults?{flag:e,value:this.flagValueDefaults[e],reason:i,error:r}:{flag:e,value:!1,reason:i,error:r}}async checkFlag(e){let{fallback:t,key:i}=e,r=e.context||this.context,s=_(r);if(this.debug(`checkFlag: ${i}`,{context:r,fallback:t}),this.isOffline()){let l=this.resolveFallbackCheckFlagReturn(i,t,"Offline mode - using initialization defaults");return this.debug(`checkFlag offline result: ${i}`,{value:l.value,offlineMode:!0}),l.value}if(!this.useWebSocket){let l=`${this.apiUrl}/flags/${i}/check`;return fetch(l,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8","X-Schematic-Api-Key":this.apiKey},body:JSON.stringify(r)}).then(p=>{if(!p.ok)throw new Error("Network response was not ok");return p.json()}).then(p=>{let u=H(p);this.debug(`checkFlag result: ${i}`,u);let f=X(u.data);return typeof f.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(f),this.submitFlagCheckEvent(i,f,r),f.value}).catch(p=>{console.warn("There was a problem with the fetch operation:",p);let u=this.resolveFallbackCheckFlagReturn(i,t,"API request failed",p instanceof Error?p.message:String(p));return this.submitFlagCheckEvent(i,u,r),u.value})}try{let l=this.checks[s];if(this.conn!==null&&typeof l<"u"&&typeof l[i]<"u")return this.debug(`checkFlag cached result: ${i}`,l[i]),l[i].value;if(this.isOffline())return this.resolveFallbackValue(i,t);try{await this.setContext(r)}catch(D){console.warn("WebSocket connection failed, using fallback value:",D);let y=this.resolveFallbackCheckFlagReturn(i,t,"WebSocket connection failed",D instanceof Error?D.message:String(D));return this.submitFlagCheckEvent(i,y,r),y.value}let u=(this.checks[s]??{})[i],f=u?.value??this.resolveFallbackValue(i,t);if(this.debug(`checkFlag WebSocket result: ${i}`,typeof u<"u"?u:{value:f,fallbackUsed:!0}),typeof u<"u")this.submitFlagCheckEvent(i,u,r);else{let D=this.resolveFallbackCheckFlagReturn(i,t,"No flag values available");this.submitFlagCheckEvent(i,D,r)}return f}catch(l){console.error("Unexpected error in checkFlag:",l);let p=this.resolveFallbackCheckFlagReturn(i,t,"Unexpected error in flag check",l instanceof Error?l.message:String(l));return this.submitFlagCheckEvent(i,p,r),p.value}}debug(e,...t){this.debugEnabled&&console.log(`[Schematic] ${e}`,...t)}createPersistentMessageHandler(e){return t=>{let i=JSON.parse(t.data);if(this.debug("WebSocket persistent message received:",i),_(e)in this.checks||(this.checks[_(e)]={}),(i.flags??[]).forEach(r=>{let s=X(r),l=_(e);this.checks[l]===void 0&&(this.checks[l]={}),this.checks[l][s.flag]=s,typeof s.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(s),((this.flagCheckListeners[r.flag]?.size??0)>0||(this.flagValueListeners[r.flag]?.size??0)>0)&&this.submitFlagCheckEvent(s.flag,s,e),this.debug(`WebSocket flag update received. Notifying listeners for ${r.flag}`,{flag:r.flag,value:s.value,flagCheck:s}),this.notifyFlagCheckListeners(r.flag,s),this.notifyFlagValueListeners(r.flag,s.value)}),i.plan!==void 0&&i.plan!==null){let r=xe(i.plan),s=_(e);this.planChecks[s]=r,this.debug("WebSocket plan update received. Notifying listeners",{plan:r}),this.notifyPlanListeners(r)}this.flushContextDependentEventQueue(),this.setIsPending(!1)}}isOffline(){return this.offlineEnabled}submitFlagCheckEvent(e,t,i){let r={flagKey:e,value:t.value,reason:t.reason,flagId:t.flagId,ruleId:t.ruleId,companyId:t.companyId,userId:t.userId,error:t.error,reqCompany:i.company,reqUser:i.user};return this.debug("submitting flag check event:",r),this.handleEvent("flag_check",w(r))}checkFlags=async e=>{if(e=e||this.context,this.debug("checkFlags",{context:e}),this.isOffline())return this.debug("checkFlags offline result: returning empty object"),{};let t=`${this.apiUrl}/flags/check`,i=JSON.stringify(e);return fetch(t,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8","X-Schematic-Api-Key":this.apiKey},body:i}).then(r=>{if(!r.ok)throw new Error("Network response was not ok");return r.json()}).then(r=>{let s=K(r);return this.debug("checkFlags result:",s),(s?.data?.flags??[]).reduce((l,p)=>(l[p.flag]=p.value,l),{})}).catch(r=>(console.warn("There was a problem with the fetch operation:",r),{}))};identify=e=>(this.debug("identify:",e),this.setContext({company:e.company?.keys,user:e.keys}).catch(t=>{console.warn("Error setting context:",t)}),this.handleEvent("identify",e));setContext=async e=>{if(this.isOffline()||!this.useWebSocket)return this.context=e,this.flushContextDependentEventQueue(),this.setIsPending(!1),Promise.resolve();if(!(_(e)===_(this.context)&&this.conn!==null&&!this.isPending))try{if(this.setIsPending(!0),!this.conn){if(this.isConnecting){for(this.debug("Connection already in progress, waiting for it to complete");this.isConnecting&&this.conn===null;)await new Promise(i=>setTimeout(i,10));if(this.conn!==null){let i=await this.conn;await this.wsSendMessage(i,e);return}}this.wsReconnectTimer!==null&&(this.debug("Cancelling scheduled reconnection, connecting immediately"),clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.isConnecting=!0;try{this.conn=this.wsConnect();let i=await this.conn;this.isConnecting=!1,await this.wsSendMessage(i,e);return}catch(i){throw this.isConnecting=!1,i}}let t=await this.conn;await this.wsSendMessage(t,e)}catch(t){console.warn("Failed to establish WebSocket connection:",t),this.context=e,this.flushContextDependentEventQueue(),this.setIsPending(!1),this.attemptReconnect()}};track=e=>{let{company:t,user:i,event:r,traits:s,quantity:l=1}=e;if(!this.hasContext(t,i)){this.debug(`track: queuing event "${r}" until context is available`);let u={api_key:this.apiKey,body:{company:t,event:r,traits:s??{},user:i,quantity:l},sent_at:new Date().toISOString(),tracker_event_id:O(),tracker_user_id:this.getAnonymousId(),type:"track"};return this.contextDependentEventQueue.push(u),Promise.resolve()}let p={company:t??this.context.company,event:r,traits:s??{},user:i??this.context.user,quantity:l};return this.debug("track:",p),r in this.featureUsageEventMap&&this.optimisticallyUpdateFeatureUsage(r,l),this.handleEvent("track",p)};optimisticallyUpdateFeatureUsage=(e,t=1)=>{let i=this.featureUsageEventMap[e];i!=null&&(this.debug(`Optimistically updating feature usage for event: ${e}`,{quantity:t}),Object.entries(i).forEach(([r,s])=>{if(s===void 0)return;let l={...s};if(typeof l.featureUsage=="number"){if(l.featureUsage+=t,typeof l.featureAllocation=="number"){let u=l.featureUsageExceeded===!0,f=l.featureUsage>=l.featureAllocation;f!==u&&(l.featureUsageExceeded=f,f&&(l.value=!1),this.debug(`Usage limit status changed for flag: ${r}`,{was:u?"exceeded":"within limits",now:f?"exceeded":"within limits",featureUsage:l.featureUsage,featureAllocation:l.featureAllocation,value:l.value}))}this.featureUsageEventMap[e]!==void 0&&(this.featureUsageEventMap[e][r]=l);let p=_(this.context);this.checks[p]!==void 0&&this.checks[p]!==null&&(this.checks[p][r]=l),this.notifyFlagCheckListeners(r,l),this.notifyFlagValueListeners(r,l.value)}}))};hasContext=(e,t)=>{let i=e!=null&&Object.keys(e).length>0||t!=null&&Object.keys(t).length>0,r=this.context.company!==void 0&&this.context.company!==null&&Object.keys(this.context.company).length>0||this.context.user!==void 0&&this.context.user!==null&&Object.keys(this.context.user).length>0;return i||r};flushContextDependentEventQueue=()=>{for(this.debug(`flushing ${this.contextDependentEventQueue.length} context-dependent events`);this.contextDependentEventQueue.length>0;){let e=this.contextDependentEventQueue.shift();if(e)if(e.type==="track"&&typeof e.body=="object"&&e.body!==null){let t=e.body,i={...t,company:t.company??this.context.company,user:t.user??this.context.user},r={...e,body:i,sent_at:new Date().toISOString()};this.sendEvent(r)}else this.sendEvent(e)}};startRetryTimer=()=>{this.retryTimer===null&&(this.retryTimer=setInterval(()=>{this.flushEventQueue().catch(e=>{this.debug("Error in retry timer flush:",e)}),this.eventQueue.length===0&&this.stopRetryTimer()},5e3),this.debug("Started retry timer"))};stopRetryTimer=()=>{this.retryTimer!==null&&(clearInterval(this.retryTimer),this.retryTimer=null,this.debug("Stopped retry timer"))};flushEventQueue=async()=>{if(this.eventQueue.length===0)return;let e=Date.now(),t=[],i=[];for(let r of this.eventQueue)r.next_retry_at===void 0||r.next_retry_at<=e?t.push(r):i.push(r);if(t.length===0){this.debug(`No events ready for retry yet (${i.length} still in backoff)`);return}this.debug(`Flushing event queue: ${t.length} ready, ${i.length} waiting`),this.eventQueue=i;for(let r of t)try{await this.sendEvent(r),this.debug("Queued event sent successfully:",r.type)}catch(s){this.debug("Failed to send queued event:",s)}};getAnonymousId=()=>{if(!this.storage)return O();let e=this.storage.getItem(Be);if(typeof e<"u")return e;let t=O();return this.storage.setItem(Be,t),t};handleEvent=(e,t)=>{let i={api_key:this.apiKey,body:t,sent_at:new Date().toISOString(),tracker_event_id:O(),tracker_user_id:this.getAnonymousId(),type:e};return typeof document<"u"&&document?.hidden?this.storeEvent(i):this.sendEvent(i)};sendEvent=async e=>{let t=`${this.eventUrl}/e`,i=JSON.stringify(e);if(this.debug("sending event:",{url:t,event:e}),this.isOffline())return this.debug("event not sent (offline mode):",{event:e}),Promise.resolve();try{let r=await fetch(t,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8"},body:i});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);this.debug("event sent:",{status:r.status,statusText:r.statusText})}catch(r){let s=(e.retry_count??0)+1;if(s<=this.maxEventRetries){this.debug(`Event failed to send (attempt ${s}/${this.maxEventRetries}), queueing for retry:`,r);let l=this.eventRetryInitialDelay*Math.pow(2,s-1),p=Math.min(l,this.eventRetryMaxDelay),u=Date.now()+p,f={...e,retry_count:s,next_retry_at:u};this.eventQueue.length<this.maxEventQueueSize?(this.eventQueue.push(f),this.debug(`Event queued for retry in ${p}ms (${this.eventQueue.length}/${this.maxEventQueueSize})`)):(this.debug(`Event queue full (${this.maxEventQueueSize}), dropping oldest event`),this.eventQueue.shift(),this.eventQueue.push(f)),this.startRetryTimer()}else this.debug(`Event failed permanently after ${this.maxEventRetries} attempts, dropping:`,r)}return Promise.resolve()};storeEvent=e=>(this.eventQueue.push(e),Promise.resolve());forceReconnect=async()=>this.reconnect({force:!0});reconnectIfNeeded=async()=>this.reconnect({force:!1});reconnect=async e=>{let{force:t}=e,i=t?"forceReconnect":"reconnectIfNeeded";if(this.isOffline())return this.debug(`${i}: skipped (offline mode)`),Promise.resolve();if(!t&&this.conn!==null)try{if((await this.conn).readyState===WebSocket.OPEN)return this.debug(`${i}: connection is healthy, skipping`),Promise.resolve()}catch{}if(this.debug(`${i}: ${t?"forcing immediate reconnection":"reconnecting"}`),this.wsIntentionalDisconnect=!1,this.wsReconnectTimer!==null&&(this.debug(`${i}: cancelling pending reconnection timer`),clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.wsReconnectAttempts=0,this.conn!==null){this.debug(`${i}: closing existing connection`);try{let r=await this.conn;this.currentWebSocket===r&&(this.currentWebSocket=null),(r.readyState===WebSocket.OPEN||r.readyState===WebSocket.CONNECTING)&&r.close()}catch(r){this.debug(`${i}: error closing existing connection:`,r)}this.conn=null,this.isConnecting=!1}if(this.context.company!==void 0||this.context.user!==void 0){this.debug(`${i}: reconnecting with existing context`);try{this.isConnecting=!0,this.conn=this.wsConnect();let r=await this.conn;this.isConnecting=!1,await this.wsSendMessage(r,this.context,!0),this.debug(`${i}: reconnection successful`)}catch(r){this.isConnecting=!1,this.debug(`${i}: reconnection failed:`,r)}}else this.debug(`${i}: no context set, skipping reconnection`);return Promise.resolve()};cleanup=async()=>{if(this.isOffline())return this.debug("cleanup: skipped (offline mode)"),Promise.resolve();if(this.wsIntentionalDisconnect=!0,this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.stopRetryTimer(),this.conn)try{let e=await this.conn;this.currentWebSocket===e&&(this.debug("Cleaning up current websocket tracking"),this.currentWebSocket=null),e.close()}catch(e){console.warn("Error during cleanup:",e)}finally{this.conn=null,this.currentWebSocket=null,this.isConnecting=!1}};calculateReconnectDelay=()=>{let e=this.webSocketInitialRetryDelay*Math.pow(2,this.wsReconnectAttempts),t=Math.min(e,this.webSocketMaxRetryDelay),i=Math.random()*t*.5,r=t+i;return this.debug(`Reconnect delay calculated: ${r.toFixed(0)}ms (attempt ${this.wsReconnectAttempts+1}/${this.webSocketMaxReconnectAttempts})`),r};handleNetworkOffline=async()=>{if(this.conn!==null){try{let e=await this.conn;(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close()}catch(e){this.debug("Error closing connection on offline:",e)}this.conn=null}this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null)};handleNetworkOnline=()=>{this.debug("Network online, attempting reconnection and flushing queued events"),this.wsReconnectAttempts=0,this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.flushEventQueue().catch(e=>{this.debug("Error flushing event queue on network online:",e)}),this.attemptReconnect()};attemptReconnect=()=>{if(this.wsReconnectAttempts>=this.webSocketMaxReconnectAttempts){this.debug(`Maximum reconnection attempts (${this.webSocketMaxReconnectAttempts}) reached, giving up`);return}if(this.wsReconnectTimer!==null){this.debug("Reconnection attempt already scheduled, ignoring duplicate request");return}let e=this.calculateReconnectDelay();this.debug(`Scheduling reconnection attempt ${this.wsReconnectAttempts+1}/${this.webSocketMaxReconnectAttempts} in ${e.toFixed(0)}ms`),this.wsReconnectTimer=setTimeout(async()=>{this.wsReconnectTimer=null,this.wsReconnectAttempts++,this.debug(`Attempting to reconnect (attempt ${this.wsReconnectAttempts}/${this.webSocketMaxReconnectAttempts})`);try{if(this.conn!==null){this.debug("Cleaning up existing connection before reconnection");try{let t=await this.conn;this.currentWebSocket===t&&(this.debug("Existing websocket is current, will be replaced"),this.currentWebSocket=null),(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close()}catch(t){this.debug("Error cleaning up existing connection:",t)}this.conn=null,this.currentWebSocket=null,this.isConnecting=!1}this.isConnecting=!0;try{this.conn=this.wsConnect();let t=await this.conn;this.isConnecting=!1,this.debug("Reconnection context check:",{hasCompany:this.context.company!==void 0,hasUser:this.context.user!==void 0,context:this.context}),this.context.company!==void 0||this.context.user!==void 0?(this.debug("Reconnected, force re-sending context"),await this.wsSendMessage(t,this.context,!0)):(this.debug("No context to re-send after reconnection - websocket ready for new context"),this.debug("Setting up tracking for reconnected websocket (no context to send)"),this.currentWebSocket=t),this.flushEventQueue().catch(i=>{this.debug("Error flushing event queue after websocket reconnection:",i)}),this.debug("Reconnection successful")}catch(t){throw this.isConnecting=!1,t}}catch(t){this.debug("Reconnection attempt failed:",t)}},e)};wsConnect=async()=>{if(this.isOffline())throw this.debug("wsConnect: skipped (offline mode)"),new Error("WebSocket connection skipped in offline mode");let e=null,t=this.webSocketMaxConnectionAttempts;for(let i=0;i<t;i++)try{let r=await this.wsConnectOnce();return this.wsReconnectAttempts=0,r}catch(r){if(e=r instanceof Error?r:new Error(String(r)),!(e.message==="WebSocket connection timeout"))throw this.debug("WebSocket connection failed with non-timeout error, not retrying:",e.message),e;if(i<t-1){let l=this.webSocketInitialRetryDelay*Math.pow(2,i),p=Math.min(l,this.webSocketMaxRetryDelay),u=p*.2*Math.random(),f=p+u;this.debug(`WebSocket connection timeout (attempt ${i+1}/${t}), retrying in ${f.toFixed(0)}ms`),await new Promise(D=>setTimeout(D,f))}else this.debug(`WebSocket connection timeout (attempt ${i+1}/${t}), no more retries`)}throw e??new Error("WebSocket connection failed")};wsConnectOnce=()=>new Promise((e,t)=>{let i=`${this.webSocketUrl}/flags/bootstrap?apiKey=${this.apiKey}`;this.debug("connecting to WebSocket:",i);let r=new WebSocket(i),s=Math.random().toString(36).substring(7);this.debug(`Creating WebSocket connection ${s} to ${i}`);let l=null,p=!1;l=setTimeout(()=>{p||(p=!0,this.debug(`WebSocket connection timeout after ${this.webSocketConnectionTimeout}ms`),r.close(),t(new Error("WebSocket connection timeout")))},this.webSocketConnectionTimeout),r.onopen=()=>{p||(p=!0,l!==null&&clearTimeout(l),this.wsIntentionalDisconnect=!1,this.debug(`WebSocket connection ${s} opened successfully`),e(r))},r.onerror=u=>{if(p)return;p=!0,l!==null&&clearTimeout(l),this.debug(`WebSocket connection ${s} error:`,u);let f=new Error("WebSocket connection failed during handshake");t(f)},r.onclose=()=>{l!==null&&clearTimeout(l),this.debug(`WebSocket connection ${s} closed`),this.conn=null,this.currentWebSocket===r&&(this.currentWebSocket=null,this.isConnecting=!1),!p&&!this.wsIntentionalDisconnect&&this.webSocketReconnect&&this.attemptReconnect()}});wsSendMessage=(e,t,i=!1)=>this.isOffline()?(this.debug("wsSendMessage: skipped (offline mode)"),this.setIsPending(!1),Promise.resolve()):new Promise((r,s)=>{if(!i&&_(t)==_(this.context))return this.debug("WebSocket context unchanged, skipping update"),r(this.setIsPending(!1));this.debug(i?"WebSocket force sending context (reconnection):":"WebSocket context updated:",t),this.context=t;let l=()=>{let p=!1,u=this.createPersistentMessageHandler(t),f=S=>{u(S),p||(p=!0,r())};e.addEventListener("message",f),e.addEventListener("close",S=>{p||(p=!0,S.code===4001?s(new Error(`Authentication failed: ${S.reason!==""?S.reason:"Invalid API key"}`)):s(new Error("WebSocket connection closed unexpectedly")))}),this.currentWebSocket=e;let D=this.additionalHeaders["X-Schematic-Client-Version"]??`schematic-js@${Z}`,y={apiKey:this.apiKey,clientVersion:D,data:t};this.debug("WebSocket sending message:",y),e.send(JSON.stringify(y))};e.readyState===WebSocket.OPEN?(this.debug("WebSocket already open, sending message"),l()):e.readyState===WebSocket.CONNECTING?(this.debug("WebSocket connecting, waiting for open to send message"),e.addEventListener("open",l)):(this.debug("WebSocket is closed, cannot send message"),s("WebSocket is not open or connecting"))});getIsPending=()=>this.isPending;addIsPendingListener=e=>(this.isPendingListeners.add(e),()=>{this.isPendingListeners.delete(e)});setIsPending=e=>{this.isPending!==e&&(this.isPending=e,this.isPendingListeners.forEach(t=>Mt(t,e)))};getPlan=()=>{let e=_(this.context);return this.planChecks[e]};getFlagCheck=e=>{let t=_(this.context),r=(this.checks[t]??{})[e];if(r!==void 0)return r;if(e in this.flagCheckDefaults||e in this.flagValueDefaults)return e in this.fallbackCheckCache||(this.fallbackCheckCache[e]=this.resolveFallbackCheckFlagReturn(e,void 0,"Default value used")),this.fallbackCheckCache[e]};getFlagValue=e=>{let t=_(this.context),r=(this.checks[t]??{})[e];if(r?.value!==void 0)return r.value;if(e in this.flagCheckDefaults||e in this.flagValueDefaults)return this.resolveFallbackValue(e)};addFlagValueListener=(e,t)=>(e in this.flagValueListeners||(this.flagValueListeners[e]=new Set),this.flagValueListeners[e].add(t),()=>{this.flagValueListeners[e].delete(t)});addFlagCheckListener=(e,t)=>(e in this.flagCheckListeners||(this.flagCheckListeners[e]=new Set),this.flagCheckListeners[e].add(t),()=>{this.flagCheckListeners[e].delete(t)});addPlanListener=e=>(this.planListeners.add(e),()=>{this.planListeners.delete(e)});notifyFlagCheckListeners=(e,t)=>{let i=this.flagCheckListeners?.[e]??[];i.size>0&&this.debug(`Notifying ${i.size} flag check listeners for ${e}`,t),typeof t.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(t),i.forEach(r=>qt(r,t))};updateFeatureUsageEventMap=e=>{if(typeof e.featureUsageEvent!="string")return;let t=e.featureUsageEvent;(this.featureUsageEventMap[t]===void 0||this.featureUsageEventMap[t]===null)&&(this.featureUsageEventMap[t]={}),this.featureUsageEventMap[t]!==void 0&&(this.featureUsageEventMap[t][e.flag]=e),this.debug(`Updated featureUsageEventMap for event: ${t}, flag: ${e.flag}`,e)};notifyFlagValueListeners=(e,t)=>{let i=this.flagValueListeners?.[e]??[];i.size>0&&this.debug(`Notifying ${i.size} flag value listeners for ${e}`,{value:t}),i.forEach((r,s)=>{this.debug(`Calling listener ${s} for flag ${e}`,{flagKey:e,value:t}),Wt(r,t),this.debug(`Listener ${s} for flag ${e} completed`,{flagKey:e,value:t})})};notifyPlanListeners=e=>{let t=this.planListeners??[];t.size>0&&this.debug(`Notifying ${t.size} plan listeners`,{value:e}),t.forEach((i,r)=>{this.debug(`Calling listener ${r} for plan`,{value:e}),$t(i,e),this.debug(`Listener ${r} for plan completed`,{value:e})})}},Mt=(n,e)=>{n.length>0?n(e):n()},qt=(n,e)=>{n.length>0?n(e):n()},Wt=(n,e)=>{n.length>0?n(e):n()},$t=(n,e)=>{n.length>0?n(e):n()};window.Schematic=U;})();
1
+ "use strict";(()=>{var ve=Object.create;var ie=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var We=Object.getOwnPropertyNames;var $e=Object.getPrototypeOf,ze=Object.prototype.hasOwnProperty;var He=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Qe=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of We(e))!ze.call(n,r)&&r!==t&&ie(n,r,{get:()=>e[r],enumerable:!(i=qe(e,r))||i.enumerable});return n};var Ke=(n,e,t)=>(t=n!=null?ve($e(n)):{},Qe(e||!n||!n.__esModule?ie(t,"default",{value:n,enumerable:!0}):t,n));var se=He(oe=>{(function(n){var e=(function(t){var i=typeof globalThis<"u"&&globalThis||typeof n<"u"&&n||typeof global<"u"&&global||{},r={searchParams:"URLSearchParams"in i,iterable:"Symbol"in i&&"iterator"in Symbol,blob:"FileReader"in i&&"Blob"in i&&(function(){try{return new Blob,!0}catch{return!1}})(),formData:"FormData"in i,arrayBuffer:"ArrayBuffer"in i};function l(a){return a&&DataView.prototype.isPrototypeOf(a)}if(r.arrayBuffer)var s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],p=ArrayBuffer.isView||function(a){return a&&s.indexOf(Object.prototype.toString.call(a))>-1};function u(a){if(typeof a!="string"&&(a=String(a)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(a)||a==="")throw new TypeError('Invalid character in header field name: "'+a+'"');return a.toLowerCase()}function f(a){return typeof a!="string"&&(a=String(a)),a}function P(a){var o={next:function(){var d=a.shift();return{done:d===void 0,value:d}}};return r.iterable&&(o[Symbol.iterator]=function(){return o}),o}function y(a){this.map={},a instanceof y?a.forEach(function(o,d){this.append(d,o)},this):Array.isArray(a)?a.forEach(function(o){if(o.length!=2)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+o.length);this.append(o[0],o[1])},this):a&&Object.getOwnPropertyNames(a).forEach(function(o){this.append(o,a[o])},this)}y.prototype.append=function(a,o){a=u(a),o=f(o);var d=this.map[a];this.map[a]=d?d+", "+o:o},y.prototype.delete=function(a){delete this.map[u(a)]},y.prototype.get=function(a){return a=u(a),this.has(a)?this.map[a]:null},y.prototype.has=function(a){return this.map.hasOwnProperty(u(a))},y.prototype.set=function(a,o){this.map[u(a)]=f(o)},y.prototype.forEach=function(a,o){for(var d in this.map)this.map.hasOwnProperty(d)&&a.call(o,this.map[d],d,this)},y.prototype.keys=function(){var a=[];return this.forEach(function(o,d){a.push(d)}),P(a)},y.prototype.values=function(){var a=[];return this.forEach(function(o){a.push(o)}),P(a)},y.prototype.entries=function(){var a=[];return this.forEach(function(o,d){a.push([d,o])}),P(a)},r.iterable&&(y.prototype[Symbol.iterator]=y.prototype.entries);function D(a){if(!a._noBody){if(a.bodyUsed)return Promise.reject(new TypeError("Already read"));a.bodyUsed=!0}}function N(a){return new Promise(function(o,d){a.onload=function(){o(a.result)},a.onerror=function(){d(a.error)}})}function E(a){var o=new FileReader,d=N(o);return o.readAsArrayBuffer(a),d}function ee(a){var o=new FileReader,d=N(o),m=/charset=([A-Za-z0-9_-]+)/.exec(a.type),g=m?m[1]:"utf-8";return o.readAsText(a,g),d}function we(a){for(var o=new Uint8Array(a),d=new Array(o.length),m=0;m<o.length;m++)d[m]=String.fromCharCode(o[m]);return d.join("")}function te(a){if(a.slice)return a.slice(0);var o=new Uint8Array(a.byteLength);return o.set(new Uint8Array(a)),o.buffer}function ne(){return this.bodyUsed=!1,this._initBody=function(a){this.bodyUsed=this.bodyUsed,this._bodyInit=a,a?typeof a=="string"?this._bodyText=a:r.blob&&Blob.prototype.isPrototypeOf(a)?this._bodyBlob=a:r.formData&&FormData.prototype.isPrototypeOf(a)?this._bodyFormData=a:r.searchParams&&URLSearchParams.prototype.isPrototypeOf(a)?this._bodyText=a.toString():r.arrayBuffer&&r.blob&&l(a)?(this._bodyArrayBuffer=te(a.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):r.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(a)||p(a))?this._bodyArrayBuffer=te(a):this._bodyText=a=Object.prototype.toString.call(a):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||(typeof a=="string"?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r.searchParams&&URLSearchParams.prototype.isPrototypeOf(a)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},r.blob&&(this.blob=function(){var a=D(this);if(a)return a;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var a=D(this);return a||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}else{if(r.blob)return this.blob().then(E);throw new Error("could not read as ArrayBuffer")}},this.text=function(){var a=D(this);if(a)return a;if(this._bodyBlob)return ee(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(we(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},r.formData&&(this.formData=function(){return this.text().then(Ge)}),this.json=function(){return this.text().then(JSON.parse)},this}var Ve=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function Ue(a){var o=a.toUpperCase();return Ve.indexOf(o)>-1?o:a}function _(a,o){if(!(this instanceof _))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');o=o||{};var d=o.body;if(a instanceof _){if(a.bodyUsed)throw new TypeError("Already read");this.url=a.url,this.credentials=a.credentials,o.headers||(this.headers=new y(a.headers)),this.method=a.method,this.mode=a.mode,this.signal=a.signal,!d&&a._bodyInit!=null&&(d=a._bodyInit,a.bodyUsed=!0)}else this.url=String(a);if(this.credentials=o.credentials||this.credentials||"same-origin",(o.headers||!this.headers)&&(this.headers=new y(o.headers)),this.method=Ue(o.method||this.method||"GET"),this.mode=o.mode||this.mode||null,this.signal=o.signal||this.signal||(function(){if("AbortController"in i){var c=new AbortController;return c.signal}})(),this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&d)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(d),(this.method==="GET"||this.method==="HEAD")&&(o.cache==="no-store"||o.cache==="no-cache")){var m=/([?&])_=[^&]*/;if(m.test(this.url))this.url=this.url.replace(m,"$1_="+new Date().getTime());else{var g=/\?/;this.url+=(g.test(this.url)?"&":"?")+"_="+new Date().getTime()}}}_.prototype.clone=function(){return new _(this,{body:this._bodyInit})};function Ge(a){var o=new FormData;return a.trim().split("&").forEach(function(d){if(d){var m=d.split("="),g=m.shift().replace(/\+/g," "),c=m.join("=").replace(/\+/g," ");o.append(decodeURIComponent(g),decodeURIComponent(c))}}),o}function Le(a){var o=new y,d=a.replace(/\r?\n[\t ]+/g," ");return d.split("\r").map(function(m){return m.indexOf(`
2
+ `)===0?m.substr(1,m.length):m}).forEach(function(m){var g=m.split(":"),c=g.shift().trim();if(c){var J=g.join(":").trim();try{o.append(c,J)}catch(v){console.warn("Response "+v.message)}}}),o}ne.call(_.prototype);function R(a,o){if(!(this instanceof R))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(o||(o={}),this.type="default",this.status=o.status===void 0?200:o.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=o.statusText===void 0?"":""+o.statusText,this.headers=new y(o.headers),this.url=o.url||"",this._initBody(a)}ne.call(R.prototype),R.prototype.clone=function(){return new R(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new y(this.headers),url:this.url})},R.error=function(){var a=new R(null,{status:200,statusText:""});return a.ok=!1,a.status=0,a.type="error",a};var Me=[301,302,303,307,308];R.redirect=function(a,o){if(Me.indexOf(o)===-1)throw new RangeError("Invalid status code");return new R(null,{status:o,headers:{location:a}})},t.DOMException=i.DOMException;try{new t.DOMException}catch{t.DOMException=function(o,d){this.message=o,this.name=d;var m=Error(o);this.stack=m.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function M(a,o){return new Promise(function(d,m){var g=new _(a,o);if(g.signal&&g.signal.aborted)return m(new t.DOMException("Aborted","AbortError"));var c=new XMLHttpRequest;function J(){c.abort()}c.onload=function(){var T={statusText:c.statusText,headers:Le(c.getAllResponseHeaders()||"")};g.url.indexOf("file://")===0&&(c.status<200||c.status>599)?T.status=200:T.status=c.status,T.url="responseURL"in c?c.responseURL:T.headers.get("X-Request-URL");var O="response"in c?c.response:c.responseText;setTimeout(function(){d(new R(O,T))},0)},c.onerror=function(){setTimeout(function(){m(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){m(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){m(new t.DOMException("Aborted","AbortError"))},0)};function v(T){try{return T===""&&i.location.href?i.location.href:T}catch{return T}}if(c.open(g.method,v(g.url),!0),g.credentials==="include"?c.withCredentials=!0:g.credentials==="omit"&&(c.withCredentials=!1),"responseType"in c&&(r.blob?c.responseType="blob":r.arrayBuffer&&(c.responseType="arraybuffer")),o&&typeof o.headers=="object"&&!(o.headers instanceof y||i.Headers&&o.headers instanceof i.Headers)){var re=[];Object.getOwnPropertyNames(o.headers).forEach(function(T){re.push(u(T)),c.setRequestHeader(T,f(o.headers[T]))}),g.headers.forEach(function(T,O){re.indexOf(O)===-1&&c.setRequestHeader(O,T)})}else g.headers.forEach(function(T,O){c.setRequestHeader(O,T)});g.signal&&(g.signal.addEventListener("abort",J),c.onreadystatechange=function(){c.readyState===4&&g.signal.removeEventListener("abort",J)}),c.send(typeof g._bodyInit>"u"?null:g._bodyInit)})}return M.polyfill=!0,i.fetch||(i.fetch=M,i.Headers=y,i.Request=_,i.Response=R),t.Headers=y,t.Request=_,t.Response=R,t.fetch=M,t})({})})(typeof self<"u"?self:oe)});var h=[];for(let n=0;n<256;++n)h.push((n+256).toString(16).slice(1));function ae(n,e=0){return(h[n[e+0]]+h[n[e+1]]+h[n[e+2]]+h[n[e+3]]+"-"+h[n[e+4]]+h[n[e+5]]+"-"+h[n[e+6]]+h[n[e+7]]+"-"+h[n[e+8]]+h[n[e+9]]+"-"+h[n[e+10]]+h[n[e+11]]+h[n[e+12]]+h[n[e+13]]+h[n[e+14]]+h[n[e+15]]).toLowerCase()}var q,Xe=new Uint8Array(16);function W(){if(!q){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");q=crypto.getRandomValues.bind(crypto)}return q(Xe)}var Ye=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),$={randomUUID:Ye};function Ze(n,e,t){n=n||{};let i=n.random??n.rng?.()??W();if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){if(t=t||0,t<0||t+16>e.length)throw new RangeError(`UUID byte range ${t}:${t+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[t+r]=i[r];return e}return ae(i)}function je(n,e,t){return $.randomUUID&&!e&&!n?$.randomUUID():Ze(n,e,t)}var C=je;var Tm=Ke(se());function Q(n){return Dt(n,!1)}function Dt(n,e){return n}function ge(n){return Rt(n,!1)}function Rt(n,e){return n==null?n:{allocation:n.allocation==null?void 0:n.allocation,creditId:n.credit_id==null?void 0:n.credit_id,creditRemaining:n.credit_remaining==null?void 0:n.credit_remaining,creditTotal:n.credit_total==null?void 0:n.credit_total,creditUsed:n.credit_used==null?void 0:n.credit_used,eventName:n.event_name==null?void 0:n.event_name,featureId:n.feature_id,featureKey:n.feature_key,metricPeriod:n.metric_period==null?void 0:n.metric_period,metricResetAt:n.metric_reset_at==null?void 0:new Date(n.metric_reset_at),monthReset:n.month_reset==null?void 0:n.month_reset,softLimit:n.soft_limit==null?void 0:n.soft_limit,usage:n.usage==null?void 0:n.usage,valueType:Q(n.value_type)}}function B(n){return _t(n,!1)}function _t(n,e){return n==null?n:{companyId:n.company_id==null?void 0:n.company_id,entitlement:n.entitlement==null?void 0:ge(n.entitlement),error:n.error==null?void 0:n.error,featureAllocation:n.feature_allocation==null?void 0:n.feature_allocation,featureUsage:n.feature_usage==null?void 0:n.feature_usage,featureUsageEvent:n.feature_usage_event==null?void 0:n.feature_usage_event,featureUsagePeriod:n.feature_usage_period==null?void 0:n.feature_usage_period,featureUsageResetAt:n.feature_usage_reset_at==null?void 0:new Date(n.feature_usage_reset_at),flag:n.flag,flagId:n.flag_id==null?void 0:n.flag_id,reason:n.reason,ruleId:n.rule_id==null?void 0:n.rule_id,ruleType:n.rule_type==null?void 0:n.rule_type,userId:n.user_id==null?void 0:n.user_id,value:n.value}}function K(n){return Ct(n,!1)}function Ct(n,e){return n==null?n:{data:B(n.data),params:n.params}}function Te(n){return bt(n,!1)}function bt(n,e){return n}function F(n){return xt(n,!1)}function xt(n,e){return n==null?n:{id:n.id,name:n.name,trialEndDate:n.trial_end_date==null?void 0:new Date(n.trial_end_date),trialStatus:n.trial_status==null?void 0:Te(n.trial_status)}}function X(n){return Bt(n,!1)}function Bt(n,e){return n==null?n:{flags:n.flags.map(B),plan:n.plan==null?void 0:F(n.plan)}}function Y(n){return Ft(n,!1)}function Ft(n,e){return n==null?n:{data:X(n.data),params:n.params}}function I(n){return Et(n,!1)}function Et(n,e=!1){return n==null?n:{company_id:n.companyId,error:n.error,flag_id:n.flagId,flag_key:n.flagKey,reason:n.reason,req_company:n.reqCompany,req_user:n.reqUser,rule_id:n.ruleId,user_id:n.userId,value:n.value}}var Z=n=>{let{companyId:e,error:t,featureAllocation:i,featureUsage:r,featureUsageEvent:l,featureUsagePeriod:s,featureUsageResetAt:p,flag:u,flagId:f,reason:P,ruleId:y,ruleType:D,userId:N,value:E}=B(n);return{featureUsageExceeded:!E&&(D=="company_override_usage_exceeded"||D=="plan_entitlement_usage_exceeded"),companyId:e??void 0,error:t??void 0,featureAllocation:i??void 0,featureUsage:r??void 0,featureUsageEvent:l===null?void 0:l,featureUsagePeriod:s??void 0,featureUsageResetAt:p??void 0,flag:u,flagId:f??void 0,reason:P,ruleId:y??void 0,ruleType:D??void 0,userId:N??void 0,value:E}},Ae=n=>{let{id:e,name:t,trialEndDate:i,trialStatus:r}=F(n);return{id:e,name:t,trialEndDate:i??void 0,trialStatus:r??void 0}};function S(n){let e=Object.keys(n).reduce((t,i)=>{let l=Object.keys(n[i]||{}).sort().reduce((s,p)=>(s[p]=n[i][p],s),{});return t[i]=l,t},{});return JSON.stringify(e)}var j="1.3.1";var Ie="schematicId";var L=class{additionalHeaders={};apiKey;apiUrl="https://api.schematichq.com";conn=null;context={};debugEnabled=!1;offlineEnabled=!1;eventQueue;contextDependentEventQueue;eventUrl="https://c.schematichq.com";flagCheckListeners={};flagValueListeners={};isPending=!0;isPendingListeners=new Set;planListeners=new Set;storage;useWebSocket=!1;checks={};featureUsageEventMap={};planChecks={};webSocketUrl="wss://api.schematichq.com";webSocketConnectionTimeout=1e4;webSocketReconnect=!0;webSocketMaxReconnectAttempts=7;webSocketMaxConnectionAttempts=3;webSocketInitialRetryDelay=1e3;webSocketMaxRetryDelay=3e4;wsReconnectAttempts=0;wsReconnectTimer=null;wsIntentionalDisconnect=!1;currentWebSocket=null;isConnecting=!1;maxEventQueueSize=100;maxEventRetries=5;eventRetryInitialDelay=1e3;eventRetryMaxDelay=3e4;retryTimer=null;flagValueDefaults={};flagCheckDefaults={};fallbackCheckCache={};constructor(e,t){if(this.apiKey=e,this.eventQueue=[],this.contextDependentEventQueue=[],this.useWebSocket=t?.useWebSocket??!1,this.debugEnabled=t?.debug??!1,this.offlineEnabled=t?.offline??!1,typeof window<"u"&&typeof window.location<"u"){let i=new URLSearchParams(window.location.search),r=i.get("schematic_debug");r!==null&&(r===""||r==="true"||r==="1")&&(this.debugEnabled=!0);let l=i.get("schematic_offline");l!==null&&(l===""||l==="true"||l==="1")&&(this.offlineEnabled=!0,this.debugEnabled=!0)}if(this.offlineEnabled&&t?.debug!==!1&&(this.debugEnabled=!0),this.offlineEnabled&&this.setIsPending(!1),this.additionalHeaders={"X-Schematic-Client-Version":`schematic-js@${j}`,...t?.additionalHeaders??{}},t?.storage)this.storage=t.storage;else try{typeof localStorage<"u"&&(this.storage=localStorage)}catch{}t?.apiUrl!==void 0&&(this.apiUrl=t.apiUrl),t?.eventUrl!==void 0&&(this.eventUrl=t.eventUrl),t?.webSocketUrl!==void 0&&(this.webSocketUrl=t.webSocketUrl),t?.webSocketConnectionTimeout!==void 0&&(this.webSocketConnectionTimeout=t.webSocketConnectionTimeout),t?.webSocketReconnect!==void 0&&(this.webSocketReconnect=t.webSocketReconnect),t?.webSocketMaxReconnectAttempts!==void 0&&(this.webSocketMaxReconnectAttempts=t.webSocketMaxReconnectAttempts),t?.webSocketInitialRetryDelay!==void 0&&(this.webSocketInitialRetryDelay=t.webSocketInitialRetryDelay),t?.webSocketMaxRetryDelay!==void 0&&(this.webSocketMaxRetryDelay=t.webSocketMaxRetryDelay),t?.maxEventQueueSize!==void 0&&(this.maxEventQueueSize=t.maxEventQueueSize),t?.maxEventRetries!==void 0&&(this.maxEventRetries=t.maxEventRetries),t?.eventRetryInitialDelay!==void 0&&(this.eventRetryInitialDelay=t.eventRetryInitialDelay),t?.eventRetryMaxDelay!==void 0&&(this.eventRetryMaxDelay=t.eventRetryMaxDelay),t?.flagValueDefaults!==void 0&&(this.flagValueDefaults=t.flagValueDefaults),t?.flagCheckDefaults!==void 0&&(this.flagCheckDefaults=t.flagCheckDefaults),typeof window<"u"&&window?.addEventListener&&(window.addEventListener("beforeunload",()=>{this.flushEventQueue(),this.flushContextDependentEventQueue()}),this.useWebSocket&&(window.addEventListener("offline",()=>{this.debug("Browser went offline, closing WebSocket connection"),this.handleNetworkOffline()}),window.addEventListener("online",()=>{this.debug("Browser came online, attempting to reconnect WebSocket"),this.handleNetworkOnline()}))),this.offlineEnabled?this.debug("Initialized with offline mode enabled - no network requests will be made"):this.debugEnabled&&this.debug("Initialized with debug mode enabled")}resolveFallbackValue(e,t){return t!==void 0?t:e in this.flagCheckDefaults?this.flagCheckDefaults[e].value:e in this.flagValueDefaults?this.flagValueDefaults[e]:!1}resolveFallbackCheckFlagReturn(e,t,i="Fallback value used",r){if(t!==void 0)return{flag:e,value:t,reason:i,error:r};if(e in this.flagCheckDefaults){let l=this.flagCheckDefaults[e];return{...l,flag:e,reason:r!==void 0?i:l.reason,error:r}}return e in this.flagValueDefaults?{flag:e,value:this.flagValueDefaults[e],reason:i,error:r}:{flag:e,value:!1,reason:i,error:r}}async checkFlag(e){let{fallback:t,key:i}=e,r=e.context||this.context,l=S(r);if(this.debug(`checkFlag: ${i}`,{context:r,fallback:t}),this.isOffline()){let s=this.resolveFallbackCheckFlagReturn(i,t,"Offline mode - using initialization defaults");return this.debug(`checkFlag offline result: ${i}`,{value:s.value,offlineMode:!0}),s.value}if(!this.useWebSocket){let s=`${this.apiUrl}/flags/${i}/check`;return fetch(s,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8","X-Schematic-Api-Key":this.apiKey},body:JSON.stringify(r)}).then(p=>{if(!p.ok)throw new Error("Network response was not ok");return p.json()}).then(p=>{let u=K(p);this.debug(`checkFlag result: ${i}`,u);let f=Z(u.data);return typeof f.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(f),this.submitFlagCheckEvent(i,f,r),f.value}).catch(p=>{console.warn("There was a problem with the fetch operation:",p);let u=this.resolveFallbackCheckFlagReturn(i,t,"API request failed",p instanceof Error?p.message:String(p));return this.submitFlagCheckEvent(i,u,r),u.value})}try{let s=this.checks[l];if(this.conn!==null&&typeof s<"u"&&typeof s[i]<"u")return this.debug(`checkFlag cached result: ${i}`,s[i]),s[i].value;if(this.isOffline())return this.resolveFallbackValue(i,t);try{await this.setContext(r)}catch(P){console.warn("WebSocket connection failed, using fallback value:",P);let y=this.resolveFallbackCheckFlagReturn(i,t,"WebSocket connection failed",P instanceof Error?P.message:String(P));return this.submitFlagCheckEvent(i,y,r),y.value}let u=(this.checks[l]??{})[i],f=u?.value??this.resolveFallbackValue(i,t);if(this.debug(`checkFlag WebSocket result: ${i}`,typeof u<"u"?u:{value:f,fallbackUsed:!0}),typeof u<"u")this.submitFlagCheckEvent(i,u,r);else{let P=this.resolveFallbackCheckFlagReturn(i,t,"No flag values available");this.submitFlagCheckEvent(i,P,r)}return f}catch(s){console.error("Unexpected error in checkFlag:",s);let p=this.resolveFallbackCheckFlagReturn(i,t,"Unexpected error in flag check",s instanceof Error?s.message:String(s));return this.submitFlagCheckEvent(i,p,r),p.value}}debug(e,...t){this.debugEnabled&&console.log(`[Schematic] ${e}`,...t)}createPersistentMessageHandler(e){return t=>{let i=JSON.parse(t.data);if(this.debug("WebSocket persistent message received:",i),S(e)in this.checks||(this.checks[S(e)]={}),(i.flags??[]).forEach(r=>{let l=Z(r),s=S(e);this.checks[s]===void 0&&(this.checks[s]={}),this.checks[s][l.flag]=l,typeof l.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(l),((this.flagCheckListeners[r.flag]?.size??0)>0||(this.flagValueListeners[r.flag]?.size??0)>0)&&this.submitFlagCheckEvent(l.flag,l,e),this.debug(`WebSocket flag update received. Notifying listeners for ${r.flag}`,{flag:r.flag,value:l.value,flagCheck:l}),this.notifyFlagCheckListeners(r.flag,l),this.notifyFlagValueListeners(r.flag,l.value)}),i.plan!==void 0&&i.plan!==null){let r=Ae(i.plan),l=S(e);this.planChecks[l]=r,this.debug("WebSocket plan update received. Notifying listeners",{plan:r}),this.notifyPlanListeners(r)}this.flushContextDependentEventQueue(),this.setIsPending(!1)}}isOffline(){return this.offlineEnabled}submitFlagCheckEvent(e,t,i){let r={flagKey:e,value:t.value,reason:t.reason,flagId:t.flagId,ruleId:t.ruleId,companyId:t.companyId,userId:t.userId,error:t.error,reqCompany:i.company,reqUser:i.user};return this.debug("submitting flag check event:",r),this.handleEvent("flag_check",I(r))}checkFlags=async e=>{if(e=e||this.context,this.debug("checkFlags",{context:e}),this.isOffline())return this.debug("checkFlags offline result: returning empty object"),{};let t=`${this.apiUrl}/flags/check`,i=JSON.stringify(e);return fetch(t,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8","X-Schematic-Api-Key":this.apiKey},body:i}).then(r=>{if(!r.ok)throw new Error("Network response was not ok");return r.json()}).then(r=>{let l=Y(r);return this.debug("checkFlags result:",l),(l?.data?.flags??[]).reduce((s,p)=>(s[p.flag]=p.value,s),{})}).catch(r=>(console.warn("There was a problem with the fetch operation:",r),{}))};identify=e=>(this.debug("identify:",e),this.setContext({company:e.company?.keys,user:e.keys}).catch(t=>{console.warn("Error setting context:",t)}),this.handleEvent("identify",e));setContext=async e=>{if(this.isOffline()||!this.useWebSocket)return this.context=e,this.flushContextDependentEventQueue(),this.setIsPending(!1),Promise.resolve();if(!(S(e)===S(this.context)&&this.conn!==null&&!this.isPending))try{if(this.setIsPending(!0),!this.conn){if(this.isConnecting){for(this.debug("Connection already in progress, waiting for it to complete");this.isConnecting&&this.conn===null;)await new Promise(i=>setTimeout(i,10));if(this.conn!==null){let i=await this.conn;await this.wsSendMessage(i,e);return}}this.wsReconnectTimer!==null&&(this.debug("Cancelling scheduled reconnection, connecting immediately"),clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.isConnecting=!0;try{this.conn=this.wsConnect();let i=await this.conn;this.isConnecting=!1,await this.wsSendMessage(i,e);return}catch(i){throw this.isConnecting=!1,i}}let t=await this.conn;await this.wsSendMessage(t,e)}catch(t){console.warn("Failed to establish WebSocket connection:",t),this.context=e,this.flushContextDependentEventQueue(),this.setIsPending(!1),this.attemptReconnect()}};track=e=>{let{company:t,user:i,event:r,traits:l,quantity:s=1}=e;if(!this.hasContext(t,i)){this.debug(`track: queuing event "${r}" until context is available`);let u={api_key:this.apiKey,body:{company:t,event:r,traits:l??{},user:i,quantity:s},sent_at:new Date().toISOString(),tracker_event_id:C(),tracker_user_id:this.getAnonymousId(),type:"track"};return this.contextDependentEventQueue.push(u),Promise.resolve()}let p={company:t??this.context.company,event:r,traits:l??{},user:i??this.context.user,quantity:s};return this.debug("track:",p),r in this.featureUsageEventMap&&this.optimisticallyUpdateFeatureUsage(r,s),this.handleEvent("track",p)};optimisticallyUpdateFeatureUsage=(e,t=1)=>{let i=this.featureUsageEventMap[e];i!=null&&(this.debug(`Optimistically updating feature usage for event: ${e}`,{quantity:t}),Object.entries(i).forEach(([r,l])=>{if(l===void 0)return;let s={...l};if(typeof s.featureUsage=="number"){if(s.featureUsage+=t,typeof s.featureAllocation=="number"){let u=s.featureUsageExceeded===!0,f=s.featureUsage>=s.featureAllocation;f!==u&&(s.featureUsageExceeded=f,f&&(s.value=!1),this.debug(`Usage limit status changed for flag: ${r}`,{was:u?"exceeded":"within limits",now:f?"exceeded":"within limits",featureUsage:s.featureUsage,featureAllocation:s.featureAllocation,value:s.value}))}this.featureUsageEventMap[e]!==void 0&&(this.featureUsageEventMap[e][r]=s);let p=S(this.context);this.checks[p]!==void 0&&this.checks[p]!==null&&(this.checks[p][r]=s),this.notifyFlagCheckListeners(r,s),this.notifyFlagValueListeners(r,s.value)}}))};hasContext=(e,t)=>{let i=e!=null&&Object.keys(e).length>0||t!=null&&Object.keys(t).length>0,r=this.context.company!==void 0&&this.context.company!==null&&Object.keys(this.context.company).length>0||this.context.user!==void 0&&this.context.user!==null&&Object.keys(this.context.user).length>0;return i||r};flushContextDependentEventQueue=()=>{for(this.debug(`flushing ${this.contextDependentEventQueue.length} context-dependent events`);this.contextDependentEventQueue.length>0;){let e=this.contextDependentEventQueue.shift();if(e)if(e.type==="track"&&typeof e.body=="object"&&e.body!==null){let t=e.body,i={...t,company:t.company??this.context.company,user:t.user??this.context.user},r={...e,body:i,sent_at:new Date().toISOString()};this.sendEvent(r)}else this.sendEvent(e)}};startRetryTimer=()=>{this.retryTimer===null&&(this.retryTimer=setInterval(()=>{this.flushEventQueue().catch(e=>{this.debug("Error in retry timer flush:",e)}),this.eventQueue.length===0&&this.stopRetryTimer()},5e3),this.debug("Started retry timer"))};stopRetryTimer=()=>{this.retryTimer!==null&&(clearInterval(this.retryTimer),this.retryTimer=null,this.debug("Stopped retry timer"))};flushEventQueue=async()=>{if(this.eventQueue.length===0)return;let e=Date.now(),t=[],i=[];for(let r of this.eventQueue)r.next_retry_at===void 0||r.next_retry_at<=e?t.push(r):i.push(r);if(t.length===0){this.debug(`No events ready for retry yet (${i.length} still in backoff)`);return}this.debug(`Flushing event queue: ${t.length} ready, ${i.length} waiting`),this.eventQueue=i;for(let r of t)try{await this.sendEvent(r),this.debug("Queued event sent successfully:",r.type)}catch(l){this.debug("Failed to send queued event:",l)}};getAnonymousId=()=>{if(!this.storage)return C();let e=this.storage.getItem(Ie);if(typeof e<"u")return e;let t=C();return this.storage.setItem(Ie,t),t};handleEvent=(e,t)=>{let i={api_key:this.apiKey,body:t,sent_at:new Date().toISOString(),tracker_event_id:C(),tracker_user_id:this.getAnonymousId(),type:e};return typeof document<"u"&&document?.hidden?this.storeEvent(i):this.sendEvent(i)};sendEvent=async e=>{let t=`${this.eventUrl}/e`,i=JSON.stringify(e);if(this.debug("sending event:",{url:t,event:e}),this.isOffline())return this.debug("event not sent (offline mode):",{event:e}),Promise.resolve();try{let r=await fetch(t,{method:"POST",headers:{...this.additionalHeaders??{},"Content-Type":"application/json;charset=UTF-8"},body:i});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);this.debug("event sent:",{status:r.status,statusText:r.statusText})}catch(r){let l=(e.retry_count??0)+1;if(l<=this.maxEventRetries){this.debug(`Event failed to send (attempt ${l}/${this.maxEventRetries}), queueing for retry:`,r);let s=this.eventRetryInitialDelay*Math.pow(2,l-1),p=Math.min(s,this.eventRetryMaxDelay),u=Date.now()+p,f={...e,retry_count:l,next_retry_at:u};this.eventQueue.length<this.maxEventQueueSize?(this.eventQueue.push(f),this.debug(`Event queued for retry in ${p}ms (${this.eventQueue.length}/${this.maxEventQueueSize})`)):(this.debug(`Event queue full (${this.maxEventQueueSize}), dropping oldest event`),this.eventQueue.shift(),this.eventQueue.push(f)),this.startRetryTimer()}else this.debug(`Event failed permanently after ${this.maxEventRetries} attempts, dropping:`,r)}return Promise.resolve()};storeEvent=e=>(this.eventQueue.push(e),Promise.resolve());forceReconnect=async()=>this.reconnect({force:!0});reconnectIfNeeded=async()=>this.reconnect({force:!1});reconnect=async e=>{let{force:t}=e,i=t?"forceReconnect":"reconnectIfNeeded";if(this.isOffline())return this.debug(`${i}: skipped (offline mode)`),Promise.resolve();if(!t&&this.conn!==null)try{if((await this.conn).readyState===WebSocket.OPEN)return this.debug(`${i}: connection is healthy, skipping`),Promise.resolve()}catch{}if(this.debug(`${i}: ${t?"forcing immediate reconnection":"reconnecting"}`),this.wsIntentionalDisconnect=!1,this.wsReconnectTimer!==null&&(this.debug(`${i}: cancelling pending reconnection timer`),clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.wsReconnectAttempts=0,this.conn!==null){this.debug(`${i}: closing existing connection`);try{let r=await this.conn;this.currentWebSocket===r&&(this.currentWebSocket=null),(r.readyState===WebSocket.OPEN||r.readyState===WebSocket.CONNECTING)&&r.close()}catch(r){this.debug(`${i}: error closing existing connection:`,r)}this.conn=null,this.isConnecting=!1}if(this.context.company!==void 0||this.context.user!==void 0){this.debug(`${i}: reconnecting with existing context`);try{this.isConnecting=!0,this.conn=this.wsConnect();let r=await this.conn;this.isConnecting=!1,await this.wsSendMessage(r,this.context,!0),this.debug(`${i}: reconnection successful`)}catch(r){this.isConnecting=!1,this.debug(`${i}: reconnection failed:`,r)}}else this.debug(`${i}: no context set, skipping reconnection`);return Promise.resolve()};cleanup=async()=>{if(this.isOffline())return this.debug("cleanup: skipped (offline mode)"),Promise.resolve();if(this.wsIntentionalDisconnect=!0,this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.stopRetryTimer(),this.conn)try{let e=await this.conn;this.currentWebSocket===e&&(this.debug("Cleaning up current websocket tracking"),this.currentWebSocket=null),e.close()}catch(e){console.warn("Error during cleanup:",e)}finally{this.conn=null,this.currentWebSocket=null,this.isConnecting=!1}};calculateReconnectDelay=()=>{let e=this.webSocketInitialRetryDelay*Math.pow(2,this.wsReconnectAttempts),t=Math.min(e,this.webSocketMaxRetryDelay),i=Math.random()*t*.5,r=t+i;return this.debug(`Reconnect delay calculated: ${r.toFixed(0)}ms (attempt ${this.wsReconnectAttempts+1}/${this.webSocketMaxReconnectAttempts})`),r};handleNetworkOffline=async()=>{if(this.conn!==null){try{let e=await this.conn;(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close()}catch(e){this.debug("Error closing connection on offline:",e)}this.conn=null}this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null)};handleNetworkOnline=()=>{this.debug("Network online, attempting reconnection and flushing queued events"),this.wsReconnectAttempts=0,this.wsReconnectTimer!==null&&(clearTimeout(this.wsReconnectTimer),this.wsReconnectTimer=null),this.flushEventQueue().catch(e=>{this.debug("Error flushing event queue on network online:",e)}),this.attemptReconnect()};attemptReconnect=()=>{if(this.wsReconnectAttempts>=this.webSocketMaxReconnectAttempts){this.debug(`Maximum reconnection attempts (${this.webSocketMaxReconnectAttempts}) reached, giving up`);return}if(this.wsReconnectTimer!==null){this.debug("Reconnection attempt already scheduled, ignoring duplicate request");return}let e=this.calculateReconnectDelay();this.debug(`Scheduling reconnection attempt ${this.wsReconnectAttempts+1}/${this.webSocketMaxReconnectAttempts} in ${e.toFixed(0)}ms`),this.wsReconnectTimer=setTimeout(async()=>{this.wsReconnectTimer=null,this.wsReconnectAttempts++,this.debug(`Attempting to reconnect (attempt ${this.wsReconnectAttempts}/${this.webSocketMaxReconnectAttempts})`);try{if(this.conn!==null){this.debug("Cleaning up existing connection before reconnection");try{let t=await this.conn;this.currentWebSocket===t&&(this.debug("Existing websocket is current, will be replaced"),this.currentWebSocket=null),(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close()}catch(t){this.debug("Error cleaning up existing connection:",t)}this.conn=null,this.currentWebSocket=null,this.isConnecting=!1}this.isConnecting=!0;try{this.conn=this.wsConnect();let t=await this.conn;this.isConnecting=!1,this.debug("Reconnection context check:",{hasCompany:this.context.company!==void 0,hasUser:this.context.user!==void 0,context:this.context}),this.context.company!==void 0||this.context.user!==void 0?(this.debug("Reconnected, force re-sending context"),await this.wsSendMessage(t,this.context,!0)):(this.debug("No context to re-send after reconnection - websocket ready for new context"),this.debug("Setting up tracking for reconnected websocket (no context to send)"),this.currentWebSocket=t),this.flushEventQueue().catch(i=>{this.debug("Error flushing event queue after websocket reconnection:",i)}),this.debug("Reconnection successful")}catch(t){throw this.isConnecting=!1,t}}catch(t){this.debug("Reconnection attempt failed:",t)}},e)};wsConnect=async()=>{if(this.isOffline())throw this.debug("wsConnect: skipped (offline mode)"),new Error("WebSocket connection skipped in offline mode");let e=null,t=this.webSocketMaxConnectionAttempts;for(let i=0;i<t;i++)try{let r=await this.wsConnectOnce();return this.wsReconnectAttempts=0,r}catch(r){if(e=r instanceof Error?r:new Error(String(r)),!(e.message==="WebSocket connection timeout"))throw this.debug("WebSocket connection failed with non-timeout error, not retrying:",e.message),e;if(i<t-1){let s=this.webSocketInitialRetryDelay*Math.pow(2,i),p=Math.min(s,this.webSocketMaxRetryDelay),u=p*.2*Math.random(),f=p+u;this.debug(`WebSocket connection timeout (attempt ${i+1}/${t}), retrying in ${f.toFixed(0)}ms`),await new Promise(P=>setTimeout(P,f))}else this.debug(`WebSocket connection timeout (attempt ${i+1}/${t}), no more retries`)}throw e??new Error("WebSocket connection failed")};wsConnectOnce=()=>new Promise((e,t)=>{let i=`${this.webSocketUrl}/flags/bootstrap?apiKey=${this.apiKey}`;this.debug("connecting to WebSocket:",i);let r=new WebSocket(i),l=Math.random().toString(36).substring(7);this.debug(`Creating WebSocket connection ${l} to ${i}`);let s=null,p=!1;s=setTimeout(()=>{p||(p=!0,this.debug(`WebSocket connection timeout after ${this.webSocketConnectionTimeout}ms`),r.close(),t(new Error("WebSocket connection timeout")))},this.webSocketConnectionTimeout),r.onopen=()=>{p||(p=!0,s!==null&&clearTimeout(s),this.wsIntentionalDisconnect=!1,this.debug(`WebSocket connection ${l} opened successfully`),e(r))},r.onerror=u=>{if(p)return;p=!0,s!==null&&clearTimeout(s),this.debug(`WebSocket connection ${l} error:`,u);let f=new Error("WebSocket connection failed during handshake");t(f)},r.onclose=()=>{s!==null&&clearTimeout(s),this.debug(`WebSocket connection ${l} closed`),this.conn=null,this.currentWebSocket===r&&(this.currentWebSocket=null,this.isConnecting=!1),!p&&!this.wsIntentionalDisconnect&&this.webSocketReconnect&&this.attemptReconnect()}});wsSendMessage=(e,t,i=!1)=>this.isOffline()?(this.debug("wsSendMessage: skipped (offline mode)"),this.setIsPending(!1),Promise.resolve()):new Promise((r,l)=>{if(!i&&S(t)==S(this.context))return this.debug("WebSocket context unchanged, skipping update"),r(this.setIsPending(!1));this.debug(i?"WebSocket force sending context (reconnection):":"WebSocket context updated:",t),this.context=t;let s=()=>{let p=!1,u=this.createPersistentMessageHandler(t),f=D=>{u(D),p||(p=!0,r())};e.addEventListener("message",f),e.addEventListener("close",D=>{p||(p=!0,D.code===4001?l(new Error(`Authentication failed: ${D.reason!==""?D.reason:"Invalid API key"}`)):l(new Error("WebSocket connection closed unexpectedly")))}),this.currentWebSocket=e;let P=this.additionalHeaders["X-Schematic-Client-Version"]??`schematic-js@${j}`,y={apiKey:this.apiKey,clientVersion:P,data:t};this.debug("WebSocket sending message:",y),e.send(JSON.stringify(y))};e.readyState===WebSocket.OPEN?(this.debug("WebSocket already open, sending message"),s()):e.readyState===WebSocket.CONNECTING?(this.debug("WebSocket connecting, waiting for open to send message"),e.addEventListener("open",s)):(this.debug("WebSocket is closed, cannot send message"),l("WebSocket is not open or connecting"))});getIsPending=()=>this.isPending;addIsPendingListener=e=>(this.isPendingListeners.add(e),()=>{this.isPendingListeners.delete(e)});setIsPending=e=>{this.isPending!==e&&(this.isPending=e,this.isPendingListeners.forEach(t=>Qt(t,e)))};getPlan=()=>{let e=S(this.context);return this.planChecks[e]};getFlagCheck=e=>{let t=S(this.context),r=(this.checks[t]??{})[e];if(r!==void 0)return r;if(e in this.flagCheckDefaults||e in this.flagValueDefaults)return e in this.fallbackCheckCache||(this.fallbackCheckCache[e]=this.resolveFallbackCheckFlagReturn(e,void 0,"Default value used")),this.fallbackCheckCache[e]};getFlagValue=e=>{let t=S(this.context),r=(this.checks[t]??{})[e];if(r?.value!==void 0)return r.value;if(e in this.flagCheckDefaults||e in this.flagValueDefaults)return this.resolveFallbackValue(e)};addFlagValueListener=(e,t)=>(e in this.flagValueListeners||(this.flagValueListeners[e]=new Set),this.flagValueListeners[e].add(t),()=>{this.flagValueListeners[e].delete(t)});addFlagCheckListener=(e,t)=>(e in this.flagCheckListeners||(this.flagCheckListeners[e]=new Set),this.flagCheckListeners[e].add(t),()=>{this.flagCheckListeners[e].delete(t)});addPlanListener=e=>(this.planListeners.add(e),()=>{this.planListeners.delete(e)});notifyFlagCheckListeners=(e,t)=>{let i=this.flagCheckListeners?.[e]??[];i.size>0&&this.debug(`Notifying ${i.size} flag check listeners for ${e}`,t),typeof t.featureUsageEvent=="string"&&this.updateFeatureUsageEventMap(t),i.forEach(r=>Kt(r,t))};updateFeatureUsageEventMap=e=>{if(typeof e.featureUsageEvent!="string")return;let t=e.featureUsageEvent;(this.featureUsageEventMap[t]===void 0||this.featureUsageEventMap[t]===null)&&(this.featureUsageEventMap[t]={}),this.featureUsageEventMap[t]!==void 0&&(this.featureUsageEventMap[t][e.flag]=e),this.debug(`Updated featureUsageEventMap for event: ${t}, flag: ${e.flag}`,e)};notifyFlagValueListeners=(e,t)=>{let i=this.flagValueListeners?.[e]??[];i.size>0&&this.debug(`Notifying ${i.size} flag value listeners for ${e}`,{value:t}),i.forEach((r,l)=>{this.debug(`Calling listener ${l} for flag ${e}`,{flagKey:e,value:t}),Xt(r,t),this.debug(`Listener ${l} for flag ${e} completed`,{flagKey:e,value:t})})};notifyPlanListeners=e=>{let t=this.planListeners??[];t.size>0&&this.debug(`Notifying ${t.size} plan listeners`,{value:e}),t.forEach((i,r)=>{this.debug(`Calling listener ${r} for plan`,{value:e}),Yt(i,e),this.debug(`Listener ${r} for plan completed`,{value:e})})}},Qt=(n,e)=>{n.length>0?n(e):n()},Kt=(n,e)=>{n.length>0?n(e):n()},Xt=(n,e)=>{n.length>0?n(e):n()},Yt=(n,e)=>{n.length>0?n(e):n()};window.Schematic=L;})();
3
3
  /* @preserve */
@@ -577,6 +577,7 @@ __export(index_exports, {
577
577
  EventBodyFlagCheckToJSON: () => EventBodyFlagCheckToJSON,
578
578
  RuleType: () => RuleType,
579
579
  Schematic: () => Schematic,
580
+ TrialStatus: () => TrialStatus,
580
581
  UsagePeriod: () => UsagePeriod
581
582
  });
582
583
  module.exports = __toCommonJS(index_exports);
@@ -714,6 +715,19 @@ function CheckFlagResponseFromJSONTyped(json, ignoreDiscriminator) {
714
715
  };
715
716
  }
716
717
 
718
+ // src/types/api/models/TrialStatus.ts
719
+ var TrialStatus = {
720
+ Active: "active",
721
+ Converted: "converted",
722
+ Expired: "expired"
723
+ };
724
+ function TrialStatusFromJSON(json) {
725
+ return TrialStatusFromJSONTyped(json, false);
726
+ }
727
+ function TrialStatusFromJSONTyped(json, ignoreDiscriminator) {
728
+ return json;
729
+ }
730
+
717
731
  // src/types/api/models/DatastreamCompanyPlan.ts
718
732
  function DatastreamCompanyPlanFromJSON(json) {
719
733
  return DatastreamCompanyPlanFromJSONTyped(json, false);
@@ -725,7 +739,8 @@ function DatastreamCompanyPlanFromJSONTyped(json, ignoreDiscriminator) {
725
739
  return {
726
740
  id: json["id"],
727
741
  name: json["name"],
728
- trialEndDate: json["trial_end_date"] == null ? void 0 : new Date(json["trial_end_date"])
742
+ trialEndDate: json["trial_end_date"] == null ? void 0 : new Date(json["trial_end_date"]),
743
+ trialStatus: json["trial_status"] == null ? void 0 : TrialStatusFromJSON(json["trial_status"])
729
744
  };
730
745
  }
731
746
 
@@ -836,11 +851,12 @@ var CheckFlagReturnFromJSON = (json) => {
836
851
  };
837
852
  };
838
853
  var CheckPlanReturnFromJSON = (json) => {
839
- const { id, name, trialEndDate } = DatastreamCompanyPlanFromJSON(json);
854
+ const { id, name, trialEndDate, trialStatus } = DatastreamCompanyPlanFromJSON(json);
840
855
  return {
841
856
  id,
842
857
  name,
843
- trialEndDate: trialEndDate == null ? void 0 : trialEndDate
858
+ trialEndDate: trialEndDate == null ? void 0 : trialEndDate,
859
+ trialStatus: trialStatus == null ? void 0 : trialStatus
844
860
  };
845
861
  };
846
862
 
@@ -861,7 +877,7 @@ function contextString(context) {
861
877
  }
862
878
 
863
879
  // src/version.ts
864
- var version = "1.3.0";
880
+ var version = "1.3.1";
865
881
 
866
882
  // src/index.ts
867
883
  var anonymousIdKey = "schematicId";
@@ -214,23 +214,13 @@ export declare type CheckPlanReturn = {
214
214
  id: string;
215
215
  name: string;
216
216
  trialEndDate?: Date;
217
+ trialStatus?: TrialStatus;
217
218
  };
218
219
 
219
220
  export declare const CheckPlanReturnFromJSON: (json: any) => CheckPlanReturn;
220
221
 
221
222
  export declare type CheckPlanReturnListenerFn = (value: CheckPlanReturn) => void;
222
223
 
223
- /**
224
- * Schematic API
225
- * Schematic API
226
- *
227
- * The version of the OpenAPI document: 0.1
228
- *
229
- *
230
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
231
- * https://openapi-generator.tech
232
- * Do not edit the class manually.
233
- */
234
224
  /**
235
225
  *
236
226
  * @export
@@ -255,6 +245,12 @@ declare interface DatastreamCompanyPlan {
255
245
  * @memberof DatastreamCompanyPlan
256
246
  */
257
247
  trialEndDate?: Date | null;
248
+ /**
249
+ *
250
+ * @type {TrialStatus}
251
+ * @memberof DatastreamCompanyPlan
252
+ */
253
+ trialStatus?: TrialStatus | null;
258
254
  }
259
255
 
260
256
  export declare function DatastreamCompanyPlanFromJSON(json: any): DatastreamCompanyPlan;
@@ -838,6 +834,18 @@ export declare type StoragePersister = {
838
834
  */
839
835
  export declare type Traits = Record<string, any>;
840
836
 
837
+ /**
838
+ *
839
+ * @export
840
+ */
841
+ export declare const TrialStatus: {
842
+ readonly Active: "active";
843
+ readonly Converted: "converted";
844
+ readonly Expired: "expired";
845
+ };
846
+
847
+ export declare type TrialStatus = (typeof TrialStatus)[keyof typeof TrialStatus];
848
+
841
849
  export declare enum UsagePeriod {
842
850
  ALL_TIME = "all_time",
843
851
  CURRENT_DAY = "current_day",
@@ -693,6 +693,19 @@ function CheckFlagResponseFromJSONTyped(json, ignoreDiscriminator) {
693
693
  };
694
694
  }
695
695
 
696
+ // src/types/api/models/TrialStatus.ts
697
+ var TrialStatus = {
698
+ Active: "active",
699
+ Converted: "converted",
700
+ Expired: "expired"
701
+ };
702
+ function TrialStatusFromJSON(json) {
703
+ return TrialStatusFromJSONTyped(json, false);
704
+ }
705
+ function TrialStatusFromJSONTyped(json, ignoreDiscriminator) {
706
+ return json;
707
+ }
708
+
696
709
  // src/types/api/models/DatastreamCompanyPlan.ts
697
710
  function DatastreamCompanyPlanFromJSON(json) {
698
711
  return DatastreamCompanyPlanFromJSONTyped(json, false);
@@ -704,7 +717,8 @@ function DatastreamCompanyPlanFromJSONTyped(json, ignoreDiscriminator) {
704
717
  return {
705
718
  id: json["id"],
706
719
  name: json["name"],
707
- trialEndDate: json["trial_end_date"] == null ? void 0 : new Date(json["trial_end_date"])
720
+ trialEndDate: json["trial_end_date"] == null ? void 0 : new Date(json["trial_end_date"]),
721
+ trialStatus: json["trial_status"] == null ? void 0 : TrialStatusFromJSON(json["trial_status"])
708
722
  };
709
723
  }
710
724
 
@@ -815,11 +829,12 @@ var CheckFlagReturnFromJSON = (json) => {
815
829
  };
816
830
  };
817
831
  var CheckPlanReturnFromJSON = (json) => {
818
- const { id, name, trialEndDate } = DatastreamCompanyPlanFromJSON(json);
832
+ const { id, name, trialEndDate, trialStatus } = DatastreamCompanyPlanFromJSON(json);
819
833
  return {
820
834
  id,
821
835
  name,
822
- trialEndDate: trialEndDate == null ? void 0 : trialEndDate
836
+ trialEndDate: trialEndDate == null ? void 0 : trialEndDate,
837
+ trialStatus: trialStatus == null ? void 0 : trialStatus
823
838
  };
824
839
  };
825
840
 
@@ -840,7 +855,7 @@ function contextString(context) {
840
855
  }
841
856
 
842
857
  // src/version.ts
843
- var version = "1.3.0";
858
+ var version = "1.3.1";
844
859
 
845
860
  // src/index.ts
846
861
  var anonymousIdKey = "schematicId";
@@ -2283,6 +2298,7 @@ export {
2283
2298
  EventBodyFlagCheckToJSON,
2284
2299
  RuleType,
2285
2300
  Schematic,
2301
+ TrialStatus,
2286
2302
  UsagePeriod
2287
2303
  };
2288
2304
  /* @preserve */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schematichq/schematic-js",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "main": "dist/schematic.cjs.js",
5
5
  "module": "dist/schematic.esm.js",
6
6
  "types": "dist/schematic.d.ts",
@@ -38,19 +38,19 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@eslint/js": "^10.0.1",
41
- "@microsoft/api-extractor": "^7.57.7",
42
- "@openapitools/openapi-generator-cli": "^2.30.2",
41
+ "@microsoft/api-extractor": "^7.58.1",
42
+ "@openapitools/openapi-generator-cli": "^2.31.0",
43
43
  "@vitest/browser": "^4.0.18",
44
- "esbuild": "^0.27.4",
45
- "eslint": "^10.0.3",
44
+ "esbuild": "^0.28.0",
45
+ "eslint": "^10.1.0",
46
46
  "globals": "^17.4.0",
47
- "happy-dom": "^20.8.4",
47
+ "happy-dom": "^20.8.9",
48
48
  "husky": "^9.1.7",
49
- "jsdom": "^29.0.0",
49
+ "jsdom": "^29.0.1",
50
50
  "mock-socket": "^9.3.1",
51
51
  "prettier": "^3.8.1",
52
- "typescript": "^5.9.3",
53
- "typescript-eslint": "^8.57.0",
52
+ "typescript": "^6.0.2",
53
+ "typescript-eslint": "^8.58.0",
54
54
  "vitest": "^4.0.18"
55
55
  },
56
56
  "resolutions": {