on-zero 0.4.49 → 0.4.50
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/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/combineZeroClients.native.js.map +1 -1
- package/dist/cjs/createPermissions.native.js.map +1 -1
- package/dist/cjs/createSchemaFromDrizzle.native.js.map +1 -1
- package/dist/cjs/createUseQuery.cjs +6 -0
- package/dist/cjs/createUseQuery.native.js +6 -0
- package/dist/cjs/createUseQuery.native.js.map +1 -1
- package/dist/cjs/createUseQueryDirect.cjs +5 -1
- package/dist/cjs/createUseQueryDirect.native.js +5 -1
- package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
- package/dist/cjs/createZeroClient.authData.test.native.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.native.js.map +1 -1
- package/dist/cjs/generate-helpers.native.js.map +1 -1
- package/dist/cjs/generate-lite.native.js.map +1 -1
- package/dist/cjs/generate-lite.test.native.js.map +1 -1
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
- package/dist/cjs/helpers/clearZeroClientData.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -1
- package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
- package/dist/cjs/helpers/getAuth.native.js.map +1 -1
- package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
- package/dist/cjs/helpers/queryContext.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/helpers/showZeroClientError.native.js.map +1 -1
- package/dist/cjs/helpers/useMutation.native.js.map +1 -1
- package/dist/cjs/helpers/useMutation.test.native.js.map +1 -1
- package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
- package/dist/cjs/httpPull/auth.test.native.js.map +1 -1
- package/dist/cjs/httpPull/churn.test.native.js.map +1 -1
- package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -1
- package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -1
- package/dist/cjs/httpPull/integration.test.native.js.map +1 -1
- package/dist/cjs/httpPull/rebase.test.native.js.map +1 -1
- package/dist/cjs/httpPull/relations.test.native.js.map +1 -1
- package/dist/cjs/httpPull/testHarness.native.js.map +1 -1
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
- package/dist/cjs/httpPullTransport.native.js.map +1 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/instanceRegistry.native.js.map +1 -1
- package/dist/cjs/modelRegistry.native.js.map +1 -1
- package/dist/cjs/multi.native.js.map +1 -1
- package/dist/cjs/multiInstance.test.native.js.map +1 -1
- package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
- package/dist/cjs/queryRegistry.native.js.map +1 -1
- package/dist/cjs/resolveQuery.native.js.map +1 -1
- package/dist/cjs/run.native.js.map +1 -1
- package/dist/cjs/serverWhere.native.js.map +1 -1
- package/dist/cjs/serverWhere.test.native.js.map +1 -1
- package/dist/cjs/state.native.js.map +1 -1
- package/dist/cjs/testSetup.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/useContentStable.cjs +66 -0
- package/dist/cjs/useContentStable.native.js +93 -0
- package/dist/cjs/useContentStable.native.js.map +1 -0
- package/dist/cjs/useContentStable.test.cjs +105 -0
- package/dist/cjs/useContentStable.test.native.js +108 -0
- package/dist/cjs/useContentStable.test.native.js.map +1 -0
- package/dist/cjs/usePermission.test.native.js.map +1 -1
- package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
- package/dist/cjs/useQuery.ssr.test.native.js.map +1 -1
- package/dist/cjs/vite-plugin.native.js.map +1 -1
- package/dist/cjs/where.native.js.map +1 -1
- package/dist/cjs/zeroRunner.native.js.map +1 -1
- package/dist/cjs/zql.native.js.map +1 -1
- package/dist/esm/createUseQuery.mjs +6 -0
- package/dist/esm/createUseQuery.mjs.map +1 -1
- package/dist/esm/createUseQuery.native.js +6 -0
- package/dist/esm/createUseQuery.native.js.map +1 -1
- package/dist/esm/createUseQueryDirect.mjs +5 -1
- package/dist/esm/createUseQueryDirect.mjs.map +1 -1
- package/dist/esm/createUseQueryDirect.native.js +5 -1
- package/dist/esm/createUseQueryDirect.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/useContentStable.mjs +40 -0
- package/dist/esm/useContentStable.mjs.map +1 -0
- package/dist/esm/useContentStable.native.js +64 -0
- package/dist/esm/useContentStable.native.js.map +1 -0
- package/dist/esm/useContentStable.test.mjs +106 -0
- package/dist/esm/useContentStable.test.mjs.map +1 -0
- package/dist/esm/useContentStable.test.native.js +106 -0
- package/dist/esm/useContentStable.test.native.js.map +1 -0
- package/package.json +2 -2
- package/src/createUseQuery.tsx +13 -0
- package/src/createUseQueryDirect.tsx +10 -1
- package/src/useContentStable.test.ts +61 -0
- package/src/useContentStable.ts +78 -0
- package/types/createUseQuery.d.ts.map +1 -1
- package/types/createUseQueryDirect.d.ts.map +1 -1
- package/types/useContentStable.d.ts +3 -0
- package/types/useContentStable.d.ts.map +1 -0
- package/types/useContentStable.test.d.ts +2 -0
- package/types/useContentStable.test.d.ts.map +1 -0
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type UseQueryOptions,
|
|
16
16
|
} from './createUseQuery'
|
|
17
17
|
import { resolveQuery } from './resolveQuery'
|
|
18
|
+
import { useContentStable } from './useContentStable'
|
|
18
19
|
|
|
19
20
|
import type {
|
|
20
21
|
AnyQueryRegistry,
|
|
@@ -327,12 +328,20 @@ export function createUseQueryDirect<Schema extends ZeroSchema>({
|
|
|
327
328
|
}, [queryRequest, enabled, ttl, version])
|
|
328
329
|
|
|
329
330
|
const getEmpty = () => emptyForQuery as DirectSnapshot
|
|
330
|
-
const
|
|
331
|
+
const rawOut = useSyncExternalStore(
|
|
331
332
|
view ? view.subscribe : DISABLED_SUBSCRIBE,
|
|
332
333
|
view ? view.getSnapshot : getEmpty,
|
|
333
334
|
view ? view.getSnapshot : getEmpty,
|
|
334
335
|
)
|
|
335
336
|
|
|
337
|
+
// content-stable inner refs (see createUseQuery.tsx for the rationale).
|
|
338
|
+
const stableData = useContentStable(rawOut[0])
|
|
339
|
+
const stableInfo = useContentStable(rawOut[1])
|
|
340
|
+
const out: DirectSnapshot =
|
|
341
|
+
stableData !== rawOut[0] || stableInfo !== rawOut[1]
|
|
342
|
+
? ([stableData, stableInfo] as DirectSnapshot)
|
|
343
|
+
: rawOut
|
|
344
|
+
|
|
336
345
|
if (!disableMode) {
|
|
337
346
|
lastRef.current = out
|
|
338
347
|
return out
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { isContentEqual } from './useContentStable'
|
|
3
|
+
|
|
4
|
+
describe('isContentEqual', () => {
|
|
5
|
+
it('treats primitives by value', () => {
|
|
6
|
+
expect(isContentEqual(1, 1)).toBe(true)
|
|
7
|
+
expect(isContentEqual('a', 'a')).toBe(true)
|
|
8
|
+
expect(isContentEqual(true, true)).toBe(true)
|
|
9
|
+
expect(isContentEqual(undefined, undefined)).toBe(true)
|
|
10
|
+
expect(isContentEqual(null, null)).toBe(true)
|
|
11
|
+
expect(isContentEqual(1, 2)).toBe(false)
|
|
12
|
+
expect(isContentEqual('a', 'b')).toBe(false)
|
|
13
|
+
expect(isContentEqual(null, undefined)).toBe(false)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('treats arrays by length + per-element strict-eq', () => {
|
|
17
|
+
expect(isContentEqual([], [])).toBe(true)
|
|
18
|
+
expect(isContentEqual([1, 2, 3], [1, 2, 3])).toBe(true)
|
|
19
|
+
expect(isContentEqual([1, 2, 3], [1, 2])).toBe(false)
|
|
20
|
+
expect(isContentEqual([1, 2, 3], [1, 2, 4])).toBe(false)
|
|
21
|
+
// distinct objects with same fields → strict-eq fails per element
|
|
22
|
+
expect(isContentEqual([{ id: 1 }], [{ id: 1 }])).toBe(false)
|
|
23
|
+
// same object ref shared → strict-eq holds
|
|
24
|
+
const row = { id: 1 }
|
|
25
|
+
expect(isContentEqual([row], [row])).toBe(true)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('treats objects by same keys + per-value strict-eq', () => {
|
|
29
|
+
expect(isContentEqual({}, {})).toBe(true)
|
|
30
|
+
expect(isContentEqual({ a: 1, b: 2 }, { a: 1, b: 2 })).toBe(true)
|
|
31
|
+
expect(isContentEqual({ a: 1 }, { a: 1, b: 2 })).toBe(false)
|
|
32
|
+
expect(isContentEqual({ a: 1 }, { a: 2 })).toBe(false)
|
|
33
|
+
// distinct nested objects → strict-eq fails on the nested value
|
|
34
|
+
expect(isContentEqual({ row: { id: 1 } }, { row: { id: 1 } })).toBe(false)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('rejects mismatched array vs object', () => {
|
|
38
|
+
expect(isContentEqual([], {})).toBe(false)
|
|
39
|
+
expect(isContentEqual([1], { 0: 1 })).toBe(false)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('handles a typical zero singular-query refresh — same row content', () => {
|
|
43
|
+
// simulating zero's deepClone: the row is a fresh object but every field
|
|
44
|
+
// matches the previous snapshot. shallow strict-eq sees fresh nested but
|
|
45
|
+
// top-level keys are primitives → equal.
|
|
46
|
+
const prev = { id: 's1', name: 'warden', level: 1, hp: 60, maxHp: 60 }
|
|
47
|
+
const next = { id: 's1', name: 'warden', level: 1, hp: 60, maxHp: 60 }
|
|
48
|
+
expect(isContentEqual(prev, next)).toBe(true)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('detects a real refresh — one field changed', () => {
|
|
52
|
+
const prev = { id: 's1', hp: 60 }
|
|
53
|
+
const next = { id: 's1', hp: 59 }
|
|
54
|
+
expect(isContentEqual(prev, next)).toBe(false)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('handles zero info objects ({type: "complete"} vs {type: "unknown"})', () => {
|
|
58
|
+
expect(isContentEqual({ type: 'complete' }, { type: 'complete' })).toBe(true)
|
|
59
|
+
expect(isContentEqual({ type: 'complete' }, { type: 'unknown' })).toBe(false)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// content-stable identity for useQuery's inner data + info values.
|
|
2
|
+
//
|
|
3
|
+
// upstream zero-react's view does `data = deepClone(snap)` inside #onData
|
|
4
|
+
// whenever the materialized view notifies, which means each notification
|
|
5
|
+
// produces a fresh JS reference even when the row's content hasn't changed.
|
|
6
|
+
// consumers that destructure `[row] = useQuery(byId, {id})` and then use
|
|
7
|
+
// `row` as a useEffect dep — or that depend on `[rows]` for a list query —
|
|
8
|
+
// see a "change" on every notification and re-run effects redundantly.
|
|
9
|
+
//
|
|
10
|
+
// `useContentStable(value)` keeps a ref to the previous value and returns the
|
|
11
|
+
// old reference when shallow-content equality holds, so downstream identity
|
|
12
|
+
// comparisons (`useMemo`, `useEffect`, `useCallback`) don't false-fire.
|
|
13
|
+
//
|
|
14
|
+
// equality semantics:
|
|
15
|
+
// - primitives + same-reference → return as-is
|
|
16
|
+
// - arrays: same length + each element strict-eq → reuse previous ref
|
|
17
|
+
// - objects: same keys + each value strict-eq → reuse previous ref
|
|
18
|
+
// - mismatches → swap the ref forward
|
|
19
|
+
//
|
|
20
|
+
// the per-element check is strict-eq (not recursive). that's intentional —
|
|
21
|
+
// it catches the common case where a query result is the same row(s) on a
|
|
22
|
+
// re-emit. for nested-object stability the rows themselves get the same
|
|
23
|
+
// treatment one level up (the wrapping useQuery already applies this to
|
|
24
|
+
// `data` so an array-of-rows query holds row references stable if each row
|
|
25
|
+
// content-matches its previous snapshot row).
|
|
26
|
+
|
|
27
|
+
import { useRef } from 'react'
|
|
28
|
+
|
|
29
|
+
function arraysShallowEqual(a: readonly unknown[], b: readonly unknown[]): boolean {
|
|
30
|
+
if (a === b) return true
|
|
31
|
+
if (a.length !== b.length) return false
|
|
32
|
+
for (let i = 0; i < a.length; i++) {
|
|
33
|
+
if (!Object.is(a[i], b[i])) return false
|
|
34
|
+
}
|
|
35
|
+
return true
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function objectsShallowEqual(a: object, b: object): boolean {
|
|
39
|
+
if (a === b) return true
|
|
40
|
+
const ak = Object.keys(a as Record<string, unknown>)
|
|
41
|
+
const bk = Object.keys(b as Record<string, unknown>)
|
|
42
|
+
if (ak.length !== bk.length) return false
|
|
43
|
+
for (const k of ak) {
|
|
44
|
+
if (
|
|
45
|
+
!Object.is(
|
|
46
|
+
(a as Record<string, unknown>)[k],
|
|
47
|
+
(b as Record<string, unknown>)[k],
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
return true
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function isContentEqual(a: unknown, b: unknown): boolean {
|
|
56
|
+
if (Object.is(a, b)) return true
|
|
57
|
+
if (a === null || b === null || a === undefined || b === undefined) return false
|
|
58
|
+
if (typeof a !== 'object' || typeof b !== 'object') return false
|
|
59
|
+
const aIsArr = Array.isArray(a)
|
|
60
|
+
const bIsArr = Array.isArray(b)
|
|
61
|
+
if (aIsArr !== bIsArr) return false
|
|
62
|
+
if (aIsArr && bIsArr) {
|
|
63
|
+
return arraysShallowEqual(a as readonly unknown[], b as readonly unknown[])
|
|
64
|
+
}
|
|
65
|
+
return objectsShallowEqual(a as object, b as object)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// returns `value` on first render, then returns the previous reference for as
|
|
69
|
+
// long as content-equality holds. mutating the ref during render is safe here
|
|
70
|
+
// because we read its current value AFTER deciding whether to swap — no read-
|
|
71
|
+
// then-write race that React would warn about.
|
|
72
|
+
export function useContentStable<T>(value: T): T {
|
|
73
|
+
const ref = useRef<T>(value)
|
|
74
|
+
if (!isContentEqual(ref.current, value)) {
|
|
75
|
+
ref.current = value
|
|
76
|
+
}
|
|
77
|
+
return ref.current
|
|
78
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUseQuery.d.ts","sourceRoot":"","sources":["../src/createUseQuery.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAGjE,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"createUseQuery.d.ts","sourceRoot":"","sources":["../src/createUseQuery.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAGjE,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAGhE,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,MAAM,IAAI,UAAU,EACpB,GAAG,EACJ,MAAM,gBAAgB,CAAA;AAGvB,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,YAAY,CAAA;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAA;CACtB,CAAA;AAED,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,MAAM,MAAM,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAA;AAExF,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,UAAU,IAAI;IAEpD,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,EAC5D,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EACtD,MAAM,EAAE,IAAI,EACZ,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,GAClC,WAAW,CAAC,OAAO,CAAC,CAAC;IAGxB,CAAC,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,EACtD,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EACtD,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,GAClC,WAAW,CAAC,OAAO,CAAC,CAAA;CACxB,CAAA;AAiBD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5F;AAGD,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG;;;EAYtE;AAED,wBAAgB,cAAc,CAAC,MAAM,SAAS,UAAU,EAAE,EACxD,eAAe,EACf,aAAa,GACd,EAAE;IACD,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1C,aAAa,EAAE,gBAAgB,CAAA;CAChC,GAAG,YAAY,CAAC,MAAM,CAAC,CAoHvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUseQueryDirect.d.ts","sourceRoot":"","sources":["../src/createUseQueryDirect.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAqD,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAEvF,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"createUseQueryDirect.d.ts","sourceRoot":"","sources":["../src/createUseQueryDirect.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAqD,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAEvF,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EACV,gBAAgB,EAEhB,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAkBvB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CACT,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,GACtB;QACD,WAAW,CACT,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,gBAAgB,KAAK,IAAI,GACpE,IAAI,CAAA;QACP,OAAO,IAAI,IAAI,CAAA;QACf,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;KAC1B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,UAAU,IAAI,CAAC,KAAK,EAAE;IACpE,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1C,aAAa,EAAE,gBAAgB,CAAA;IAC/B,OAAO,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAA;IACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAC7B,KAAK,YAAY,CAAC,MAAM,CAAC,CAAA;AAG1B,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,KAAK,GAAG,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AA2LD,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,UAAU,EAAE,EAC9D,eAAe,EACf,aAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,UAAU,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAiGpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useContentStable.d.ts","sourceRoot":"","sources":["../src/useContentStable.ts"],"names":[],"mappings":"AAsDA,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAW9D;AAMD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAM/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useContentStable.test.d.ts","sourceRoot":"","sources":["../src/useContentStable.test.ts"],"names":[],"mappings":""}
|