@knocklabs/client 0.15.0 → 0.15.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.2
4
+
5
+ ### Patch Changes
6
+
7
+ - fb68ce1: feat: adds javascript client version to user agent
8
+
9
+ ## 0.15.1
10
+
11
+ ### Patch Changes
12
+
13
+ - befd7b9: fix: when reseting the feed, real-time notifications stop working
14
+
3
15
  ## 0.15.0
4
16
 
5
17
  ### Minor Changes
package/dist/cjs/api.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var n=(t,e,s)=>e in t?i(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var r=(t,e,s)=>n(t,typeof e!="symbol"?e+"":e,s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("axios"),l=require("axios-retry"),c=require("phoenix"),a=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},p=a(u),o=a(l);class d{constructor(e){r(this,"host");r(this,"apiKey");r(this,"userToken");r(this,"axiosClient");r(this,"socket");this.host=e.host,this.apiKey=e.apiKey,this.userToken=e.userToken||null,this.axiosClient=p.default.create({baseURL:this.host,headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Knock-User-Token":this.userToken}}),typeof window<"u"&&(this.socket=new c.Socket(`${this.host.replace("http","ws")}/ws/v1`,{params:{user_token:this.userToken,api_key:this.apiKey}})),o.default(this.axiosClient,{retries:3,retryCondition:this.canRetryRequest,retryDelay:o.default.exponentialDelay})}async makeRequest(e){try{const s=await this.axiosClient(e);return{statusCode:s.status<300?"ok":"error",body:s.data,error:void 0,status:s.status}}catch(s){return console.error(s),{statusCode:"error",status:500,body:void 0,error:s}}}canRetryRequest(e){return o.default.isNetworkError(e)?!0:e.response?e.response.status>=500&&e.response.status<=599||e.response.status===429:!1}}exports.default=d;
1
+ "use strict";var a=Object.defineProperty;var n=(t,e,s)=>e in t?a(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var r=(t,e,s)=>n(t,typeof e!="symbol"?e+"":e,s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("axios"),l=require("axios-retry"),c=require("phoenix"),i=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},h=i(u),o=i(l);class p{constructor(e){r(this,"host");r(this,"apiKey");r(this,"userToken");r(this,"axiosClient");r(this,"socket");this.host=e.host,this.apiKey=e.apiKey,this.userToken=e.userToken||null,this.axiosClient=h.default.create({baseURL:this.host,headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Knock-User-Token":this.userToken,"User-Agent":this.getUserAgent()}}),typeof window<"u"&&(this.socket=new c.Socket(`${this.host.replace("http","ws")}/ws/v1`,{params:{user_token:this.userToken,api_key:this.apiKey}})),o.default(this.axiosClient,{retries:3,retryCondition:this.canRetryRequest,retryDelay:o.default.exponentialDelay})}async makeRequest(e){try{const s=await this.axiosClient(e);return{statusCode:s.status<300?"ok":"error",body:s.data,error:void 0,status:s.status}}catch(s){return console.error(s),{statusCode:"error",status:500,body:void 0,error:s}}}canRetryRequest(e){return o.default.isNetworkError(e)?!0:e.response?e.response.status>=500&&e.response.status<=599||e.response.status===429:!1}getUserAgent(){return"Knock/ClientJS 0.15.2"}}exports.default=p;
2
2
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../src/api.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n\n public socket: Socket | undefined;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n },\n });\n\n if (typeof window !== \"undefined\") {\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n }\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n}\n\nexport default ApiClient;\n"],"names":["ApiClient","options","__publicField","axios","Socket","axiosRetry","req","result","e","error"],"mappings":"6ZAmBA,MAAMA,CAAU,CAQd,YAAYC,EAA2B,CAP/BC,EAAA,aACAA,EAAA,eACAA,EAAA,kBACAA,EAAA,oBAEDA,EAAA,eAGL,KAAK,KAAOD,EAAQ,KACpB,KAAK,OAASA,EAAQ,OACjB,KAAA,UAAYA,EAAQ,WAAa,KAGjC,KAAA,YAAcE,UAAM,OAAO,CAC9B,QAAS,KAAK,KACd,QAAS,CACP,OAAQ,mBACR,eAAgB,mBAChB,cAAe,UAAU,KAAK,MAAM,GACpC,qBAAsB,KAAK,SAAA,CAC7B,CACD,EAEG,OAAO,OAAW,MACf,KAAA,OAAS,IAAIC,EAAA,OAAO,GAAG,KAAK,KAAK,QAAQ,OAAQ,IAAI,CAAC,SAAU,CACnE,OAAQ,CACN,WAAY,KAAK,UACjB,QAAS,KAAK,MAAA,CAChB,CACD,GAGHC,EAAA,QAAW,KAAK,YAAa,CAC3B,QAAS,EACT,eAAgB,KAAK,gBACrB,WAAYA,EAAAA,QAAW,gBAAA,CACxB,CAAA,CAGH,MAAM,YAAYC,EAA+C,CAC3D,GAAA,CACF,MAAMC,EAAS,MAAM,KAAK,YAAYD,CAAG,EAElC,MAAA,CACL,WAAYC,EAAO,OAAS,IAAM,KAAO,QACzC,KAAMA,EAAO,KACb,MAAO,OACP,OAAQA,EAAO,MACjB,QAGOC,EAAY,CACnB,eAAQ,MAAMA,CAAC,EAER,CACL,WAAY,QACZ,OAAQ,IACR,KAAM,OACN,MAAOA,CACT,CAAA,CACF,CAGM,gBAAgBC,EAAmB,CAErC,OAAAJ,EAAA,QAAW,eAAeI,CAAK,EAC1B,GAGJA,EAAM,SAMPA,EAAM,SAAS,QAAU,KAAOA,EAAM,SAAS,QAAU,KAKzDA,EAAM,SAAS,SAAW,IATrB,EAaF,CAEX"}
1
+ {"version":3,"file":"api.js","sources":["../../src/api.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n\n public socket: Socket | undefined;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n \"User-Agent\": this.getUserAgent(),\n },\n });\n\n if (typeof window !== \"undefined\") {\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n }\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n\n private getUserAgent() {\n // Note: we're following format used in our Stainless SDKs:\n // https://github.com/knocklabs/knock-node/blob/main/src/client.ts#L335\n // If we add the env var to turbo.json, it caches it so the version\n // never actually updates.\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n return `Knock/ClientJS ${process.env.CLIENT_PACKAGE_VERSION}`;\n }\n}\n\nexport default ApiClient;\n"],"names":["ApiClient","options","__publicField","axios","Socket","axiosRetry","req","result","e","error"],"mappings":"6ZAmBA,MAAMA,CAAU,CAQd,YAAYC,EAA2B,CAP/BC,EAAA,aACAA,EAAA,eACAA,EAAA,kBACAA,EAAA,oBAEDA,EAAA,eAGL,KAAK,KAAOD,EAAQ,KACpB,KAAK,OAASA,EAAQ,OACjB,KAAA,UAAYA,EAAQ,WAAa,KAGjC,KAAA,YAAcE,UAAM,OAAO,CAC9B,QAAS,KAAK,KACd,QAAS,CACP,OAAQ,mBACR,eAAgB,mBAChB,cAAe,UAAU,KAAK,MAAM,GACpC,qBAAsB,KAAK,UAC3B,aAAc,KAAK,aAAa,CAAA,CAClC,CACD,EAEG,OAAO,OAAW,MACf,KAAA,OAAS,IAAIC,EAAA,OAAO,GAAG,KAAK,KAAK,QAAQ,OAAQ,IAAI,CAAC,SAAU,CACnE,OAAQ,CACN,WAAY,KAAK,UACjB,QAAS,KAAK,MAAA,CAChB,CACD,GAGHC,EAAA,QAAW,KAAK,YAAa,CAC3B,QAAS,EACT,eAAgB,KAAK,gBACrB,WAAYA,EAAAA,QAAW,gBAAA,CACxB,CAAA,CAGH,MAAM,YAAYC,EAA+C,CAC3D,GAAA,CACF,MAAMC,EAAS,MAAM,KAAK,YAAYD,CAAG,EAElC,MAAA,CACL,WAAYC,EAAO,OAAS,IAAM,KAAO,QACzC,KAAMA,EAAO,KACb,MAAO,OACP,OAAQA,EAAO,MACjB,QAGOC,EAAY,CACnB,eAAQ,MAAMA,CAAC,EAER,CACL,WAAY,QACZ,OAAQ,IACR,KAAM,OACN,MAAOA,CACT,CAAA,CACF,CAGM,gBAAgBC,EAAmB,CAErC,OAAAJ,EAAA,QAAW,eAAeI,CAAK,EAC1B,GAGJA,EAAM,SAMPA,EAAM,SAAS,QAAU,KAAOA,EAAM,SAAS,QAAU,KAKzDA,EAAM,SAAS,SAAW,IATrB,EAaF,CAGD,cAAe,CAMd,MAAA,uBAAoD,CAE/D"}
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var g=(s,t,e)=>t in s?f(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e;var l=(s,t,e)=>g(s,typeof t!="symbol"?t+"":t,e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const p=require("@tanstack/store"),d=require("../../networkStatus.js"),S=require("./utils.js");function m(s){const t=S.deduplicateItems(s);return S.sortItems(t)}const w={shouldSetPage:!0,shouldAppend:!1},u={items:[],metadata:{total_count:0,unread_count:0,unseen_count:0},pageInfo:{before:null,after:null,page_size:50},loading:!1,networkStatus:d.NetworkStatus.ready,setResult:()=>{},setMetadata:()=>{},setNetworkStatus:()=>{},resetStore:()=>{},setItemAttrs:()=>{}},k=()=>{const s=new p.Store(u);return s.setState(t=>({...t,networkStatus:d.NetworkStatus.ready,loading:!1,setNetworkStatus:e=>s.setState(r=>({...r,networkStatus:e,loading:e===d.NetworkStatus.loading})),setResult:({entries:e,meta:r,page_info:i},o=w)=>s.setState(a=>{const n=o.shouldAppend?m(a.items.concat(e)):e;return{...a,items:n,metadata:r,pageInfo:o.shouldSetPage?i:a.pageInfo,loading:!1,networkStatus:d.NetworkStatus.ready}}),setMetadata:e=>s.setState(r=>({...r,metadata:e})),resetStore:(e=u.metadata)=>s.setState(()=>({...u,metadata:e})),setItemAttrs:(e,r)=>{const i=e.reduce((o,a)=>({...o,[a]:r}),{});return s.setState(o=>{const a=o.items.map(n=>i[n.id]?{...n,...i[n.id]}:n);return{...o,items:a}})}})),s};class c{constructor(t){l(this,"store");this.store=t}getState(){return this.store.state}setState(t){this.store.setState(typeof t=="function"?t:()=>t)}getInitialState(){return u}subscribe(t){return this.store.subscribe(e=>t(e.currentVal))}}function I(){const s=k();return new c(s)}exports.FeedStore=c;exports.default=I;exports.initialStoreState=u;
1
+ "use strict";var f=Object.defineProperty;var g=(t,e,s)=>e in t?f(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var d=(t,e,s)=>g(t,typeof e!="symbol"?e+"":e,s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const m=require("@tanstack/store"),S=require("../../networkStatus.js"),l=require("./utils.js");function p(t){const e=l.deduplicateItems(t);return l.sortItems(e)}const w={shouldSetPage:!0,shouldAppend:!1},u={items:[],metadata:{total_count:0,unread_count:0,unseen_count:0},pageInfo:{before:null,after:null,page_size:50},loading:!1,networkStatus:S.NetworkStatus.ready,setResult:()=>{},setMetadata:()=>{},setNetworkStatus:()=>{},resetStore:()=>{},setItemAttrs:()=>{}},k=()=>{const t=new m.Store(u);return t.setState(e=>({...e,networkStatus:S.NetworkStatus.ready,loading:!1,setNetworkStatus:s=>t.setState(r=>({...r,networkStatus:s,loading:s===S.NetworkStatus.loading})),setResult:({entries:s,meta:r,page_info:i},a=w)=>t.setState(o=>{const n=a.shouldAppend?p(o.items.concat(s)):s;return{...o,items:n,metadata:r,pageInfo:a.shouldSetPage?i:o.pageInfo,loading:!1,networkStatus:S.NetworkStatus.ready}}),setMetadata:s=>t.setState(r=>({...r,metadata:s})),resetStore:(s=u.metadata)=>t.setState(()=>({...u,setResult:t.state.setResult,setMetadata:t.state.setMetadata,setNetworkStatus:t.state.setNetworkStatus,resetStore:t.state.resetStore,setItemAttrs:t.state.setItemAttrs,metadata:s})),setItemAttrs:(s,r)=>{const i=s.reduce((a,o)=>({...a,[o]:r}),{});return t.setState(a=>{const o=a.items.map(n=>i[n.id]?{...n,...i[n.id]}:n);return{...a,items:o}})}})),t};class c{constructor(e){d(this,"store");this.store=e}getState(){return this.store.state}setState(e){this.store.setState(typeof e=="function"?e:()=>e)}getInitialState(){return u}subscribe(e){return this.store.subscribe(s=>e(s.currentVal))}}function I(){const t=k();return new c(t)}exports.FeedStore=c;exports.default=I;exports.initialStoreState=u;
2
2
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../../../src/clients/feed/store.ts"],"sourcesContent":["import { GenericData } from \"@knocklabs/types\";\nimport { Store } from \"@tanstack/store\";\n\nimport { NetworkStatus } from \"../../networkStatus\";\n\nimport { FeedItem, FeedMetadata, FeedResponse } from \"./interfaces\";\nimport { FeedStoreState, StoreFeedResultOptions } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport const initialStoreState: FeedStoreState = {\n items: [],\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n loading: false,\n networkStatus: NetworkStatus.ready,\n setResult: () => {},\n setMetadata: () => {},\n setNetworkStatus: () => {},\n resetStore: () => {},\n setItemAttrs: () => {},\n};\n\n/**\n * Initalize the store with tanstack store so it can be used within our\n * FeedStore class. We do this seperately so that we have the ability to\n * change which store library we use in the future if need be.\n */\nconst initalizeStore = () => {\n const store = new Store(initialStoreState);\n\n store.setState((state) => ({\n ...state,\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n store.setState((state) => ({\n ...state,\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info }: FeedResponse,\n options: StoreFeedResultOptions = defaultSetResultOptions,\n ) =>\n store.setState((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries as FeedItem<GenericData>[]))\n : entries;\n\n return {\n ...state,\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata: FeedMetadata) =>\n store.setState((state) => ({ ...state, metadata })),\n\n resetStore: (metadata = initialStoreState.metadata) =>\n store.setState(() => ({ ...initialStoreState, metadata })),\n\n setItemAttrs: (itemIds: Array<string>, attrs: object) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return store.setState((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { ...state, items };\n });\n },\n }));\n\n return store;\n};\n\n/**\n * The FeedStore class is a wrapper for our store solution that's\n * based on the same shape as zustand. This wrapping class allows\n * us to maintain backwards compatibility with the zustand model\n * while still allowing us to utilize tanstack store for the\n * underlying store solution.\n */\nexport class FeedStore {\n store: Store<FeedStoreState>;\n\n constructor(store: Store<FeedStoreState>) {\n this.store = store;\n }\n\n getState() {\n return this.store.state;\n }\n\n setState(\n updater: ((state: FeedStoreState) => FeedStoreState) | FeedStoreState,\n ) {\n this.store.setState(\n typeof updater === \"function\" ? updater : () => updater,\n );\n }\n\n getInitialState() {\n return initialStoreState;\n }\n\n subscribe(listener: (state: FeedStoreState) => void) {\n return this.store.subscribe((state) => listener(state.currentVal));\n }\n}\n\nexport default function createStore() {\n const store = initalizeStore();\n return new FeedStore(store);\n}\n"],"names":["processItems","items","deduped","deduplicateItems","sortItems","defaultSetResultOptions","initialStoreState","NetworkStatus","initalizeStore","store","Store","state","networkStatus","entries","meta","page_info","options","metadata","itemIds","attrs","itemUpdatesMap","acc","itemId","item","FeedStore","__publicField","updater","listener","createStore"],"mappings":"+WASA,SAASA,EAAaC,EAAmB,CACjC,MAAAC,EAAUC,mBAAiBF,CAAK,EAG/B,OAFQG,YAAUF,CAAO,CAGlC,CAEA,MAAMG,EAA0B,CAC9B,cAAe,GACf,aAAc,EAChB,EAEaC,EAAoC,CAC/C,MAAO,CAAC,EACR,SAAU,CACR,YAAa,EACb,aAAc,EACd,aAAc,CAChB,EACA,SAAU,CACR,OAAQ,KACR,MAAO,KACP,UAAW,EACb,EACA,QAAS,GACT,cAAeC,EAAc,cAAA,MAC7B,UAAW,IAAM,CAAC,EAClB,YAAa,IAAM,CAAC,EACpB,iBAAkB,IAAM,CAAC,EACzB,WAAY,IAAM,CAAC,EACnB,aAAc,IAAM,CAAA,CACtB,EAOMC,EAAiB,IAAM,CACrB,MAAAC,EAAQ,IAAIC,EAAA,MAAMJ,CAAiB,EAEnCG,OAAAA,EAAA,SAAUE,IAAW,CACzB,GAAGA,EAEH,cAAeJ,EAAc,cAAA,MAC7B,QAAS,GACT,iBAAmBK,GACjBH,EAAM,SAAUE,IAAW,CACzB,GAAGA,EAAA,cACHC,EACA,QAASA,IAAkBL,gBAAc,OAAA,EACzC,EAEJ,UAAW,CACT,CAAE,QAAAM,EAAS,KAAAC,EAAM,UAAAC,CAAA,EACjBC,EAAkCX,IAElCI,EAAM,SAAUE,GAAU,CAElB,MAAAV,EAAQe,EAAQ,aAClBhB,EAAaW,EAAM,MAAM,OAAOE,CAAkC,CAAC,EACnEA,EAEG,MAAA,CACL,GAAGF,EACH,MAAAV,EACA,SAAUa,EACV,SAAUE,EAAQ,cAAgBD,EAAYJ,EAAM,SACpD,QAAS,GACT,cAAeJ,EAAAA,cAAc,KAC/B,CAAA,CACD,EAEH,YAAcU,GACZR,EAAM,SAAUE,IAAW,CAAE,GAAGA,EAAO,SAAAM,CAAA,EAAW,EAEpD,WAAY,CAACA,EAAWX,EAAkB,WACxCG,EAAM,SAAS,KAAO,CAAE,GAAGH,EAAmB,SAAAW,CAAW,EAAA,EAE3D,aAAc,CAACC,EAAwBC,IAAkB,CAEvD,MAAMC,EAA2CF,EAAQ,OACvD,CAACG,EAAKC,KAAY,CAAE,GAAGD,EAAK,CAACC,CAAM,EAAGH,IACtC,CAAA,CACF,EAEO,OAAAV,EAAM,SAAUE,GAAU,CAC/B,MAAMV,EAAQU,EAAM,MAAM,IAAKY,GACzBH,EAAeG,EAAK,EAAE,EACjB,CAAE,GAAGA,EAAM,GAAGH,EAAeG,EAAK,EAAE,CAAE,EAGxCA,CACR,EAEM,MAAA,CAAE,GAAGZ,EAAO,MAAAV,CAAM,CAAA,CAC1B,CAAA,CACH,EACA,EAEKQ,CACT,EASO,MAAMe,CAAU,CAGrB,YAAYf,EAA8B,CAF1CgB,EAAA,cAGE,KAAK,MAAQhB,CAAA,CAGf,UAAW,CACT,OAAO,KAAK,MAAM,KAAA,CAGpB,SACEiB,EACA,CACA,KAAK,MAAM,SACT,OAAOA,GAAY,WAAaA,EAAU,IAAMA,CAClD,CAAA,CAGF,iBAAkB,CACT,OAAApB,CAAA,CAGT,UAAUqB,EAA2C,CAC5C,OAAA,KAAK,MAAM,UAAWhB,GAAUgB,EAAShB,EAAM,UAAU,CAAC,CAAA,CAErE,CAEA,SAAwBiB,GAAc,CACpC,MAAMnB,EAAQD,EAAe,EACtB,OAAA,IAAIgB,EAAUf,CAAK,CAC5B"}
1
+ {"version":3,"file":"store.js","sources":["../../../../src/clients/feed/store.ts"],"sourcesContent":["import { GenericData } from \"@knocklabs/types\";\nimport { Store } from \"@tanstack/store\";\n\nimport { NetworkStatus } from \"../../networkStatus\";\n\nimport { FeedItem, FeedMetadata, FeedResponse } from \"./interfaces\";\nimport { FeedStoreState, StoreFeedResultOptions } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport const initialStoreState: FeedStoreState = {\n items: [],\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n loading: false,\n networkStatus: NetworkStatus.ready,\n setResult: () => {},\n setMetadata: () => {},\n setNetworkStatus: () => {},\n resetStore: () => {},\n setItemAttrs: () => {},\n};\n\n/**\n * Initalize the store with tanstack store so it can be used within our\n * FeedStore class. We do this seperately so that we have the ability to\n * change which store library we use in the future if need be.\n */\nconst initalizeStore = () => {\n const store = new Store(initialStoreState);\n\n store.setState((state) => ({\n ...state,\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n store.setState((state) => ({\n ...state,\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info }: FeedResponse,\n options: StoreFeedResultOptions = defaultSetResultOptions,\n ) =>\n store.setState((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries as FeedItem<GenericData>[]))\n : entries;\n\n return {\n ...state,\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata: FeedMetadata) =>\n store.setState((state) => ({ ...state, metadata })),\n\n resetStore: (metadata = initialStoreState.metadata) =>\n store.setState(() => ({\n ...initialStoreState,\n setResult: store.state.setResult,\n setMetadata: store.state.setMetadata,\n setNetworkStatus: store.state.setNetworkStatus,\n resetStore: store.state.resetStore,\n setItemAttrs: store.state.setItemAttrs,\n metadata,\n })),\n\n setItemAttrs: (itemIds: Array<string>, attrs: object) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return store.setState((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { ...state, items };\n });\n },\n }));\n\n return store;\n};\n\n/**\n * The FeedStore class is a wrapper for our store solution that's\n * based on the same shape as zustand. This wrapping class allows\n * us to maintain backwards compatibility with the zustand model\n * while still allowing us to utilize tanstack store for the\n * underlying store solution.\n */\nexport class FeedStore {\n store: Store<FeedStoreState>;\n\n constructor(store: Store<FeedStoreState>) {\n this.store = store;\n }\n\n getState() {\n return this.store.state;\n }\n\n setState(\n updater: ((state: FeedStoreState) => FeedStoreState) | FeedStoreState,\n ) {\n this.store.setState(\n typeof updater === \"function\" ? updater : () => updater,\n );\n }\n\n getInitialState() {\n return initialStoreState;\n }\n\n subscribe(listener: (state: FeedStoreState) => void) {\n return this.store.subscribe((state) => listener(state.currentVal));\n }\n}\n\nexport default function createStore() {\n const store = initalizeStore();\n return new FeedStore(store);\n}\n"],"names":["processItems","items","deduped","deduplicateItems","sortItems","defaultSetResultOptions","initialStoreState","NetworkStatus","initalizeStore","store","Store","state","networkStatus","entries","meta","page_info","options","metadata","itemIds","attrs","itemUpdatesMap","acc","itemId","item","FeedStore","__publicField","updater","listener","createStore"],"mappings":"+WASA,SAASA,EAAaC,EAAmB,CACjC,MAAAC,EAAUC,mBAAiBF,CAAK,EAG/B,OAFQG,YAAUF,CAAO,CAGlC,CAEA,MAAMG,EAA0B,CAC9B,cAAe,GACf,aAAc,EAChB,EAEaC,EAAoC,CAC/C,MAAO,CAAC,EACR,SAAU,CACR,YAAa,EACb,aAAc,EACd,aAAc,CAChB,EACA,SAAU,CACR,OAAQ,KACR,MAAO,KACP,UAAW,EACb,EACA,QAAS,GACT,cAAeC,EAAc,cAAA,MAC7B,UAAW,IAAM,CAAC,EAClB,YAAa,IAAM,CAAC,EACpB,iBAAkB,IAAM,CAAC,EACzB,WAAY,IAAM,CAAC,EACnB,aAAc,IAAM,CAAA,CACtB,EAOMC,EAAiB,IAAM,CACrB,MAAAC,EAAQ,IAAIC,EAAA,MAAMJ,CAAiB,EAEnCG,OAAAA,EAAA,SAAUE,IAAW,CACzB,GAAGA,EAEH,cAAeJ,EAAc,cAAA,MAC7B,QAAS,GACT,iBAAmBK,GACjBH,EAAM,SAAUE,IAAW,CACzB,GAAGA,EAAA,cACHC,EACA,QAASA,IAAkBL,gBAAc,OAAA,EACzC,EAEJ,UAAW,CACT,CAAE,QAAAM,EAAS,KAAAC,EAAM,UAAAC,CAAA,EACjBC,EAAkCX,IAElCI,EAAM,SAAUE,GAAU,CAElB,MAAAV,EAAQe,EAAQ,aAClBhB,EAAaW,EAAM,MAAM,OAAOE,CAAkC,CAAC,EACnEA,EAEG,MAAA,CACL,GAAGF,EACH,MAAAV,EACA,SAAUa,EACV,SAAUE,EAAQ,cAAgBD,EAAYJ,EAAM,SACpD,QAAS,GACT,cAAeJ,EAAAA,cAAc,KAC/B,CAAA,CACD,EAEH,YAAcU,GACZR,EAAM,SAAUE,IAAW,CAAE,GAAGA,EAAO,SAAAM,CAAA,EAAW,EAEpD,WAAY,CAACA,EAAWX,EAAkB,WACxCG,EAAM,SAAS,KAAO,CACpB,GAAGH,EACH,UAAWG,EAAM,MAAM,UACvB,YAAaA,EAAM,MAAM,YACzB,iBAAkBA,EAAM,MAAM,iBAC9B,WAAYA,EAAM,MAAM,WACxB,aAAcA,EAAM,MAAM,aAC1B,SAAAQ,CAAA,EACA,EAEJ,aAAc,CAACC,EAAwBC,IAAkB,CAEvD,MAAMC,EAA2CF,EAAQ,OACvD,CAACG,EAAKC,KAAY,CAAE,GAAGD,EAAK,CAACC,CAAM,EAAGH,IACtC,CAAA,CACF,EAEO,OAAAV,EAAM,SAAUE,GAAU,CAC/B,MAAMV,EAAQU,EAAM,MAAM,IAAKY,GACzBH,EAAeG,EAAK,EAAE,EACjB,CAAE,GAAGA,EAAM,GAAGH,EAAeG,EAAK,EAAE,CAAE,EAGxCA,CACR,EAEM,MAAA,CAAE,GAAGZ,EAAO,MAAAV,CAAM,CAAA,CAC1B,CAAA,CACH,EACA,EAEKQ,CACT,EASO,MAAMe,CAAU,CAGrB,YAAYf,EAA8B,CAF1CgB,EAAA,cAGE,KAAK,MAAQhB,CAAA,CAGf,UAAW,CACT,OAAO,KAAK,MAAM,KAAA,CAGpB,SACEiB,EACA,CACA,KAAK,MAAM,SACT,OAAOA,GAAY,WAAaA,EAAU,IAAMA,CAClD,CAAA,CAGF,iBAAkB,CACT,OAAApB,CAAA,CAGT,UAAUqB,EAA2C,CAC5C,OAAA,KAAK,MAAM,UAAWhB,GAAUgB,EAAShB,EAAM,UAAU,CAAC,CAAA,CAErE,CAEA,SAAwBiB,GAAc,CACpC,MAAMnB,EAAQD,EAAe,EACtB,OAAA,IAAIgB,EAAUf,CAAK,CAC5B"}
package/dist/esm/api.mjs CHANGED
@@ -17,7 +17,8 @@ class y {
17
17
  Accept: "application/json",
18
18
  "Content-Type": "application/json",
19
19
  Authorization: `Bearer ${this.apiKey}`,
20
- "X-Knock-User-Token": this.userToken
20
+ "X-Knock-User-Token": this.userToken,
21
+ "User-Agent": this.getUserAgent()
21
22
  }
22
23
  }), typeof window < "u" && (this.socket = new u(`${this.host.replace("http", "ws")}/ws/v1`, {
23
24
  params: {
@@ -51,6 +52,9 @@ class y {
51
52
  canRetryRequest(e) {
52
53
  return o.isNetworkError(e) ? !0 : e.response ? e.response.status >= 500 && e.response.status <= 599 || e.response.status === 429 : !1;
53
54
  }
55
+ getUserAgent() {
56
+ return "Knock/ClientJS 0.15.2";
57
+ }
54
58
  }
55
59
  export {
56
60
  y as default
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","sources":["../../src/api.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n\n public socket: Socket | undefined;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n },\n });\n\n if (typeof window !== \"undefined\") {\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n }\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n}\n\nexport default ApiClient;\n"],"names":["ApiClient","options","__publicField","axios","Socket","axiosRetry","req","result","e","error"],"mappings":";;;;;;AAmBA,MAAMA,EAAU;AAAA,EAQd,YAAYC,GAA2B;AAP/B,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAED,IAAAA,EAAA;AAGL,SAAK,OAAOD,EAAQ,MACpB,KAAK,SAASA,EAAQ,QACjB,KAAA,YAAYA,EAAQ,aAAa,MAGjC,KAAA,cAAcE,EAAM,OAAO;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,sBAAsB,KAAK;AAAA,MAAA;AAAA,IAC7B,CACD,GAEG,OAAO,SAAW,QACf,KAAA,SAAS,IAAIC,EAAO,GAAG,KAAK,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAAA,MACnE,QAAQ;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,MAAA;AAAA,IAChB,CACD,IAGHC,EAAW,KAAK,aAAa;AAAA,MAC3B,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,YAAYA,EAAW;AAAA,IAAA,CACxB;AAAA,EAAA;AAAA,EAGH,MAAM,YAAYC,GAA+C;AAC3D,QAAA;AACF,YAAMC,IAAS,MAAM,KAAK,YAAYD,CAAG;AAElC,aAAA;AAAA,QACL,YAAYC,EAAO,SAAS,MAAM,OAAO;AAAA,QACzC,MAAMA,EAAO;AAAA,QACb,OAAO;AAAA,QACP,QAAQA,EAAO;AAAA,MACjB;AAAA,aAGOC,GAAY;AACnB,qBAAQ,MAAMA,CAAC,GAER;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAOA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAGM,gBAAgBC,GAAmB;AAErC,WAAAJ,EAAW,eAAeI,CAAK,IAC1B,KAGJA,EAAM,WAMPA,EAAM,SAAS,UAAU,OAAOA,EAAM,SAAS,UAAU,OAKzDA,EAAM,SAAS,WAAW,MATrB;AAAA,EAaF;AAEX;"}
1
+ {"version":3,"file":"api.mjs","sources":["../../src/api.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n\n public socket: Socket | undefined;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n \"User-Agent\": this.getUserAgent(),\n },\n });\n\n if (typeof window !== \"undefined\") {\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n }\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n\n private getUserAgent() {\n // Note: we're following format used in our Stainless SDKs:\n // https://github.com/knocklabs/knock-node/blob/main/src/client.ts#L335\n // If we add the env var to turbo.json, it caches it so the version\n // never actually updates.\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n return `Knock/ClientJS ${process.env.CLIENT_PACKAGE_VERSION}`;\n }\n}\n\nexport default ApiClient;\n"],"names":["ApiClient","options","__publicField","axios","Socket","axiosRetry","req","result","e","error"],"mappings":";;;;;;AAmBA,MAAMA,EAAU;AAAA,EAQd,YAAYC,GAA2B;AAP/B,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAED,IAAAA,EAAA;AAGL,SAAK,OAAOD,EAAQ,MACpB,KAAK,SAASA,EAAQ,QACjB,KAAA,YAAYA,EAAQ,aAAa,MAGjC,KAAA,cAAcE,EAAM,OAAO;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,sBAAsB,KAAK;AAAA,QAC3B,cAAc,KAAK,aAAa;AAAA,MAAA;AAAA,IAClC,CACD,GAEG,OAAO,SAAW,QACf,KAAA,SAAS,IAAIC,EAAO,GAAG,KAAK,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAAA,MACnE,QAAQ;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,MAAA;AAAA,IAChB,CACD,IAGHC,EAAW,KAAK,aAAa;AAAA,MAC3B,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,YAAYA,EAAW;AAAA,IAAA,CACxB;AAAA,EAAA;AAAA,EAGH,MAAM,YAAYC,GAA+C;AAC3D,QAAA;AACF,YAAMC,IAAS,MAAM,KAAK,YAAYD,CAAG;AAElC,aAAA;AAAA,QACL,YAAYC,EAAO,SAAS,MAAM,OAAO;AAAA,QACzC,MAAMA,EAAO;AAAA,QACb,OAAO;AAAA,QACP,QAAQA,EAAO;AAAA,MACjB;AAAA,aAGOC,GAAY;AACnB,qBAAQ,MAAMA,CAAC,GAER;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAOA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAGM,gBAAgBC,GAAmB;AAErC,WAAAJ,EAAW,eAAeI,CAAK,IAC1B,KAGJA,EAAM,WAMPA,EAAM,SAAS,UAAU,OAAOA,EAAM,SAAS,UAAU,OAKzDA,EAAM,SAAS,WAAW,MATrB;AAAA,EAaF;AAAA,EAGD,eAAe;AAMd,WAAA;AAAA,EAAoD;AAE/D;"}
@@ -1,12 +1,12 @@
1
- var c = Object.defineProperty;
2
- var S = (s, t, e) => t in s ? c(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
3
- var l = (s, t, e) => S(s, typeof t != "symbol" ? t + "" : t, e);
4
- import { Store as f } from "@tanstack/store";
1
+ var S = Object.defineProperty;
2
+ var c = (t, e, s) => e in t ? S(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;
3
+ var l = (t, e, s) => c(t, typeof e != "symbol" ? e + "" : e, s);
4
+ import { Store as m } from "@tanstack/store";
5
5
  import { NetworkStatus as d } from "../../networkStatus.mjs";
6
- import { deduplicateItems as m, sortItems as p } from "./utils.mjs";
7
- function g(s) {
8
- const t = m(s);
9
- return p(t);
6
+ import { deduplicateItems as f, sortItems as p } from "./utils.mjs";
7
+ function g(t) {
8
+ const e = f(t);
9
+ return p(e);
10
10
  }
11
11
  const I = {
12
12
  shouldSetPage: !0,
@@ -35,70 +35,78 @@ const I = {
35
35
  },
36
36
  setItemAttrs: () => {
37
37
  }
38
- }, h = () => {
39
- const s = new f(i);
40
- return s.setState((t) => ({
41
- ...t,
38
+ }, w = () => {
39
+ const t = new m(i);
40
+ return t.setState((e) => ({
41
+ ...e,
42
42
  // The network status indicates what's happening with the request
43
43
  networkStatus: d.ready,
44
44
  loading: !1,
45
- setNetworkStatus: (e) => s.setState((r) => ({
45
+ setNetworkStatus: (s) => t.setState((r) => ({
46
46
  ...r,
47
- networkStatus: e,
48
- loading: e === d.loading
47
+ networkStatus: s,
48
+ loading: s === d.loading
49
49
  })),
50
- setResult: ({ entries: e, meta: r, page_info: u }, o = I) => s.setState((a) => {
51
- const n = o.shouldAppend ? g(a.items.concat(e)) : e;
50
+ setResult: ({ entries: s, meta: r, page_info: u }, a = I) => t.setState((o) => {
51
+ const n = a.shouldAppend ? g(o.items.concat(s)) : s;
52
52
  return {
53
- ...a,
53
+ ...o,
54
54
  items: n,
55
55
  metadata: r,
56
- pageInfo: o.shouldSetPage ? u : a.pageInfo,
56
+ pageInfo: a.shouldSetPage ? u : o.pageInfo,
57
57
  loading: !1,
58
58
  networkStatus: d.ready
59
59
  };
60
60
  }),
61
- setMetadata: (e) => s.setState((r) => ({ ...r, metadata: e })),
62
- resetStore: (e = i.metadata) => s.setState(() => ({ ...i, metadata: e })),
63
- setItemAttrs: (e, r) => {
64
- const u = e.reduce(
65
- (o, a) => ({ ...o, [a]: r }),
61
+ setMetadata: (s) => t.setState((r) => ({ ...r, metadata: s })),
62
+ resetStore: (s = i.metadata) => t.setState(() => ({
63
+ ...i,
64
+ setResult: t.state.setResult,
65
+ setMetadata: t.state.setMetadata,
66
+ setNetworkStatus: t.state.setNetworkStatus,
67
+ resetStore: t.state.resetStore,
68
+ setItemAttrs: t.state.setItemAttrs,
69
+ metadata: s
70
+ })),
71
+ setItemAttrs: (s, r) => {
72
+ const u = s.reduce(
73
+ (a, o) => ({ ...a, [o]: r }),
66
74
  {}
67
75
  );
68
- return s.setState((o) => {
69
- const a = o.items.map((n) => u[n.id] ? { ...n, ...u[n.id] } : n);
70
- return { ...o, items: a };
76
+ return t.setState((a) => {
77
+ const o = a.items.map((n) => u[n.id] ? { ...n, ...u[n.id] } : n);
78
+ return { ...a, items: o };
71
79
  });
72
80
  }
73
- })), s;
81
+ })), t;
74
82
  };
75
- class w {
76
- constructor(t) {
83
+ class h {
84
+ constructor(e) {
77
85
  l(this, "store");
78
- this.store = t;
86
+ this.store = e;
79
87
  }
80
88
  getState() {
81
89
  return this.store.state;
82
90
  }
83
- setState(t) {
91
+ setState(e) {
84
92
  this.store.setState(
85
- typeof t == "function" ? t : () => t
93
+ typeof e == "function" ? e : () => e
86
94
  );
87
95
  }
88
96
  getInitialState() {
89
97
  return i;
90
98
  }
91
- subscribe(t) {
92
- return this.store.subscribe((e) => t(e.currentVal));
99
+ subscribe(e) {
100
+ return this.store.subscribe((s) => e(s.currentVal));
93
101
  }
94
102
  }
95
- function _() {
96
- const s = h();
97
- return new w(s);
103
+ function N() {
104
+ const t = w();
105
+ return new h(t);
98
106
  }
99
107
  export {
100
- w as FeedStore,
101
- _ as default,
108
+ h as FeedStore,
109
+ N as default,
102
110
  i as initialStoreState
103
111
  };
104
112
  //# sourceMappingURL=store.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.mjs","sources":["../../../../src/clients/feed/store.ts"],"sourcesContent":["import { GenericData } from \"@knocklabs/types\";\nimport { Store } from \"@tanstack/store\";\n\nimport { NetworkStatus } from \"../../networkStatus\";\n\nimport { FeedItem, FeedMetadata, FeedResponse } from \"./interfaces\";\nimport { FeedStoreState, StoreFeedResultOptions } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport const initialStoreState: FeedStoreState = {\n items: [],\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n loading: false,\n networkStatus: NetworkStatus.ready,\n setResult: () => {},\n setMetadata: () => {},\n setNetworkStatus: () => {},\n resetStore: () => {},\n setItemAttrs: () => {},\n};\n\n/**\n * Initalize the store with tanstack store so it can be used within our\n * FeedStore class. We do this seperately so that we have the ability to\n * change which store library we use in the future if need be.\n */\nconst initalizeStore = () => {\n const store = new Store(initialStoreState);\n\n store.setState((state) => ({\n ...state,\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n store.setState((state) => ({\n ...state,\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info }: FeedResponse,\n options: StoreFeedResultOptions = defaultSetResultOptions,\n ) =>\n store.setState((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries as FeedItem<GenericData>[]))\n : entries;\n\n return {\n ...state,\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata: FeedMetadata) =>\n store.setState((state) => ({ ...state, metadata })),\n\n resetStore: (metadata = initialStoreState.metadata) =>\n store.setState(() => ({ ...initialStoreState, metadata })),\n\n setItemAttrs: (itemIds: Array<string>, attrs: object) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return store.setState((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { ...state, items };\n });\n },\n }));\n\n return store;\n};\n\n/**\n * The FeedStore class is a wrapper for our store solution that's\n * based on the same shape as zustand. This wrapping class allows\n * us to maintain backwards compatibility with the zustand model\n * while still allowing us to utilize tanstack store for the\n * underlying store solution.\n */\nexport class FeedStore {\n store: Store<FeedStoreState>;\n\n constructor(store: Store<FeedStoreState>) {\n this.store = store;\n }\n\n getState() {\n return this.store.state;\n }\n\n setState(\n updater: ((state: FeedStoreState) => FeedStoreState) | FeedStoreState,\n ) {\n this.store.setState(\n typeof updater === \"function\" ? updater : () => updater,\n );\n }\n\n getInitialState() {\n return initialStoreState;\n }\n\n subscribe(listener: (state: FeedStoreState) => void) {\n return this.store.subscribe((state) => listener(state.currentVal));\n }\n}\n\nexport default function createStore() {\n const store = initalizeStore();\n return new FeedStore(store);\n}\n"],"names":["processItems","items","deduped","deduplicateItems","sortItems","defaultSetResultOptions","initialStoreState","NetworkStatus","initalizeStore","store","Store","state","networkStatus","entries","meta","page_info","options","metadata","itemIds","attrs","itemUpdatesMap","acc","itemId","item","FeedStore","__publicField","updater","listener","createStore"],"mappings":"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"}
1
+ {"version":3,"file":"store.mjs","sources":["../../../../src/clients/feed/store.ts"],"sourcesContent":["import { GenericData } from \"@knocklabs/types\";\nimport { Store } from \"@tanstack/store\";\n\nimport { NetworkStatus } from \"../../networkStatus\";\n\nimport { FeedItem, FeedMetadata, FeedResponse } from \"./interfaces\";\nimport { FeedStoreState, StoreFeedResultOptions } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport const initialStoreState: FeedStoreState = {\n items: [],\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n loading: false,\n networkStatus: NetworkStatus.ready,\n setResult: () => {},\n setMetadata: () => {},\n setNetworkStatus: () => {},\n resetStore: () => {},\n setItemAttrs: () => {},\n};\n\n/**\n * Initalize the store with tanstack store so it can be used within our\n * FeedStore class. We do this seperately so that we have the ability to\n * change which store library we use in the future if need be.\n */\nconst initalizeStore = () => {\n const store = new Store(initialStoreState);\n\n store.setState((state) => ({\n ...state,\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n store.setState((state) => ({\n ...state,\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info }: FeedResponse,\n options: StoreFeedResultOptions = defaultSetResultOptions,\n ) =>\n store.setState((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries as FeedItem<GenericData>[]))\n : entries;\n\n return {\n ...state,\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata: FeedMetadata) =>\n store.setState((state) => ({ ...state, metadata })),\n\n resetStore: (metadata = initialStoreState.metadata) =>\n store.setState(() => ({\n ...initialStoreState,\n setResult: store.state.setResult,\n setMetadata: store.state.setMetadata,\n setNetworkStatus: store.state.setNetworkStatus,\n resetStore: store.state.resetStore,\n setItemAttrs: store.state.setItemAttrs,\n metadata,\n })),\n\n setItemAttrs: (itemIds: Array<string>, attrs: object) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return store.setState((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { ...state, items };\n });\n },\n }));\n\n return store;\n};\n\n/**\n * The FeedStore class is a wrapper for our store solution that's\n * based on the same shape as zustand. This wrapping class allows\n * us to maintain backwards compatibility with the zustand model\n * while still allowing us to utilize tanstack store for the\n * underlying store solution.\n */\nexport class FeedStore {\n store: Store<FeedStoreState>;\n\n constructor(store: Store<FeedStoreState>) {\n this.store = store;\n }\n\n getState() {\n return this.store.state;\n }\n\n setState(\n updater: ((state: FeedStoreState) => FeedStoreState) | FeedStoreState,\n ) {\n this.store.setState(\n typeof updater === \"function\" ? updater : () => updater,\n );\n }\n\n getInitialState() {\n return initialStoreState;\n }\n\n subscribe(listener: (state: FeedStoreState) => void) {\n return this.store.subscribe((state) => listener(state.currentVal));\n }\n}\n\nexport default function createStore() {\n const store = initalizeStore();\n return new FeedStore(store);\n}\n"],"names":["processItems","items","deduped","deduplicateItems","sortItems","defaultSetResultOptions","initialStoreState","NetworkStatus","initalizeStore","store","Store","state","networkStatus","entries","meta","page_info","options","metadata","itemIds","attrs","itemUpdatesMap","acc","itemId","item","FeedStore","__publicField","updater","listener","createStore"],"mappings":";;;;;;AASA,SAASA,EAAaC,GAAmB;AACjC,QAAAC,IAAUC,EAAiBF,CAAK;AAG/B,SAFQG,EAAUF,CAAO;AAGlC;AAEA,MAAMG,IAA0B;AAAA,EAC9B,eAAe;AAAA,EACf,cAAc;AAChB,GAEaC,IAAoC;AAAA,EAC/C,OAAO,CAAC;AAAA,EACR,UAAU;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,eAAeC,EAAc;AAAA,EAC7B,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,cAAc,MAAM;AAAA,EAAA;AACtB,GAOMC,IAAiB,MAAM;AACrB,QAAAC,IAAQ,IAAIC,EAAMJ,CAAiB;AAEnC,SAAAG,EAAA,SAAS,CAACE,OAAW;AAAA,IACzB,GAAGA;AAAA;AAAA,IAEH,eAAeJ,EAAc;AAAA,IAC7B,SAAS;AAAA,IACT,kBAAkB,CAACK,MACjBH,EAAM,SAAS,CAACE,OAAW;AAAA,MACzB,GAAGA;AAAAA,MACH,eAAAC;AAAA,MACA,SAASA,MAAkBL,EAAc;AAAA,IAAA,EACzC;AAAA,IAEJ,WAAW,CACT,EAAE,SAAAM,GAAS,MAAAC,GAAM,WAAAC,EAAA,GACjBC,IAAkCX,MAElCI,EAAM,SAAS,CAACE,MAAU;AAElB,YAAAV,IAAQe,EAAQ,eAClBhB,EAAaW,EAAM,MAAM,OAAOE,CAAkC,CAAC,IACnEA;AAEG,aAAA;AAAA,QACL,GAAGF;AAAAA,QACH,OAAAV;AAAA,QACA,UAAUa;AAAA,QACV,UAAUE,EAAQ,gBAAgBD,IAAYJ,EAAM;AAAA,QACpD,SAAS;AAAA,QACT,eAAeJ,EAAc;AAAA,MAC/B;AAAA,IAAA,CACD;AAAA,IAEH,aAAa,CAACU,MACZR,EAAM,SAAS,CAACE,OAAW,EAAE,GAAGA,GAAO,UAAAM,EAAA,EAAW;AAAA,IAEpD,YAAY,CAACA,IAAWX,EAAkB,aACxCG,EAAM,SAAS,OAAO;AAAA,MACpB,GAAGH;AAAA,MACH,WAAWG,EAAM,MAAM;AAAA,MACvB,aAAaA,EAAM,MAAM;AAAA,MACzB,kBAAkBA,EAAM,MAAM;AAAA,MAC9B,YAAYA,EAAM,MAAM;AAAA,MACxB,cAAcA,EAAM,MAAM;AAAA,MAC1B,UAAAQ;AAAA,IAAA,EACA;AAAA,IAEJ,cAAc,CAACC,GAAwBC,MAAkB;AAEvD,YAAMC,IAA2CF,EAAQ;AAAA,QACvD,CAACG,GAAKC,OAAY,EAAE,GAAGD,GAAK,CAACC,CAAM,GAAGH;QACtC,CAAA;AAAA,MACF;AAEO,aAAAV,EAAM,SAAS,CAACE,MAAU;AAC/B,cAAMV,IAAQU,EAAM,MAAM,IAAI,CAACY,MACzBH,EAAeG,EAAK,EAAE,IACjB,EAAE,GAAGA,GAAM,GAAGH,EAAeG,EAAK,EAAE,EAAE,IAGxCA,CACR;AAEM,eAAA,EAAE,GAAGZ,GAAO,OAAAV,EAAM;AAAA,MAAA,CAC1B;AAAA,IAAA;AAAA,EACH,EACA,GAEKQ;AACT;AASO,MAAMe,EAAU;AAAA,EAGrB,YAAYf,GAA8B;AAF1C,IAAAgB,EAAA;AAGE,SAAK,QAAQhB;AAAA,EAAA;AAAA,EAGf,WAAW;AACT,WAAO,KAAK,MAAM;AAAA,EAAA;AAAA,EAGpB,SACEiB,GACA;AACA,SAAK,MAAM;AAAA,MACT,OAAOA,KAAY,aAAaA,IAAU,MAAMA;AAAA,IAClD;AAAA,EAAA;AAAA,EAGF,kBAAkB;AACT,WAAApB;AAAA,EAAA;AAAA,EAGT,UAAUqB,GAA2C;AAC5C,WAAA,KAAK,MAAM,UAAU,CAAChB,MAAUgB,EAAShB,EAAM,UAAU,CAAC;AAAA,EAAA;AAErE;AAEA,SAAwBiB,IAAc;AACpC,QAAMnB,IAAQD,EAAe;AACtB,SAAA,IAAIgB,EAAUf,CAAK;AAC5B;"}
@@ -20,6 +20,7 @@ declare class ApiClient {
20
20
  constructor(options: ApiClientOptions);
21
21
  makeRequest(req: AxiosRequestConfig): Promise<ApiResponse>;
22
22
  private canRetryRequest;
23
+ private getUserAgent;
23
24
  }
24
25
  export default ApiClient;
25
26
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAA6B,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,WAAW;IAE1B,KAAK,CAAC,EAAE,GAAG,CAAC;IAEZ,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,SAAS;IACb,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAgB;IAE5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEtB,OAAO,EAAE,gBAAgB;IAgC/B,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhE,OAAO,CAAC,eAAe;CAuBxB;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAA6B,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,WAAW;IAE1B,KAAK,CAAC,EAAE,GAAG,CAAC;IAEZ,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,SAAS;IACb,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAgB;IAE5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEtB,OAAO,EAAE,gBAAgB;IAiC/B,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhE,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,YAAY;CAQrB;AAED,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,OAAO,EAAE,cAAc,EAA0B,MAAM,SAAS,CAAC;AAejE,eAAO,MAAM,iBAAiB,EAAE,cAmB/B,CAAC;AAwEF;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;gBAEjB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;IAIxC,QAAQ;IAIR,QAAQ,CACN,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,CAAC,GAAG,cAAc;IAOvE,eAAe;IAIf,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI;CAGpD;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,cAGlC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,OAAO,EAAE,cAAc,EAA0B,MAAM,SAAS,CAAC;AAejE,eAAO,MAAM,iBAAiB,EAAE,cAmB/B,CAAC;AAgFF;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;gBAEjB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;IAIxC,QAAQ;IAIR,QAAQ,CACN,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,CAAC,GAAG,cAAc;IAOvE,eAAe;IAIf,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI;CAGpD;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,cAGlC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knocklabs/client",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "The clientside library for interacting with Knock",
5
5
  "homepage": "https://github.com/knocklabs/javascript/tree/main/packages/client",
6
6
  "author": "@knocklabs",
@@ -46,10 +46,10 @@
46
46
  },
47
47
  "devDependencies": {
48
48
  "@babel/cli": "^7.27.2",
49
- "@babel/core": "^7.26.0",
49
+ "@babel/core": "^7.28.0",
50
50
  "@babel/plugin-proposal-class-properties": "^7.16.7",
51
51
  "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
52
- "@babel/plugin-transform-runtime": "^7.25.4",
52
+ "@babel/plugin-transform-runtime": "^7.28.0",
53
53
  "@babel/preset-env": "^7.27.1",
54
54
  "@babel/preset-typescript": "^7.27.0",
55
55
  "@codecov/vite-plugin": "^1.9.1",
@@ -72,12 +72,12 @@
72
72
  "@knocklabs/types": "^0.1.5",
73
73
  "@tanstack/store": "^0.7.1",
74
74
  "@types/phoenix": "^1.6.6",
75
- "axios": "^1.9.0",
75
+ "axios": "^1.10.0",
76
76
  "axios-retry": "^4.5.0",
77
77
  "eventemitter2": "^6.4.5",
78
78
  "jwt-decode": "^4.0.0",
79
79
  "nanoid": "^3.3.11",
80
- "phoenix": "1.7.19",
80
+ "phoenix": "1.7.21",
81
81
  "urlpattern-polyfill": "^10.0.0"
82
82
  }
83
83
  }
package/src/api.ts CHANGED
@@ -38,6 +38,7 @@ class ApiClient {
38
38
  "Content-Type": "application/json",
39
39
  Authorization: `Bearer ${this.apiKey}`,
40
40
  "X-Knock-User-Token": this.userToken,
41
+ "User-Agent": this.getUserAgent(),
41
42
  },
42
43
  });
43
44
 
@@ -104,6 +105,15 @@ class ApiClient {
104
105
 
105
106
  return false;
106
107
  }
108
+
109
+ private getUserAgent() {
110
+ // Note: we're following format used in our Stainless SDKs:
111
+ // https://github.com/knocklabs/knock-node/blob/main/src/client.ts#L335
112
+ // If we add the env var to turbo.json, it caches it so the version
113
+ // never actually updates.
114
+ // eslint-disable-next-line turbo/no-undeclared-env-vars
115
+ return `Knock/ClientJS ${process.env.CLIENT_PACKAGE_VERSION}`;
116
+ }
107
117
  }
108
118
 
109
119
  export default ApiClient;
@@ -84,7 +84,15 @@ const initalizeStore = () => {
84
84
  store.setState((state) => ({ ...state, metadata })),
85
85
 
86
86
  resetStore: (metadata = initialStoreState.metadata) =>
87
- store.setState(() => ({ ...initialStoreState, metadata })),
87
+ store.setState(() => ({
88
+ ...initialStoreState,
89
+ setResult: store.state.setResult,
90
+ setMetadata: store.state.setMetadata,
91
+ setNetworkStatus: store.state.setNetworkStatus,
92
+ resetStore: store.state.resetStore,
93
+ setItemAttrs: store.state.setItemAttrs,
94
+ metadata,
95
+ })),
88
96
 
89
97
  setItemAttrs: (itemIds: Array<string>, attrs: object) => {
90
98
  // Create a map for the items to the updates to be made