Skip to content
Source
Sign inSign up
Open History to see the last commit

serverProviders.logic.ts

43 lines1.6 KB

1import type { ServerProvider } from "@t3tools/contracts";
2​
3const CHECKED_AT_ONLY_KEYS = new Set(["usageLimits", "versionAdvisory"]);
4​
5function sameIgnoringCheckedAt(previous: object, next: object, nested: boolean): boolean {
6 const before = previous as Record<string, unknown>;
7 const after = next as Record<string, unknown>;
8 const keys = Object.keys(after);
9 if (keys.length !== Object.keys(before).length) return false;
10 return keys.every((key) => {
11 if (key === "checkedAt") return key in before;
12 const left = before[key];
13 const right = after[key];
14 if (Object.is(left, right)) return true;
15 return (
16 !nested &&
17 CHECKED_AT_ONLY_KEYS.has(key) &&
18 typeof left === "object" &&
19 typeof right === "object" &&
20 left !== null &&
21 right !== null &&
22 sameIgnoringCheckedAt(left, right, true)
23 );
24 });
26​
27/** Ignores checkedAt; requires config projection to preserve unchanged nested references. */
28export function reuseProvidersIgnoringCheckedAt(
29 previous: ReadonlyArray<ServerProvider> | null,
30 next: ReadonlyArray<ServerProvider>,
31): ReadonlyArray<ServerProvider> {
32 if (previous === null) return next;
33 const previousById = new Map(previous.map((provider) => [provider.instanceId, provider]));
34 let same = previous.length === next.length;
35 const merged = next.map((provider, index) => {
36 const before = previousById.get(provider.instanceId);
37 const kept =
38 before !== undefined && sameIgnoringCheckedAt(before, provider, false) ? before : provider;
39 if (kept !== previous[index]) same = false;
40 return kept;
41 });
42 return same ? previous : merged;