@knocklabs/client 0.21.0 → 0.21.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.
Files changed (75) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/api.js +1 -1
  3. package/dist/cjs/api.js.map +1 -1
  4. package/dist/cjs/clients/feed/feed.js +1 -1
  5. package/dist/cjs/clients/feed/feed.js.map +1 -1
  6. package/dist/cjs/clients/feed/utils.js.map +1 -1
  7. package/dist/cjs/clients/guide/client.js +1 -1
  8. package/dist/cjs/clients/guide/client.js.map +1 -1
  9. package/dist/cjs/clients/guide/helpers.js +1 -1
  10. package/dist/cjs/clients/guide/helpers.js.map +1 -1
  11. package/dist/cjs/clients/guide/types.js +2 -0
  12. package/dist/cjs/clients/guide/types.js.map +1 -0
  13. package/dist/cjs/helpers.js +1 -1
  14. package/dist/cjs/helpers.js.map +1 -1
  15. package/dist/cjs/index.js +1 -1
  16. package/dist/cjs/knock.js +2 -2
  17. package/dist/cjs/knock.js.map +1 -1
  18. package/dist/cjs/pageVisibility.js +2 -0
  19. package/dist/cjs/pageVisibility.js.map +1 -0
  20. package/dist/esm/api.mjs +27 -12
  21. package/dist/esm/api.mjs.map +1 -1
  22. package/dist/esm/clients/feed/feed.mjs +60 -87
  23. package/dist/esm/clients/feed/feed.mjs.map +1 -1
  24. package/dist/esm/clients/feed/utils.mjs.map +1 -1
  25. package/dist/esm/clients/guide/client.mjs +270 -204
  26. package/dist/esm/clients/guide/client.mjs.map +1 -1
  27. package/dist/esm/clients/guide/helpers.mjs +34 -44
  28. package/dist/esm/clients/guide/helpers.mjs.map +1 -1
  29. package/dist/esm/clients/guide/types.mjs +13 -0
  30. package/dist/esm/clients/guide/types.mjs.map +1 -0
  31. package/dist/esm/helpers.mjs +19 -4
  32. package/dist/esm/helpers.mjs.map +1 -1
  33. package/dist/esm/index.mjs +13 -10
  34. package/dist/esm/index.mjs.map +1 -1
  35. package/dist/esm/knock.mjs +31 -29
  36. package/dist/esm/knock.mjs.map +1 -1
  37. package/dist/esm/pageVisibility.mjs +31 -0
  38. package/dist/esm/pageVisibility.mjs.map +1 -0
  39. package/dist/types/api.d.ts +4 -0
  40. package/dist/types/api.d.ts.map +1 -1
  41. package/dist/types/clients/feed/feed.d.ts +1 -11
  42. package/dist/types/clients/feed/feed.d.ts.map +1 -1
  43. package/dist/types/clients/feed/interfaces.d.ts +15 -5
  44. package/dist/types/clients/feed/interfaces.d.ts.map +1 -1
  45. package/dist/types/clients/feed/utils.d.ts +0 -2
  46. package/dist/types/clients/feed/utils.d.ts.map +1 -1
  47. package/dist/types/clients/guide/client.d.ts +6 -1
  48. package/dist/types/clients/guide/client.d.ts.map +1 -1
  49. package/dist/types/clients/guide/helpers.d.ts +1 -7
  50. package/dist/types/clients/guide/helpers.d.ts.map +1 -1
  51. package/dist/types/clients/guide/index.d.ts +3 -2
  52. package/dist/types/clients/guide/index.d.ts.map +1 -1
  53. package/dist/types/clients/guide/types.d.ts +33 -1
  54. package/dist/types/clients/guide/types.d.ts.map +1 -1
  55. package/dist/types/helpers.d.ts +19 -0
  56. package/dist/types/helpers.d.ts.map +1 -1
  57. package/dist/types/interfaces.d.ts +2 -0
  58. package/dist/types/interfaces.d.ts.map +1 -1
  59. package/dist/types/knock.d.ts +1 -0
  60. package/dist/types/knock.d.ts.map +1 -1
  61. package/dist/types/pageVisibility.d.ts +22 -0
  62. package/dist/types/pageVisibility.d.ts.map +1 -0
  63. package/package.json +2 -2
  64. package/src/api.ts +30 -0
  65. package/src/clients/feed/feed.ts +0 -73
  66. package/src/clients/feed/interfaces.ts +15 -11
  67. package/src/clients/feed/utils.ts +11 -2
  68. package/src/clients/guide/client.ts +206 -84
  69. package/src/clients/guide/helpers.ts +0 -12
  70. package/src/clients/guide/index.ts +10 -1
  71. package/src/clients/guide/types.ts +55 -1
  72. package/src/helpers.ts +39 -0
  73. package/src/interfaces.ts +2 -0
  74. package/src/knock.ts +4 -3
  75. package/src/pageVisibility.ts +70 -0
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ declare class Knock {
15
15
  userToken?: string;
16
16
  logLevel?: LogLevel;
17
17
  readonly branch?: string;
18
+ private readonly disconnectOnPageHidden?;
18
19
  private tokenExpirationTimer;
19
20
  readonly feeds: FeedClient;
20
21
  readonly objects: ObjectClient;
@@ -1 +1 @@
1
- {"version":3,"file":"knock.d.ts","sourceRoot":"","sources":["../../src/knock.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,0BAA0B,EAE3B,MAAM,cAAc,CAAC;AAItB,cAAM,KAAK;IAiBP,QAAQ,CAAC,MAAM,EAAE,MAAM;IAhBlB,IAAI,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,SAAS,CAA0B;IACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC3B,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,QAAQ,CAAC,KAAK,aAAwB;IACtC,QAAQ,CAAC,OAAO,eAA0B;IAC1C,QAAQ,CAAC,WAAW,cAAyB;IAC7C,QAAQ,CAAC,KAAK,cAAyB;IACvC,QAAQ,CAAC,OAAO,gBAA2B;IAC3C,QAAQ,CAAC,IAAI,aAAwB;IACrC,QAAQ,CAAC,QAAQ,gBAA2B;gBAGjC,MAAM,EAAE,MAAM,EACvB,OAAO,GAAE,YAAiB;IAgB5B,MAAM;IASN;;;;;;;OAOG;IACH,YAAY,CACV,0BAA0B,EAAE,MAAM,EAClC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,KAAK;IACR,YAAY,CACV,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI;IAwEP,sBAAsB;IAUtB,eAAe,CAAC,cAAc,UAAQ;IAKtC,QAAQ;IASR,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,UAAQ;IAMlC;;OAEG;IACH,OAAO,CAAC,eAAe;YAST,gCAAgC;IA+B9C;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAclB;AAED,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"knock.d.ts","sourceRoot":"","sources":["../../src/knock.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,0BAA0B,EAE3B,MAAM,cAAc,CAAC;AAItB,cAAM,KAAK;IAkBP,QAAQ,CAAC,MAAM,EAAE,MAAM;IAjBlB,IAAI,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,SAAS,CAA0B;IACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC3B,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAU;IAClD,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,QAAQ,CAAC,KAAK,aAAwB;IACtC,QAAQ,CAAC,OAAO,eAA0B;IAC1C,QAAQ,CAAC,WAAW,cAAyB;IAC7C,QAAQ,CAAC,KAAK,cAAyB;IACvC,QAAQ,CAAC,OAAO,gBAA2B;IAC3C,QAAQ,CAAC,IAAI,aAAwB;IACrC,QAAQ,CAAC,QAAQ,gBAA2B;gBAGjC,MAAM,EAAE,MAAM,EACvB,OAAO,GAAE,YAAiB;IAiB5B,MAAM;IASN;;;;;;;OAOG;IACH,YAAY,CACV,0BAA0B,EAAE,MAAM,EAClC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,KAAK;IACR,YAAY,CACV,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI;IAwEP,sBAAsB;IAUtB,eAAe,CAAC,cAAc,UAAQ;IAKtC,QAAQ;IAOR,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,UAAQ;IAMlC;;OAEG;IACH,OAAO,CAAC,eAAe;YAUT,gCAAgC;IA+B9C;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAclB;AAED,eAAe,KAAK,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Socket } from 'phoenix';
2
+ /**
3
+ * Disconnects the socket after a delay when the page becomes hidden,
4
+ * and reconnects when it becomes visible again. This avoids holding
5
+ * open connections for background tabs that aren't being viewed.
6
+ *
7
+ * The delay prevents unnecessary disconnects during brief tab switches.
8
+ * Phoenix channels automatically rejoin after reconnecting.
9
+ */
10
+ export declare class PageVisibilityManager {
11
+ private socket;
12
+ private disconnectDelayMs;
13
+ private disconnectTimer;
14
+ private wasConnected;
15
+ constructor(socket: Socket, disconnectDelayMs?: number);
16
+ private onVisibilityChange;
17
+ private scheduleDisconnect;
18
+ private reconnect;
19
+ private clearTimer;
20
+ teardown(): void;
21
+ }
22
+ //# sourceMappingURL=pageVisibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageVisibility.d.ts","sourceRoot":"","sources":["../../src/pageVisibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IAL3B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAAS;gBAGnB,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAoC;IAOjE,OAAO,CAAC,kBAAkB,CAMxB;IAEF,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAOlB,QAAQ;CAOT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knocklabs/client",
3
- "version": "0.21.0",
3
+ "version": "0.21.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",
@@ -65,7 +65,7 @@
65
65
  "rollup": "^4.46.2",
66
66
  "typescript": "^5.8.3",
67
67
  "vite": "^5.4.19",
68
- "vitest": "^3.1.1"
68
+ "vitest": "^3.2.4"
69
69
  },
70
70
  "dependencies": {
71
71
  "@babel/runtime": "^7.28.6",
package/src/api.ts CHANGED
@@ -2,11 +2,16 @@ import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios";
2
2
  import axiosRetry from "axios-retry";
3
3
  import { Socket } from "phoenix";
4
4
 
5
+ import { exponentialBackoffFullJitter } from "./helpers";
6
+ import { PageVisibilityManager } from "./pageVisibility";
7
+
5
8
  type ApiClientOptions = {
6
9
  host: string;
7
10
  apiKey: string;
8
11
  userToken: string | undefined;
9
12
  branch?: string;
13
+ /** Automatically disconnect the socket when the page is hidden and reconnect when visible. Defaults to `true`. */
14
+ disconnectOnPageHidden?: boolean;
10
15
  };
11
16
 
12
17
  export interface ApiResponse {
@@ -26,6 +31,7 @@ class ApiClient {
26
31
  private axiosClient: AxiosInstance;
27
32
 
28
33
  public socket: Socket | undefined;
34
+ private pageVisibility: PageVisibilityManager | undefined;
29
35
 
30
36
  constructor(options: ApiClientOptions) {
31
37
  this.host = options.host;
@@ -53,7 +59,23 @@ class ApiClient {
53
59
  api_key: this.apiKey,
54
60
  branch_slug: this.branch,
55
61
  },
62
+ reconnectAfterMs: (tries: number) => {
63
+ return exponentialBackoffFullJitter(tries, {
64
+ baseDelayMs: 1000,
65
+ maxDelayMs: 30_000,
66
+ });
67
+ },
68
+ rejoinAfterMs: (tries: number) => {
69
+ return exponentialBackoffFullJitter(tries, {
70
+ baseDelayMs: 1000,
71
+ maxDelayMs: 60_000,
72
+ });
73
+ },
56
74
  });
75
+
76
+ if (options.disconnectOnPageHidden !== false) {
77
+ this.pageVisibility = new PageVisibilityManager(this.socket);
78
+ }
57
79
  }
58
80
 
59
81
  axiosRetry(this.axiosClient, {
@@ -87,6 +109,14 @@ class ApiClient {
87
109
  }
88
110
  }
89
111
 
112
+ teardown() {
113
+ this.pageVisibility?.teardown();
114
+
115
+ if (this.socket?.isConnected()) {
116
+ this.socket.disconnect();
117
+ }
118
+ }
119
+
90
120
  private canRetryRequest(error: AxiosError) {
91
121
  // Retry Network Errors.
92
122
  if (axiosRetry.isNetworkError(error)) {
@@ -41,8 +41,6 @@ const feedClientDefaults: Pick<FeedClientOptions, "archived" | "mode"> = {
41
41
  mode: "compact",
42
42
  };
43
43
 
44
- const DEFAULT_DISCONNECT_DELAY = 2000;
45
-
46
44
  const CLIENT_REF_ID_PREFIX = "client_";
47
45
 
48
46
  class Feed {
@@ -53,10 +51,7 @@ class Feed {
53
51
  private userFeedId: string;
54
52
  private broadcaster: EventEmitter;
55
53
  private broadcastChannel!: BroadcastChannel | null;
56
- private disconnectTimer: ReturnType<typeof setTimeout> | null = null;
57
54
  private hasSubscribedToRealTimeUpdates: boolean = false;
58
- private visibilityChangeHandler: () => void = () => {};
59
- private visibilityChangeListenerConnected: boolean = false;
60
55
 
61
56
  // The raw store instance, used for binding in React and other environments
62
57
  public store: FeedStore;
@@ -117,13 +112,6 @@ class Feed {
117
112
 
118
113
  this.socketManager?.leave(this);
119
114
 
120
- this.tearDownVisibilityListeners();
121
-
122
- if (this.disconnectTimer) {
123
- clearTimeout(this.disconnectTimer);
124
- this.disconnectTimer = null;
125
- }
126
-
127
115
  if (this.broadcastChannel) {
128
116
  this.broadcastChannel.close();
129
117
  }
@@ -553,8 +541,6 @@ class Feed {
553
541
  __loadingType: undefined,
554
542
  __fetchSource: undefined,
555
543
  __experimentalCrossBrowserUpdates: undefined,
556
- auto_manage_socket_connection: undefined,
557
- auto_manage_socket_connection_delay: undefined,
558
544
  };
559
545
 
560
546
  const result = await this.knock.client().makeRequest({
@@ -815,10 +801,6 @@ class Feed {
815
801
  // In server environments we might not have a socket connection
816
802
  if (!this.socketManager) return;
817
803
 
818
- if (this.defaultOptions.auto_manage_socket_connection) {
819
- this.setUpVisibilityListeners();
820
- }
821
-
822
804
  // If we're initializing but they have previously opted to listen to real-time updates
823
805
  // then we will automatically reconnect on their behalf
824
806
  if (this.hasSubscribedToRealTimeUpdates && this.knock.isAuthenticated()) {
@@ -838,33 +820,6 @@ class Feed {
838
820
  }
839
821
  }
840
822
 
841
- /**
842
- * Listen for changes to document visibility and automatically disconnect
843
- * or reconnect the socket after a delay
844
- */
845
- private setUpVisibilityListeners() {
846
- if (
847
- typeof document === "undefined" ||
848
- this.visibilityChangeListenerConnected
849
- ) {
850
- return;
851
- }
852
-
853
- this.visibilityChangeHandler = this.handleVisibilityChange.bind(this);
854
- this.visibilityChangeListenerConnected = true;
855
- document.addEventListener("visibilitychange", this.visibilityChangeHandler);
856
- }
857
-
858
- private tearDownVisibilityListeners() {
859
- if (typeof document === "undefined") return;
860
-
861
- document.removeEventListener(
862
- "visibilitychange",
863
- this.visibilityChangeHandler,
864
- );
865
- this.visibilityChangeListenerConnected = false;
866
- }
867
-
868
823
  private emitEvent(
869
824
  type:
870
825
  | MessageEngagementStatus
@@ -882,34 +837,6 @@ class Feed {
882
837
  // Internal events only need `items:`
883
838
  this.broadcastOverChannel(`items:${type}`, { items });
884
839
  }
885
-
886
- private handleVisibilityChange() {
887
- const disconnectDelay =
888
- this.defaultOptions.auto_manage_socket_connection_delay ??
889
- DEFAULT_DISCONNECT_DELAY;
890
-
891
- const client = this.knock.client();
892
-
893
- if (document.visibilityState === "hidden") {
894
- // When the tab is hidden, clean up the socket connection after a delay
895
- this.disconnectTimer = setTimeout(() => {
896
- client.socket?.disconnect();
897
- this.disconnectTimer = null;
898
- }, disconnectDelay);
899
- } else if (document.visibilityState === "visible") {
900
- // When the tab is visible, clear the disconnect timer if active to cancel disconnecting
901
- // This handles cases where the tab is only briefly hidden to avoid unnecessary disconnects
902
- if (this.disconnectTimer) {
903
- clearTimeout(this.disconnectTimer);
904
- this.disconnectTimer = null;
905
- }
906
-
907
- // If the socket is not connected, try to reconnect
908
- if (!client.socket?.isConnected()) {
909
- client.socket?.connect();
910
- }
911
- }
912
- }
913
840
  }
914
841
 
915
842
  export default Feed;
@@ -34,11 +34,6 @@ export interface FeedClientOptions {
34
34
  trigger_data?: TriggerData;
35
35
  // Optionally enable cross browser feed updates for this feed
36
36
  __experimentalCrossBrowserUpdates?: boolean;
37
- // Optionally automatically manage socket connections on changes to tab visibility (defaults to `false`)
38
- auto_manage_socket_connection?: boolean;
39
- // Optionally set the delay amount in milliseconds when automatically disconnecting sockets from inactive tabs (defaults to `2000`)
40
- // Requires `auto_manage_socket_connection` to be `true`
41
- auto_manage_socket_connection_delay?: number;
42
37
  // Optionally scope notifications to a given date range
43
38
  inserted_at_date_range?: {
44
39
  // Optionally set the start date with a string in ISO 8601 format
@@ -65,20 +60,29 @@ export type FetchFeedOptions = {
65
60
  __fetchSource?: "socket" | "http";
66
61
  } & Omit<FeedClientOptions, "__experimentalCrossBrowserUpdates">;
67
62
 
68
- // The final data shape that is sent to the API
69
- // Should match types here: https://docs.knock.app/reference#get-feed
63
+ /**
64
+ * The final data shape that is sent to the the list feed items endpoint of the Knock API.
65
+ *
66
+ * @see https://docs.knock.app/api-reference/users/feeds/list_items
67
+ */
70
68
  export type FetchFeedOptionsForRequest = Omit<
71
69
  FeedClientOptions,
72
- "trigger_data"
70
+ "trigger_data" | "inserted_at_date_range"
73
71
  > & {
74
- // Formatted trigger data into a string
72
+ /** The trigger data of the feed items (as a JSON string). */
75
73
  trigger_data?: string;
74
+ /** Limits the results to items inserted after or on the given date. */
75
+ "inserted_at.gte"?: string;
76
+ /** Limits the results to items inserted before or on the given date. */
77
+ "inserted_at.lte"?: string;
78
+ /** Limits the results to items inserted after the given date. */
79
+ "inserted_at.gt"?: string;
80
+ /** Limits the results to items inserted before the given date. */
81
+ "inserted_at.lt"?: string;
76
82
  // Unset options that should not be sent to the API
77
83
  __loadingType: undefined;
78
84
  __fetchSource: undefined;
79
85
  __experimentalCrossBrowserUpdates: undefined;
80
- auto_manage_socket_connection: undefined;
81
- auto_manage_socket_connection_delay: undefined;
82
86
  };
83
87
 
84
88
  export interface ContentBlockBase {
@@ -1,4 +1,8 @@
1
- import type { FeedClientOptions, FeedItem } from "./interfaces";
1
+ import type {
2
+ FeedClientOptions,
3
+ FeedItem,
4
+ FetchFeedOptionsForRequest,
5
+ } from "./interfaces";
2
6
 
3
7
  export function deduplicateItems(items: FeedItem[]): FeedItem[] {
4
8
  const seen: Record<string, boolean> = {};
@@ -22,6 +26,11 @@ export function sortItems(items: FeedItem[]) {
22
26
  });
23
27
  }
24
28
 
29
+ type DateRangeParams = Pick<
30
+ FetchFeedOptionsForRequest,
31
+ "inserted_at.gte" | "inserted_at.lte" | "inserted_at.gt" | "inserted_at.lt"
32
+ >;
33
+
25
34
  export function mergeDateRangeParams(options: FeedClientOptions) {
26
35
  const { inserted_at_date_range, ...rest } = options;
27
36
 
@@ -29,7 +38,7 @@ export function mergeDateRangeParams(options: FeedClientOptions) {
29
38
  return rest;
30
39
  }
31
40
 
32
- const dateRangeParams: Record<string, string> = {};
41
+ const dateRangeParams: DateRangeParams = {};
33
42
 
34
43
  // Determine which operators to use based on the inclusive flag
35
44
  const isInclusive = inserted_at_date_range.inclusive ?? false;