reselect-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +473 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/reselectKit.development.cjs +683 -0
- package/dist/cjs/reselectKit.development.cjs.map +1 -0
- package/dist/cjs/reselectKit.production.min.cjs +2 -0
- package/dist/cjs/reselectKit.production.min.cjs.map +1 -0
- package/dist/reselectKit.d.ts +248 -0
- package/dist/reselectKit.mjs +678 -0
- package/dist/reselectKit.mjs.map +1 -0
- package/package.json +70 -0
- package/src/__data__/state.ts +97 -0
- package/src/__tests__/createAdaptedSelector.test.ts +134 -0
- package/src/__tests__/createBoundSelector.test.ts +351 -0
- package/src/__tests__/createCachedSequenceSelector.test.ts +24 -0
- package/src/__tests__/createCachedStructuredSelector.test.ts +29 -0
- package/src/__tests__/createChainSelector.test.ts +404 -0
- package/src/__tests__/createEmptySelector.test.ts +99 -0
- package/src/__tests__/createPathSelector.test.ts +81 -0
- package/src/__tests__/createPropSelector.test.ts +36 -0
- package/src/__tests__/createSegmentSelector.test.ts +31 -0
- package/src/__tests__/createSequenceSelector.test.ts +62 -0
- package/src/_helpers/__tests__/arePathsEqual.test.ts +27 -0
- package/src/_helpers/__tests__/getObjectPaths.test.ts +56 -0
- package/src/_helpers/__tests__/temporaryAssign.test.ts +59 -0
- package/src/_helpers/arePathsEqual.ts +15 -0
- package/src/_helpers/defineDynamicSelectorName.ts +10 -0
- package/src/_helpers/generateSelectorKey.ts +15 -0
- package/src/_helpers/getObjectPaths.ts +13 -0
- package/src/_helpers/getSelectorName.ts +7 -0
- package/src/_helpers/isCachedSelector.ts +9 -0
- package/src/_helpers/isObject.ts +3 -0
- package/src/_helpers/stringifyFunction.ts +3 -0
- package/src/_helpers/temporaryAssign.ts +80 -0
- package/src/_hooks/__tests__/useMemoWith.test.ts +31 -0
- package/src/_hooks/__tests__/useSelector.test.ts +87 -0
- package/src/_hooks/useMemoWith.ts +11 -0
- package/src/_hooks/useSelector.ts +34 -0
- package/src/cache/TreeCache.ts +126 -0
- package/src/cache/__tests__/TreeCacheObject.test.ts +188 -0
- package/src/cache/__tests__/intervalMapCache.test.ts +133 -0
- package/src/cache/intervalMapCache.ts +97 -0
- package/src/createAdaptedSelector.ts +75 -0
- package/src/createBoundSelector.ts +197 -0
- package/src/createCachedSequenceSelector.ts +18 -0
- package/src/createCachedStructuredSelector.ts +44 -0
- package/src/createChainSelector.ts +230 -0
- package/src/createEmptySelector.ts +27 -0
- package/src/createPathSelector.ts +208 -0
- package/src/createPropSelector.ts +28 -0
- package/src/createSegmentSelector.ts +6 -0
- package/src/createSequenceSelector.ts +15 -0
- package/src/createStructuredSelector.ts +3 -0
- package/src/debug/__tests__/debug.test.ts +20 -0
- package/src/debug/debug.ts +7 -0
- package/src/debug/withDebugName.ts +28 -0
- package/src/index.ts +26 -0
- package/src/keys/__tests__/arrayComposeKeySelectors.test.ts +52 -0
- package/src/keys/__tests__/createKeySelectorCreator.test.ts +246 -0
- package/src/keys/__tests__/stringComposeKeySelectors.test.ts +52 -0
- package/src/keys/arrayComposeKeySelectors.ts +20 -0
- package/src/keys/createKeySelectorComposer.ts +68 -0
- package/src/keys/createKeySelectorCreator.ts +106 -0
- package/src/keys/defaultKeySelector.ts +1 -0
- package/src/keys/stringComposeKeySelectors.ts +15 -0
- package/src/types.ts +43 -0
- package/src/vitest-globals.d.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reselectKit.development.cjs","names":["createSelector","createCachedSelector","reselectStructuredSelector","createCachedSelector","FlatObjectCache","shallowEqual"],"sources":["../../src/createSegmentSelector.ts","../../src/_helpers/isObject.ts","../../src/_helpers/defineDynamicSelectorName.ts","../../src/debug/debug.ts","../../src/debug/withDebugName.ts","../../src/_helpers/getSelectorName.ts","../../src/createPathSelector.ts","../../src/createPropSelector.ts","../../src/keys/createKeySelectorComposer.ts","../../src/_helpers/arePathsEqual.ts","../../src/keys/defaultKeySelector.ts","../../src/_helpers/isCachedSelector.ts","../../src/keys/createKeySelectorCreator.ts","../../src/keys/stringComposeKeySelectors.ts","../../src/_helpers/temporaryAssign.ts","../../src/_helpers/getObjectPaths.ts","../../src/createBoundSelector.ts","../../src/createEmptySelector.ts","../../src/createAdaptedSelector.ts","../../src/_helpers/stringifyFunction.ts","../../src/_helpers/generateSelectorKey.ts","../../src/createChainSelector.ts","../../src/createSequenceSelector.ts","../../src/createCachedSequenceSelector.ts","../../src/createStructuredSelector.ts","../../src/createCachedStructuredSelector.ts","../../src/keys/arrayComposeKeySelectors.ts","../../src/cache/intervalMapCache.ts","../../src/cache/TreeCache.ts","../../src/_hooks/useMemoWith.ts","../../src/_hooks/useSelector.ts"],"sourcesContent":["export function createSegmentSelector<State, SelectedSegment extends State | State[keyof State]>(\n fn: (state: State) => SelectedSegment,\n initial: SelectedSegment,\n): (state: State) => SelectedSegment {\n return (state: State) => fn(state) ?? initial;\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object';\n};\n","export const defineDynamicSelectorName = (selector: unknown, selectorNameGetter: () => string) => {\n let overriddenSelectorName: string;\n Object.defineProperty(selector, 'selectorName', {\n configurable: true,\n get: () => overriddenSelectorName ?? selectorNameGetter(),\n set: (value: string) => {\n overriddenSelectorName = value;\n },\n });\n};\n","let debugMode = false;\n\nexport const isDebugMode = () => debugMode;\n\nexport const setDebugMode = (value: boolean) => {\n debugMode = value;\n};\n","import { defineDynamicSelectorName } from '../_helpers/defineDynamicSelectorName';\nimport { isDebugMode } from './debug';\n\n/**\n * Runs `callback` only outside production and only while debug mode is enabled.\n * Centralizes the `NODE_ENV` / `isDebugMode` guard that the selector factories\n * would otherwise repeat around every debug-name assignment.\n */\nexport const runInDebug = (callback: () => void) => {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n /* istanbul ignore else */\n if (isDebugMode()) {\n callback();\n }\n }\n};\n\n/**\n * Assigns a lazily-computed debug name to `selector`, guarded by\n * {@link runInDebug}. Covers the common single-name case; use `runInDebug`\n * directly when a block needs to name several selectors at once.\n */\nexport const withDebugName = (selector: unknown, selectorNameGetter: () => string) => {\n runInDebug(() => {\n defineDynamicSelectorName(selector, selectorNameGetter);\n });\n};\n","export const getSelectorName = (selector: { name: string; selectorName?: string }): string => {\n if ('selectorName' in selector && selector.selectorName) {\n return selector.selectorName;\n }\n\n return selector.name;\n};\n","import { Selector } from '@veksa/reselect';\nimport { NamedParametricSelector, NamedSelector, Path } from './types';\nimport { isObject } from './_helpers/isObject';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\n\nexport type Defined<T> = Exclude<T, undefined>;\n\nexport type IsOptional<T> = undefined extends T ? true : null extends T ? true : false;\n\nexport type IsObject<T> = T extends object ? true : false;\n\nexport type PathSelector<S, R, D> = NamedSelector<S, R, [], D> & {\n path: Path;\n};\n\nexport type PathParametricSelector<S, P, R, D> = NamedParametricSelector<S, P, R, D> & {\n path: Path;\n};\n\ntype Required<T> = { [P in keyof T]-?: Exclude<T[P], undefined | null> };\n\nexport type RequiredSelectorBuilder<S, R, D> = R extends object\n ? { [K in keyof R]: () => PathSelector<S, NonNullable<R[K]>, D> }\n : {};\n\nexport type OptionalSelectorBuilder<S, R, D> = ((\n defaultValue?: R,\n) => PathSelector<S, R extends undefined ? Defined<R> : R, D>) &\n (R extends object\n ? { [K in keyof Required<R>]: () => PathSelector<S, NonNullable<R[K]>, D> }\n : {});\n\nexport type RequiredParametricSelectorBuilder<S, P, R, D> = R extends object\n ? { [K in keyof R]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D> }\n : {};\n\nexport type OptionalParametricSelectorBuilder<S, P, R, D> = ((\n defaultValue?: R,\n) => PathParametricSelector<S, P, R extends undefined ? Defined<R> : R, D>) &\n (R extends object\n ? { [K in keyof Required<R>]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D> }\n : {});\n\nexport type RequiredObjectSelectorWrapper<S, R, D> = {\n [K in keyof R]-?: IsOptional<R[K]> extends true\n ? OptionalPathSelectorType<S, R[K], D>\n : RequiredPathSelectorType<S, R[K], D>;\n};\n\nexport type OptionalObjectSelectorWrapper<S, R, D> = {\n [K in keyof R]-?: OptionalPathSelectorType<S, R[K], D>;\n};\n\nexport type RequiredObjectParametricSelectorWrapper<S, P, R, D> = {\n [K in keyof R]-?: IsOptional<R[K]> extends true\n ? OptionalPathParametricSelectorType<S, P, R[K], D>\n : RequiredPathParametricSelectorType<S, P, R[K], D>;\n};\n\nexport type OptionalObjectParametricSelectorWrapper<S, P, R, D> = {\n [K in keyof R]-?: OptionalPathParametricSelectorType<S, P, R[K], D>;\n};\n\nexport type RequiredArraySelectorWrapper<S, R, D> = {\n length: RequiredPathSelectorType<S, number, D>;\n\n [K: number]: IsOptional<R> extends true\n ? OptionalPathSelectorType<S, R, D>\n : RequiredPathSelectorType<S, R, D>;\n};\n\nexport type OptionalArraySelectorWrapper<S, R, D> = {\n length: RequiredPathSelectorType<S, number, D>;\n\n [K: number]: OptionalPathSelectorType<S, R, D>;\n};\n\nexport type RequiredArrayParametricSelectorWrapper<S, P, R, D> = {\n length: RequiredPathParametricSelectorType<S, P, number, D>;\n\n [K: number]: IsOptional<R> extends true\n ? OptionalPathParametricSelectorType<S, P, R, D>\n : RequiredPathParametricSelectorType<S, P, R, D>;\n};\n\nexport type OptionalArrayParametricSelectorWrapper<S, P, R, D> = {\n length: RequiredPathParametricSelectorType<S, P, number, D>;\n\n [K: number]: OptionalPathParametricSelectorType<S, P, R, D>;\n};\n\nexport type RequiredDataSelectorWrapper<S, R, D> = R extends unknown[]\n ? RequiredArraySelectorWrapper<S, R[number], D>\n : IsObject<R> extends true\n ? RequiredObjectSelectorWrapper<S, R, D>\n : RequiredSelectorBuilder<S, R, D>;\n\nexport type OptionalDataSelectorWrapper<S, R, D> = R extends unknown[]\n ? OptionalArraySelectorWrapper<S, R[number], D>\n : IsObject<R> extends true\n ? OptionalObjectSelectorWrapper<S, R, D>\n : OptionalSelectorBuilder<S, R, D>;\n\nexport type RequiredDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[]\n ? RequiredArrayParametricSelectorWrapper<S, P, R[number], D>\n : IsObject<R> extends true\n ? RequiredObjectParametricSelectorWrapper<S, P, R, D>\n : RequiredParametricSelectorBuilder<S, P, R, D>;\n\nexport type OptionalDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[]\n ? OptionalArrayParametricSelectorWrapper<S, P, R[number], D>\n : IsObject<R> extends true\n ? OptionalObjectParametricSelectorWrapper<S, P, R, D>\n : OptionalParametricSelectorBuilder<S, P, R, D>;\n\nexport type RequiredPathSelectorType<S, R, D> = RequiredSelectorBuilder<S, R, D> &\n RequiredDataSelectorWrapper<S, NonNullable<R>, D>;\n\nexport type OptionalPathSelectorType<S, R, D> = OptionalSelectorBuilder<S, R, D> &\n OptionalDataSelectorWrapper<S, NonNullable<R>, D>;\n\nexport type RequiredPathParametricSelectorType<S, P, R, D> = RequiredParametricSelectorBuilder<\n S,\n P,\n R,\n D\n> &\n RequiredDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;\n\nexport type OptionalPathParametricSelectorType<S, P, R, D> = OptionalParametricSelectorBuilder<\n S,\n P,\n R,\n D\n> &\n OptionalDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;\n\nconst defaultVoidFunction = () => {\n return;\n};\n\n/** @internal */\nexport const innerCreatePathSelector = (\n baseSelector: (...args: unknown[]) => unknown,\n path: Path = [],\n applyMeta: (selector: unknown) => void = defaultVoidFunction,\n): unknown => {\n const pathLength = path.length;\n\n const proxyTarget = (defaultValue?: unknown) => {\n function resultSelector(state?: unknown, props?: unknown) {\n // Selectors are almost always reached as `(state)` or `(state, props)`, and\n // dispatching those two arities directly keeps `arguments` out of the hot\n // path. The arity is matched exactly rather than always passing two: reselect\n // memoizes on the argument list, so handing a one-argument selector a second\n // `undefined` would change its cache key.\n let result: unknown;\n\n if (arguments.length === 2) {\n result = baseSelector(state, props);\n } else if (arguments.length === 1) {\n result = baseSelector(state);\n } else {\n result = baseSelector.apply(null, arguments as unknown as unknown[]);\n }\n\n for (let i = 0; i < pathLength && isObject(result); i += 1) {\n result = result[path[i]];\n }\n\n // For optional properties, we want to exclude undefined from the return type\n // but still return undefined if the property doesn't exist\n return result === undefined ? defaultValue : result;\n }\n\n Object.assign(resultSelector, baseSelector, { path });\n resultSelector.dependencies = [baseSelector];\n\n applyMeta(resultSelector);\n\n withDebugName(resultSelector, () => {\n const baseName = getSelectorName(baseSelector);\n\n return [baseName, ...path].join('.');\n });\n\n return resultSelector;\n };\n\n return new Proxy(proxyTarget, {\n get: (_target, key) => {\n return innerCreatePathSelector(baseSelector, [...path, String(key)], applyMeta);\n },\n });\n};\n\nexport function createPathSelector<S, R, P = void>(\n baseSelector: P extends void ? Selector<S, R> : Selector<S, R, [P]>,\n): P extends void\n ? IsOptional<R> extends true\n ? OptionalPathSelectorType<S, R, [Selector<S, R>]>\n : RequiredPathSelectorType<S, R, [Selector<S, R>]>\n : IsOptional<R> extends true\n ? OptionalPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]>\n : RequiredPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]> {\n return innerCreatePathSelector(baseSelector as (...args: unknown[]) => unknown) as any;\n}\n","import { Selector } from '@veksa/reselect';\nimport { innerCreatePathSelector, RequiredPathParametricSelectorType } from './createPathSelector';\nimport { Path } from './types';\n\nconst propSelectorSymbol = Symbol.for('PropSelector');\n\nexport const isPropSelector = (selector: unknown): selector is { path: Path } => {\n return selector instanceof Object && propSelectorSymbol in selector;\n};\n\nexport function createPropSelector<P>(): RequiredPathParametricSelectorType<\n unknown,\n P,\n P,\n [Selector<unknown, P, [P]>]\n> {\n const propsSelector = (_state: unknown, props: unknown) => props;\n\n const applyMeta = (selector: unknown) => {\n Object.defineProperty(selector, propSelectorSymbol, { value: true });\n };\n\n return innerCreatePathSelector(\n propsSelector,\n [],\n applyMeta,\n ) as RequiredPathParametricSelectorType<unknown, P, P, [Selector<unknown, P, [P]>]>;\n}\n","import { KeySelector } from '@veksa/re-reselect';\nimport { UnionToIntersection } from '../types';\n\nexport const composedKeySelectorSymbol = Symbol.for('ComposedKeySelector');\n\n/**\n * The loosest shape a key selector can take: a function of `state` plus any\n * number of extra arguments (props, ...). Used for variadic tuple inference.\n */\ntype AnyKeySelector = KeySelector<any>;\n\n/** Intersection of every input key selector's `state` argument. */\ntype ComposedState<Ks extends readonly AnyKeySelector[]> = UnionToIntersection<\n { [Index in keyof Ks]: Parameters<Ks[Index]>[0] }[number]\n>;\n\n/** Union of every input key selector's `props` argument (position 1), if any. */\ntype PropsUnion<Ks extends readonly AnyKeySelector[]> = {\n [Index in keyof Ks]: Parameters<Ks[Index]> extends [any, infer Props, ...any[]] ? Props : never;\n}[number];\n\n/** Intersection of every input key selector's `props`, or `never` if none are parametric. */\ntype ComposedProps<Ks extends readonly AnyKeySelector[]> = [PropsUnion<Ks>] extends [never]\n ? never\n : UnionToIntersection<PropsUnion<Ks>>;\n\n/**\n * The key selector produced by a {@link KeySelectorComposer}: a function that\n * intersects the `state` (and `props`, when any input is parametric) of every\n * composed key selector, tagged with the original inputs as `dependencies`.\n */\nexport type OutputKeySelector<S, P, D extends readonly AnyKeySelector[]> = ([P] extends [never]\n ? (state: S) => unknown\n : (state: S, props: P) => unknown) & {\n dependencies: D;\n};\n\n/**\n * Composes N key selectors into a single one. A single variadic signature with\n * tuple inference replaces the former per-arity overload set.\n */\nexport type KeySelectorComposer = <Ks extends readonly AnyKeySelector[]>(\n ...keySelectors: Ks\n) => OutputKeySelector<ComposedState<Ks>, ComposedProps<Ks>, Ks>;\n\nexport function isComposedKeySelector(\n keySelector: AnyKeySelector,\n): keySelector is AnyKeySelector & { dependencies: AnyKeySelector[] } {\n return 'dependencies' in keySelector && composedKeySelectorSymbol in keySelector;\n}\n\nexport function createKeySelectorComposer(\n baseKeySelectorComposer: (...keySelectors: AnyKeySelector[]) => AnyKeySelector,\n): KeySelectorComposer {\n return ((...keySelectors: AnyKeySelector[]) => {\n const resultSelector = baseKeySelectorComposer(...keySelectors) as AnyKeySelector & {\n dependencies: AnyKeySelector[];\n };\n\n resultSelector.dependencies = keySelectors;\n\n Object.defineProperty(resultSelector, composedKeySelectorSymbol, {\n value: true,\n });\n\n return resultSelector;\n }) as KeySelectorComposer;\n}\n","import { Path } from '../types';\n\nexport const arePathsEqual = (path: Path, anotherPath: Path) => {\n if (path.length !== anotherPath.length) {\n return false;\n }\n\n for (let i = 0; i < path.length; i += 1) {\n if (path[i] !== anotherPath[i]) {\n return false;\n }\n }\n\n return true;\n};\n","export const defaultKeySelector = () => '<DefaultKey>';\n","import { CachedSelector } from '../types';\n\nexport const isCachedSelector = (selector: unknown): selector is CachedSelector => {\n return (\n selector instanceof Object &&\n 'keySelector' in selector &&\n typeof (selector as CachedSelector).keySelector === 'function'\n );\n};\n","import { KeySelector } from '@veksa/re-reselect';\nimport { isPropSelector } from '../createPropSelector';\nimport { isComposedKeySelector, KeySelectorComposer } from './createKeySelectorComposer';\nimport { arePathsEqual } from '../_helpers/arePathsEqual';\nimport { defaultKeySelector } from './defaultKeySelector';\nimport { isCachedSelector } from '../_helpers/isCachedSelector';\n\nconst areSelectorsEqual = (selector: unknown, another: unknown) => {\n if (selector === another) {\n return true;\n }\n\n if (isPropSelector(selector) && isPropSelector(another)) {\n return arePathsEqual(selector.path, another.path);\n }\n\n return false;\n};\n\nconst flatKeySelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n if (isComposedKeySelector(keySelector)) {\n result.push(...flatKeySelectors(keySelector.dependencies));\n } else {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nconst uniqKeySelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n const isKeySelectorAdded = result.some((resultKeySelector) =>\n areSelectorsEqual(keySelector, resultKeySelector),\n );\n if (!isKeySelectorAdded) {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nexport const excludeDefaultSelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n if (keySelector !== defaultKeySelector) {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nexport function createKeySelectorCreator(\n keySelectorComposer: KeySelectorComposer,\n): <S, D>(selectorInputs: { inputSelectors: D; keySelector?: KeySelector<S> }) => KeySelector<S> {\n return <S>({\n inputSelectors,\n keySelector,\n }: {\n inputSelectors: unknown;\n keySelector?: KeySelector<S>;\n }) => {\n let keySelectors: KeySelector<S>[] = [];\n\n if (keySelector) {\n keySelectors.push(keySelector);\n }\n\n (inputSelectors as unknown[]).forEach((selector) => {\n if (isCachedSelector(selector)) {\n keySelectors.push(selector.keySelector);\n }\n });\n\n keySelectors = flatKeySelectors(keySelectors);\n keySelectors = uniqKeySelectors(keySelectors);\n keySelectors = excludeDefaultSelectors(keySelectors);\n\n if (keySelectors.length === 0) {\n return defaultKeySelector;\n }\n\n if (keySelectors.length === 1) {\n const [resultSelector] = keySelectors;\n return resultSelector;\n }\n\n // The composer infers a `UnionToIntersection` state from the runtime array,\n // which TS can't see as identical to `S`; narrow it back for the caller.\n return keySelectorComposer(...keySelectors) as KeySelector<S>;\n };\n}\n","import { createKeySelectorComposer } from './createKeySelectorComposer';\n\nexport const stringComposeKeySelectors = createKeySelectorComposer(\n (...keySelectors) =>\n (state, props) => {\n let key: unknown = keySelectors[0](state, props);\n\n for (let i = 1; i < keySelectors.length; i += 1) {\n key += ':';\n key += keySelectors[i](state, props);\n }\n\n return key;\n },\n);\n","const noop = () => undefined;\n\nexport function temporaryAssign(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): {\n result: Record<string, unknown>;\n rollback: () => void;\n} {\n if (typeof target !== 'object' || target === null) {\n return {\n result: source,\n rollback: noop,\n };\n }\n\n // Both containers and the closure are allocated only once something actually has\n // to be restored. This runs on every call of every bound selector, and the usual\n // case is a binding whose keys the target does not have — one entry in\n // `deleteProps`, nothing in `temporary` — while a re-entrant call that finds the\n // binding already applied changes nothing at all and can share `noop`.\n let temporary: Record<string, unknown> | null = null;\n let deleteProps: string[] | null = null;\n\n for (const prop in source as unknown as object) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n const targetProp = target[prop];\n const sourceProp = source[prop];\n\n if (targetProp !== sourceProp) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n if (temporary === null) {\n temporary = {};\n }\n temporary[prop] = targetProp;\n } else {\n if (deleteProps === null) {\n deleteProps = [];\n }\n deleteProps.push(prop);\n }\n\n target[prop] = sourceProp;\n }\n }\n }\n\n if (temporary === null && deleteProps === null) {\n return {\n result: target,\n rollback: noop,\n };\n }\n\n const restore = temporary;\n const remove = deleteProps;\n\n const rollback = () => {\n if (restore !== null) {\n for (const prop in restore) {\n if (Object.prototype.hasOwnProperty.call(restore, prop)) {\n target[prop] = restore[prop];\n }\n }\n }\n\n if (remove !== null) {\n for (const prop of remove) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n delete target[prop];\n }\n }\n }\n };\n\n return {\n result: target,\n rollback,\n };\n}\n","import { Path } from '../types';\nimport { isObject } from './isObject';\n\nexport const getObjectPaths = (value: unknown, parentPath: Path = []): Path[] => {\n if (!isObject(value)) {\n return [parentPath];\n }\n\n return Object.keys(value).reduce<Path[]>((result, key) => {\n const paths = getObjectPaths(value[key], parentPath.concat([key]));\n return result.concat(paths);\n }, []);\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector, NamedParametricSelector, NamedSelector } from './types';\nimport { isComposedKeySelector, KeySelectorComposer } from './keys/createKeySelectorComposer';\nimport { isPropSelector } from './createPropSelector';\nimport { excludeDefaultSelectors } from './keys/createKeySelectorCreator';\nimport { stringComposeKeySelectors } from './keys/stringComposeKeySelectors';\nimport { temporaryAssign } from './_helpers/temporaryAssign';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { isObject } from './_helpers/isObject';\nimport { getObjectPaths } from './_helpers/getObjectPaths';\nimport { arePathsEqual } from './_helpers/arePathsEqual';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\n\nconst generateBindingName = <P extends object>(binding: P) => {\n const structure = Object.keys(binding).reduce(\n (result, key) => ({\n ...result,\n [key]: '[*]',\n }),\n {},\n );\n const structureKeys = Object.keys(structure).join();\n const structureValues = Object.values(structure).join();\n\n return `${structureKeys} -> ${structureValues}`;\n};\n\n/**\n * The special type to prevent binding of non optional props on optional values\n */\nexport type BoundSelector<S, P2, P1 extends Partial<P2>, R> =\n P2 extends Pick<P1, keyof P2>\n ? Exclude<keyof P1, keyof P2> extends never\n ? NamedSelector<S, R>\n : NamedParametricSelector<S, Omit<P1, keyof P2>, R>\n : never;\n\nexport type BoundSelectorOptions<S, P2, P1 extends Partial<P2>, R> = {\n bindingStrategy?: (\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n ) => Selector<S, R, [Omit<P1, keyof P2>]>;\n keySelectorComposer?: KeySelectorComposer;\n};\n\nconst innerCreateBoundSelector = <S, P2, P1 extends Partial<P2>, R>(\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n) => {\n const boundSelector = (state: S, props: Omit<P1, keyof P2> | void) =>\n baseSelector(state, {\n ...props,\n ...binding,\n } as unknown as P1);\n\n return boundSelector as BoundSelector<S, P2, P1, R>;\n};\n\nconst createBoundInnerSelector = <S, P2 extends object, P1 extends Partial<P2>, R, OR extends R>(\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n options: BoundSelectorOptions<S, P2, P1, OR> = {},\n): BoundSelector<S, P2, P1, R> => {\n const bindingStrategy =\n (options.bindingStrategy as typeof innerCreateBoundSelector) ?? innerCreateBoundSelector;\n\n const keySelectorComposer = options.keySelectorComposer ?? stringComposeKeySelectors;\n\n const boundSelector = bindingStrategy(baseSelector, binding);\n\n Object.assign(boundSelector, baseSelector);\n boundSelector.dependencies = [baseSelector];\n\n withDebugName(boundSelector, () => {\n const baseName = getSelectorName(baseSelector);\n const bindingName = generateBindingName(binding);\n\n return `${baseName} (${bindingName})`;\n });\n\n if (isCachedSelector(baseSelector)) {\n const cachedBoundSelector = boundSelector as unknown as CachedSelector;\n\n if (baseSelector.getMatchingSelector) {\n cachedBoundSelector.getMatchingSelector = bindingStrategy(\n baseSelector.getMatchingSelector,\n binding,\n );\n }\n\n if (baseSelector.removeMatchingSelector) {\n cachedBoundSelector.removeMatchingSelector = bindingStrategy(\n baseSelector.removeMatchingSelector,\n binding,\n );\n }\n\n const baseKeySelector = baseSelector.keySelector;\n\n if (isObject(binding)) {\n const paths = getObjectPaths(binding);\n let keySelectors = isComposedKeySelector(baseKeySelector)\n ? baseKeySelector.dependencies\n : [baseKeySelector];\n\n keySelectors = excludeDefaultSelectors(keySelectors);\n\n keySelectors = keySelectors\n .filter(\n (keySelector) =>\n !isPropSelector(keySelector) ||\n !paths.some((path) => arePathsEqual(keySelector.path, path)),\n )\n .map((keySelector) =>\n isPropSelector(keySelector) ? keySelector : bindingStrategy(keySelector, binding),\n );\n\n if (keySelectors.length === 0) {\n cachedBoundSelector.keySelector = defaultKeySelector;\n } else if (keySelectors.length === 1) {\n const [keySelector] = keySelectors;\n cachedBoundSelector.keySelector = keySelector;\n } else {\n cachedBoundSelector.keySelector = keySelectorComposer(...keySelectors);\n }\n } else {\n cachedBoundSelector.keySelector = bindingStrategy(baseKeySelector, binding);\n }\n }\n\n return boundSelector;\n};\n\nexport const createBoundSelector: typeof createBoundInnerSelector = (baseSelector, binding) => {\n return createBoundInnerSelector(baseSelector, binding, {\n bindingStrategy: (selector, bindingProps) => {\n const source = bindingProps as unknown as Record<string, unknown>;\n const keys = Object.keys(source);\n\n /**\n * Almost every binding is a single key — `bound(selector, { positionId })` —\n * and specialising it removes the two allocations the generic path costs per\n * call: the `{ result, rollback }` object and the `rollback` closure. On a\n * graph with a bound selector per row those are the calls that dominate.\n *\n * The `delete` in the restore stays deliberately. Leaving the key behind as\n * `undefined` would be cheaper — it avoids putting the caller's props object\n * into dictionary mode — but it also changes the object's shape, and\n * `useSelector` memoizes props shallowly: a props object that has grown an\n * extra key never again compares equal to a freshly built one, so the\n * memoization the binding exists to protect would be defeated.\n */\n if (keys.length === 1) {\n const key = keys[0];\n const value = source[key];\n\n return (state, props) => {\n const target = props as unknown as Record<string, unknown>;\n\n if (typeof target !== 'object' || target === null) {\n return selector(state, source as Parameters<typeof baseSelector>[1]);\n }\n\n const previous = target[key];\n\n // A re-entrant call that finds the binding already applied has nothing to\n // save and nothing to restore.\n if (previous === value) {\n return selector(state, props as Parameters<typeof baseSelector>[1]);\n }\n\n const had = Object.prototype.hasOwnProperty.call(target, key);\n target[key] = value;\n\n try {\n return selector(state, props as Parameters<typeof baseSelector>[1]);\n } finally {\n if (had) {\n target[key] = previous;\n } else {\n delete target[key];\n }\n }\n };\n }\n\n return (state, props) => {\n const { result: nextProps, rollback } = temporaryAssign(props, source);\n const result = selector(state, nextProps as Parameters<typeof baseSelector>[1]);\n rollback();\n return result;\n };\n },\n });\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector } from './types';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\n\n/**\n * Creates a selector that always resolves to `undefined`. Used as the \"no link\"\n * branch of a chain (e.g. an optional relation that isn't present).\n *\n * When the base selector is cached, the empty selector is tagged with\n * {@link defaultKeySelector} so that it still passes {@link isCachedSelector}\n * and takes part in key-selector composition. The default key is deliberately\n * the only cache-related metadata copied: an empty selector has no result to\n * memoize, so it needs no `cache` / `getMatchingSelector` of its own, and the\n * default key is dropped by `excludeDefaultSelectors` during composition.\n */\nexport const createEmptySelector = <S, R>(\n baseSelector: Selector<S, R, any[]>,\n): Selector<S, R | undefined> => {\n const emptySelector = () => undefined;\n\n if (isCachedSelector(baseSelector)) {\n (emptySelector as unknown as CachedSelector).keySelector = defaultKeySelector;\n }\n\n return emptySelector;\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector, NamedParametricSelector } from './types';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\n\nconst generateMappingName = <P1 extends object, P2>(mapping: (props: P2) => P1) => {\n if (mapping.name) {\n return mapping.name;\n }\n\n const structure = mapping(\n new Proxy(\n {},\n {\n get: (_target, key) => key,\n },\n ) as P2,\n );\n const structureKeys = Object.keys(structure).join();\n const structureValues = Object.values(structure).join();\n\n return `${structureKeys} -> ${structureValues}`;\n};\n\nconst innerCreateAdaptedSelector =\n <S, P1, P2, R>(\n baseSelector: Selector<S, R, [P1]>,\n mapping: (props: P2) => P1,\n ): NamedParametricSelector<S, P2, R> =>\n (state: S, props: P2) => {\n return baseSelector(state, mapping(props));\n };\n\nexport const createAdaptedSelector = <S, P1 extends object, P2, R>(\n baseSelector: Selector<S, R, [P1]>,\n mapping: (props: P2) => P1,\n) => {\n const adaptedSelector = innerCreateAdaptedSelector(baseSelector, mapping);\n\n Object.assign(adaptedSelector, baseSelector);\n adaptedSelector.dependencies = [baseSelector];\n\n withDebugName(adaptedSelector, () => {\n const baseName = getSelectorName(baseSelector);\n const mappingName = generateMappingName(mapping);\n\n return `${baseName} (${mappingName})`;\n });\n\n if (isCachedSelector(baseSelector)) {\n const cachedAdaptedSelector = adaptedSelector as unknown as CachedSelector;\n\n if (baseSelector.getMatchingSelector) {\n cachedAdaptedSelector.getMatchingSelector = innerCreateAdaptedSelector(\n baseSelector.getMatchingSelector,\n mapping,\n );\n }\n\n if (baseSelector.removeMatchingSelector) {\n cachedAdaptedSelector.removeMatchingSelector = innerCreateAdaptedSelector(\n baseSelector.removeMatchingSelector,\n mapping,\n );\n }\n\n cachedAdaptedSelector.keySelector = innerCreateAdaptedSelector(\n baseSelector.keySelector,\n mapping,\n );\n }\n\n return adaptedSelector;\n};\n","export const stringifyFunction = (source: unknown) => {\n return String(source).replace(/\\s+/g, ' ').trim();\n};\n","import { stringifyFunction } from './stringifyFunction';\n\nexport const generateSelectorKey = (selector: unknown) => {\n const dependencies = (selector as { dependencies?: unknown[] }).dependencies ?? [];\n\n let result = stringifyFunction(selector);\n\n for (let i = dependencies.length - 1; i >= 0; i -= 1) {\n const dependency = dependencies[i];\n\n result += stringifyFunction(dependency);\n }\n\n return result;\n};\n","import { createSelectorCreator, Selector } from '@veksa/reselect';\nimport { createCachedSelector, ICacheObject, KeySelector } from '@veksa/re-reselect';\nimport { KeySelectorComposer } from './keys/createKeySelectorComposer';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\nimport { stringComposeKeySelectors } from './keys/stringComposeKeySelectors';\nimport { createKeySelectorCreator } from './keys/createKeySelectorCreator';\nimport { runInDebug, withDebugName } from './debug/withDebugName';\nimport { defineDynamicSelectorName } from './_helpers/defineDynamicSelectorName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { generateSelectorKey } from './_helpers/generateSelectorKey';\nimport { stringifyFunction } from './_helpers/stringifyFunction';\n\nexport type SelectorChain<R1, S1, R2> = (result: R1) => Selector<S1, R2>;\n\nexport type ParametricSelectorChain<R1, S1, P1, R2> = (result: R1) => Selector<S1, R2, [P1]>;\n\nexport type SelectorChainHierarchy<\n C extends SelectorChain<any, any, any>,\n H extends SelectorChainHierarchy<any, any>,\n> = C & { parentChain?: H };\n\nexport type ParametricSelectorChainHierarchy<\n C extends ParametricSelectorChain<any, any, any, any>,\n H extends ParametricSelectorChainHierarchy<any, any>,\n> = C & { parentChain?: H };\n\nexport type CreateSelectorOptions<SelectorCreator extends typeof createSelectorCreator> = {\n selectorCreator: ReturnType<SelectorCreator>;\n cacheObject: ICacheObject;\n};\n\nexport type ChainSelectorOptions<\n SelectorCreator extends typeof createSelectorCreator = typeof createSelectorCreator,\n> = {\n createSelectorOptions?: () => CreateSelectorOptions<SelectorCreator>;\n keySelectorComposer?: KeySelectorComposer;\n};\n\ninterface ChainSelectorResult<S1, R1> {\n chain: <S2, R2 = any>(\n fn: SelectorChain<R1, S2, R2>,\n chainOptions?: ChainSelectorOptions,\n ) => ChainSelectorResult<S1 & S2, R2>;\n map: <R2>(\n fn: (result: R1) => R2,\n mapOptions?: ChainSelectorOptions,\n ) => ChainSelectorResult<S1, R2>;\n build: () => Selector<S1, R1, []> & {\n chainHierarchy: SelectorChainHierarchy<any, any> | undefined;\n };\n}\n\ninterface ParametricChainSelectorResult<S1, P1, R1> {\n chain: <S2, P2 = unknown, R2 = any>(\n fn: ParametricSelectorChain<R1, S2, P2, R2>,\n chainOptions?: ChainSelectorOptions,\n ) => ParametricChainSelectorResult<S1 & S2, P1 & P2, R2>;\n map: <R2>(\n fn: (result: R1) => R2,\n mapOptions?: ChainSelectorOptions,\n ) => ParametricChainSelectorResult<S1, P1, R2>;\n build: () => Selector<S1, R1, [P1]> & {\n chainHierarchy: ParametricSelectorChainHierarchy<any, any> | undefined;\n };\n}\n\nexport function createChainSelector<S1, R1>(\n selector: Selector<S1, R1>,\n options?: ChainSelectorOptions,\n prevChain?: SelectorChainHierarchy<any, any>,\n): ChainSelectorResult<S1, R1>;\n\nexport function createChainSelector<S1, P1, R1>(\n selector: Selector<S1, R1, [P1]>,\n options?: ChainSelectorOptions,\n prevChain?: ParametricSelectorChainHierarchy<any, any>,\n): ParametricChainSelectorResult<S1, P1, R1>;\n\nexport function createChainSelector<S1, P1, R1>(\n selector: any,\n options?: ChainSelectorOptions,\n prevChain?: any,\n): any {\n const chain = <S2, P2, R2>(fn: any, chainOptions?: ChainSelectorOptions) => {\n const combinedOptions = {\n ...options,\n ...chainOptions,\n };\n\n const keySelector = isCachedSelector(selector) ? selector.keySelector : defaultKeySelector;\n\n const { createSelectorOptions = () => ({}), keySelectorComposer = stringComposeKeySelectors } =\n combinedOptions;\n\n const keySelectorCreator = createKeySelectorCreator(keySelectorComposer);\n\n const higherOrderSelector = createCachedSelector(\n [selector],\n fn,\n )({\n ...createSelectorOptions(),\n keySelector,\n });\n\n withDebugName(higherOrderSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `higher order for ${baseName} (${stringifyFunction(fn)})`;\n });\n\n type CombineSelector = Selector<S1 & S2, R1 & R2, [P1 & P2]> & {\n dependencies: any;\n cache: ICacheObject;\n keySelector?: KeySelector<S1 & S2>;\n };\n\n const combinedSelector: CombineSelector = (state: S1 & S2, props: P1 & P2): R1 & R2 => {\n const derivedSelector: any = (higherOrderSelector as any)(state, props);\n\n runInDebug(() => {\n // Debug-only: shows the branch this call took. Nothing outside the debug\n // tooling reads it, so in production it was an array allocated per call and\n // abandoned. The static `[higherOrderSelector]` below still stands.\n combinedSelector.dependencies = [higherOrderSelector, derivedSelector];\n\n const derivedSelectorName = getSelectorName(derivedSelector);\n\n if (!derivedSelectorName) {\n defineDynamicSelectorName(derivedSelector, () => {\n const baseName = getSelectorName(selector);\n const derivedSelectorKey = generateSelectorKey(derivedSelector);\n\n return `derived from ${baseName} (${derivedSelectorKey})`;\n });\n }\n\n defineDynamicSelectorName(combinedSelector, () => {\n const baseName = getSelectorName(selector);\n const dependencyName = getSelectorName(derivedSelector);\n\n return `${baseName} (chained by ${dependencyName})`;\n });\n });\n\n return derivedSelector(state, props);\n };\n\n combinedSelector.dependencies = [higherOrderSelector];\n combinedSelector.cache = higherOrderSelector.cache;\n\n /**\n * The derived selector's key selector, memoized on the derived selector itself.\n *\n * This used to be a second `createCachedSelector` over `[higherOrderSelector]`,\n * which meant every key computation paid a whole extra cached-selector layer —\n * its own key computation, its own cache lookup, and its own evaluation of\n * `higherOrderSelector` — to produce a value that depends on nothing but the\n * derived selector. A `WeakMap` keyed on that selector is the same mapping with\n * none of the layer, and it shares across cache keys rather than per key.\n *\n * Note what is deliberately *not* memoized: the `(state, props)` pair. `props`\n * is mutated in place by `createBoundSelector`, so two calls can pass the same\n * object reference with different contents, and a reference-keyed cache would\n * hand back a stale selector.\n */\n const derivedKeySelectors = new WeakMap<object, KeySelector<S1 & S2>>();\n\n combinedSelector.keySelector = (state: S1 & S2, props: P1 & P2) => {\n const derivedSelector: any = (higherOrderSelector as any)(state, props);\n\n let derivedKeySelector = derivedKeySelectors.get(derivedSelector);\n\n if (derivedKeySelector === undefined) {\n derivedKeySelector = keySelectorCreator({\n inputSelectors: [higherOrderSelector, derivedSelector],\n }) as KeySelector<S1 & S2>;\n\n derivedKeySelectors.set(derivedSelector, derivedKeySelector);\n }\n\n return (derivedKeySelector as any)(state, props);\n };\n\n withDebugName(combinedSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `${baseName} (will be chained ${stringifyFunction(fn)})`;\n });\n\n const nextPrevChain = Object.assign(fn, {\n parentChain: prevChain,\n });\n\n return createChainSelector<S1 & S2, P1 & P2, R1 & R2>(\n combinedSelector,\n combinedOptions,\n nextPrevChain,\n );\n };\n\n const map = <R2>(fn: (result: R1) => R2, mapOptions?: ChainSelectorOptions) => {\n const mapSelector = (result: R1) => {\n const output = fn(result);\n const mapSelector = () => output;\n\n withDebugName(mapSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `mapped from ${baseName} (${stringifyFunction(fn)})`;\n });\n\n return mapSelector;\n };\n\n return chain(mapSelector, mapOptions);\n };\n\n const build = () => {\n return Object.assign(selector, {\n chainHierarchy: prevChain,\n });\n };\n\n return {\n chain,\n map,\n build,\n };\n}\n","import { createSelector, Selector } from '@veksa/reselect';\n\nexport function createSequenceSelector<S, R>(\n selectors: Selector<S, R>[],\n selectorCreator?: typeof createSelector,\n): Selector<S, R[]>;\n\nexport function createSequenceSelector<S, P, R>(\n selectors: Selector<S, R, [P]>[],\n selectorCreator?: typeof createSelector,\n): Selector<S, R[], [P]>;\n\nexport function createSequenceSelector(selectors: any, selectorCreator = createSelector) {\n return selectorCreator(selectors, (...results: unknown[]) => results);\n}\n","import { createSelector, Selector } from '@veksa/reselect';\nimport { createCachedSelector, PolymorphicCachedOptions } from '@veksa/re-reselect';\nimport { createSequenceSelector } from './createSequenceSelector';\n\nexport function createCachedSequenceSelector<S, R>(\n selectors: Selector<S, R>[],\n): (options: PolymorphicCachedOptions<Selector<S, R>[], R[]>) => Selector<S, R[]>;\n\nexport function createCachedSequenceSelector<S, P, R>(\n selectors: Selector<S, R, [P]>[],\n): (options: PolymorphicCachedOptions<Selector<S, R, [P]>[], R[]>) => Selector<S, R[], [P]>;\n\nexport function createCachedSequenceSelector(selectors: any): any {\n return createSequenceSelector(\n selectors,\n createCachedSelector as unknown as typeof createSelector,\n );\n}\n","import { createStructuredSelector as reselectStructuredSelector } from '@veksa/reselect';\n\nexport const createStructuredSelector = reselectStructuredSelector;\n","import { createSelector, Selector, SelectorResultsMap, SelectorsObject } from '@veksa/reselect';\nimport { createCachedSelector, PolymorphicCachedOptions } from '@veksa/re-reselect';\nimport { createStructuredSelector } from './createStructuredSelector';\nimport { UnionToIntersection } from './types';\n\n/** Intersection of the `state` argument of every selector in the object. */\ntype StructuredState<M extends SelectorsObject> = UnionToIntersection<\n { [K in keyof M]: Parameters<M[K]>[0] }[keyof M]\n>;\n\n/** Union of the `props` argument (position 1) of every parametric selector. */\ntype StructuredPropsUnion<M extends SelectorsObject> = {\n [K in keyof M]: Parameters<M[K]> extends [any, infer Props, ...any[]] ? Props : never;\n}[keyof M];\n\n/** The extra-arguments tuple: `[Props]` when any selector is parametric, else `[]`. */\ntype StructuredParams<M extends SelectorsObject> = [StructuredPropsUnion<M>] extends [never]\n ? []\n : [UnionToIntersection<StructuredPropsUnion<M>>];\n\n/** The input selectors as reselect sees them, used to type the cached options. */\ntype StructuredInputs<M extends SelectorsObject> = Selector<\n StructuredState<M>,\n unknown,\n StructuredParams<M>\n>[];\n\n/**\n * A single variadic signature replaces the former `Selector` / `ParametricSelector`\n * conditional: `state` and `props` are derived from the selectors object, so a\n * parametric input keeps its props type without a separate overload.\n */\nexport function createCachedStructuredSelector<M extends SelectorsObject>(\n selectors: M,\n): (\n options: PolymorphicCachedOptions<StructuredInputs<M>, SelectorResultsMap<M>>,\n) => Selector<StructuredState<M>, SelectorResultsMap<M>, StructuredParams<M>>;\n\nexport function createCachedStructuredSelector(selectors: any): any {\n return createStructuredSelector(\n selectors,\n createCachedSelector as unknown as typeof createSelector,\n );\n}\n","import { createKeySelectorComposer } from './createKeySelectorComposer';\n\nexport const arrayComposeKeySelectors = createKeySelectorComposer(\n (...keySelectors) =>\n (state, props) => {\n let keyPath: unknown[] = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const key: unknown = keySelectors[i](state, props);\n\n if (Array.isArray(key)) {\n keyPath = keyPath.concat(key);\n } else {\n keyPath.push(key);\n }\n }\n\n return keyPath;\n },\n);\n","import { ICacheObject } from '@veksa/re-reselect';\n\ninterface CacheEntry {\n data: unknown;\n time: number;\n}\n\n/**\n * Buckets used to live in a module-level `Record<string, …>` keyed by an\n * incrementing numeric id, which meant every `get` and `set` coerced that number to\n * a string and re-read the global record — four times per cache hit in `get`.\n * Holding the entries on the instance removes both, and a `Map` keeps non-string\n * keys as they are instead of stringifying them.\n */\nconst buckets = new Set<IntervalMapCache>();\n\nconst cacheLifetime = 10000;\n\nlet garbageCollectorStarted = false;\n\nconst runGarbageCollector = () => {\n const currentTime = Date.now();\n\n buckets.forEach((bucket) => {\n if (bucket.sweep(currentTime)) {\n // A bucket the sweep emptied is dropped from the registry, so a cache whose\n // selector has been discarded stops being reachable from module scope and\n // becomes collectable. Registration happens again on the next `set`, so a\n // cache that is still in use simply re-enters.\n buckets.delete(bucket);\n }\n });\n\n window.setTimeout(runGarbageCollector, cacheLifetime);\n};\n\nexport const initGarbageCollector = () => {\n if (garbageCollectorStarted) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n garbageCollectorStarted = true;\n window.setTimeout(runGarbageCollector, cacheLifetime);\n }\n};\n\nexport class IntervalMapCache implements ICacheObject {\n private entries = new Map<unknown, CacheEntry>();\n\n public set(key: any, data: any) {\n const entry = this.entries.get(key);\n\n if (entry === undefined) {\n buckets.add(this);\n this.entries.set(key, { data, time: Date.now() });\n } else {\n entry.data = data;\n entry.time = Date.now();\n }\n }\n\n public get(key: any) {\n const entry = this.entries.get(key);\n\n if (entry === undefined) {\n return undefined;\n }\n\n entry.time = Date.now();\n\n return entry.data;\n }\n\n public remove(key: any) {\n this.entries.delete(key);\n }\n\n public clear() {\n this.entries.clear();\n buckets.delete(this);\n }\n\n /**\n * Drops entries untouched for longer than the lifetime. Returns whether the\n * bucket is now empty, which is what lets the collector unregister it.\n */\n public sweep(currentTime: number) {\n this.entries.forEach((entry, key) => {\n if (currentTime - entry.time > cacheLifetime) {\n this.entries.delete(key);\n }\n });\n\n return this.entries.size === 0;\n }\n}\n","import { FlatObjectCache, ICacheObject } from '@veksa/re-reselect';\n\nexport type TreeCacheObjectOptions = {\n cacheObjectCreator?: () => ICacheObject;\n};\n\nconst normalizeKey = (key: unknown): unknown[] => (Array.isArray(key) ? key : [key]);\n\nclass TreeCacheNode {\n public cache?: ICacheObject;\n\n public selectorFn?: unknown;\n}\n\nexport class TreeCache implements ICacheObject {\n private readonly cacheObjectCreator: () => ICacheObject;\n\n private root: TreeCacheNode;\n\n constructor(options: TreeCacheObjectOptions) {\n this.cacheObjectCreator = options.cacheObjectCreator ?? (() => new FlatObjectCache());\n\n const root = new TreeCacheNode();\n root.cache = this.cacheObjectCreator();\n this.root = root;\n }\n\n public clear() {\n const root = new TreeCacheNode();\n root.cache = this.cacheObjectCreator();\n this.root = root;\n }\n\n public get(key: unknown) {\n // A scalar key is the common case and `normalizeKey` would wrap it in a fresh\n // array on every lookup. The tree walk for one level is a single cache read, so\n // it is spelled out rather than allocated for.\n if (!Array.isArray(key)) {\n const cacheResponse: unknown = this.root.cache?.get(key);\n\n return cacheResponse instanceof TreeCacheNode ? cacheResponse.selectorFn : undefined;\n }\n\n let currentNode = this.root;\n\n for (let i = 0; i < key.length; i += 1) {\n const item = key[i];\n const cacheResponse: unknown = currentNode.cache?.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n return undefined;\n }\n }\n\n return currentNode.selectorFn;\n }\n\n public set(key: unknown, selectorFn: unknown) {\n const keyPath = normalizeKey(key);\n let currentNode = this.root;\n\n for (let i = 0; i < keyPath.length; i += 1) {\n const item = keyPath[i];\n\n if (!currentNode.cache) {\n currentNode.cache = this.cacheObjectCreator();\n }\n\n const cacheResponse: unknown = currentNode.cache.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n const node = new TreeCacheNode();\n currentNode.cache.set(item, node);\n currentNode = node;\n }\n }\n\n currentNode.selectorFn = selectorFn;\n }\n\n public remove(key: unknown) {\n const keyPath = normalizeKey(key);\n let currentNode = this.root;\n\n for (let i = 0; i < keyPath.length; i += 1) {\n const item = keyPath[i];\n const cacheResponse: unknown = currentNode.cache?.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n return;\n }\n }\n\n currentNode.selectorFn = undefined;\n }\n\n /**\n * Called by re-reselect on every cache operation, so neither the wrapping array\n * nor the `every` callback is allocated here.\n */\n public isValidCacheKey(key: unknown) {\n const rootCache = this.root.cache;\n\n if (rootCache?.isValidCacheKey === undefined) {\n return true;\n }\n\n if (!Array.isArray(key)) {\n return rootCache.isValidCacheKey(key);\n }\n\n for (let i = 0; i < key.length; i += 1) {\n if (!rootCache.isValidCacheKey(key[i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n","import { useRef } from 'react';\n\nexport const useMemoWith = <T>(value: T, comparator: (a: T, b: T) => boolean) => {\n const ref = useRef<T>(value);\n\n if (!comparator(value, ref.current)) {\n ref.current = value;\n }\n\n return ref.current;\n};\n","import { shallowEqual, useSelector as useReduxSelector } from '@veksa/react-redux';\nimport { useMemoWith } from './useMemoWith';\nimport { useCallback, useMemo } from 'react';\n\nexport function useSelector<S extends object, R>(selector: (state: S) => R): R;\n\nexport function useSelector<S extends object, P, R>(\n selector: (state: S, props: P) => R,\n props: P,\n): R;\n\nexport function useSelector(selector: Function, ...params: any[]) {\n const props = params[0];\n const memoizedProps = useMemoWith(props, shallowEqual);\n\n // unfreeze props for performance optimization (see temporaryAssign.ts)\n const unfrozenProps = useMemo(() => {\n return Object.isFrozen(memoizedProps) ? { ...memoizedProps } : memoizedProps;\n }, [memoizedProps]);\n\n const memoizedPropsSelector = useCallback(\n (state: unknown) => {\n return selector(state, unfrozenProps);\n },\n [selector, unfrozenProps],\n );\n\n return useReduxSelector(memoizedPropsSelector, {\n devModeChecks: {\n stabilityCheck: 'never',\n identityFunctionCheck: 'never',\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@veksa/re-reselect"),t=require("@veksa/reselect"),n=require("@veksa/react-redux"),r=require("react");function i(e,t){return n=>e(n)??t}const a=e=>typeof e==`object`&&!!e;let o=!1;const s=()=>o,c=e=>{o=e},l=()=>{},u=(e,t=[],n=l)=>{let r=t.length;return new Proxy(i=>{function o(n,o){let s;s=arguments.length===2?e(n,o):arguments.length===1?e(n):e.apply(null,arguments);for(let e=0;e<r&&a(s);e+=1)s=s[t[e]];return s===void 0?i:s}return Object.assign(o,e,{path:t}),o.dependencies=[e],n(o),o},{get:(r,i)=>u(e,[...t,String(i)],n)})};function d(e){return u(e)}const f=Symbol.for(`PropSelector`),p=e=>e instanceof Object&&f in e;function m(){return u((e,t)=>t,[],e=>{Object.defineProperty(e,f,{value:!0})})}const h=Symbol.for(`ComposedKeySelector`);function g(e){return`dependencies`in e&&h in e}function _(e){return((...t)=>{let n=e(...t);return n.dependencies=t,Object.defineProperty(n,h,{value:!0}),n})}const v=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0},y=()=>`<DefaultKey>`,b=e=>e instanceof Object&&`keySelector`in e&&typeof e.keySelector==`function`,x=(e,t)=>e===t?!0:p(e)&&p(t)?v(e.path,t.path):!1,S=e=>{let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];g(r)?t.push(...S(r.dependencies)):t.push(r)}return t},C=e=>{let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];t.some(e=>x(r,e))||t.push(r)}return t},w=e=>{let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];r!==y&&t.push(r)}return t};function T(e){return({inputSelectors:t,keySelector:n})=>{let r=[];if(n&&r.push(n),t.forEach(e=>{b(e)&&r.push(e.keySelector)}),r=S(r),r=C(r),r=w(r),r.length===0)return y;if(r.length===1){let[e]=r;return e}return e(...r)}}const E=_((...e)=>(t,n)=>{let r=e[0](t,n);for(let i=1;i<e.length;i+=1)r+=`:`,r+=e[i](t,n);return r}),D=()=>void 0;function O(e,t){if(typeof e!=`object`||!e)return{result:t,rollback:D};let n=null,r=null;for(let i in t)if(Object.prototype.hasOwnProperty.call(t,i)){let a=e[i],o=t[i];a!==o&&(Object.prototype.hasOwnProperty.call(e,i)?(n===null&&(n={}),n[i]=a):(r===null&&(r=[]),r.push(i)),e[i]=o)}if(n===null&&r===null)return{result:e,rollback:D};let i=n,a=r;return{result:e,rollback:()=>{if(i!==null)for(let t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[t]=i[t]);if(a!==null)for(let t of a)Object.prototype.hasOwnProperty.call(e,t)&&delete e[t]}}}const k=(e,t=[])=>a(e)?Object.keys(e).reduce((n,r)=>{let i=k(e[r],t.concat([r]));return n.concat(i)},[]):[t],A=(e,t)=>(n,r)=>e(n,{...r,...t}),j=(e,t,n={})=>{let r=n.bindingStrategy??A,i=n.keySelectorComposer??E,o=r(e,t);if(Object.assign(o,e),o.dependencies=[e],b(e)){let n=o;e.getMatchingSelector&&(n.getMatchingSelector=r(e.getMatchingSelector,t)),e.removeMatchingSelector&&(n.removeMatchingSelector=r(e.removeMatchingSelector,t));let s=e.keySelector;if(a(t)){let e=k(t),a=g(s)?s.dependencies:[s];if(a=w(a),a=a.filter(t=>!p(t)||!e.some(e=>v(t.path,e))).map(e=>p(e)?e:r(e,t)),a.length===0)n.keySelector=y;else if(a.length===1){let[e]=a;n.keySelector=e}else n.keySelector=i(...a)}else n.keySelector=r(s,t)}return o},M=(e,t)=>j(e,t,{bindingStrategy:(e,t)=>{let n=t,r=Object.keys(n);if(r.length===1){let t=r[0],i=n[t];return(r,a)=>{let o=a;if(typeof o!=`object`||!o)return e(r,n);let s=o[t];if(s===i)return e(r,a);let c=Object.prototype.hasOwnProperty.call(o,t);o[t]=i;try{return e(r,a)}finally{c?o[t]=s:delete o[t]}}}return(t,r)=>{let{result:i,rollback:a}=O(r,n),o=e(t,i);return a(),o}}}),N=e=>{let t=()=>void 0;return b(e)&&(t.keySelector=y),t},P=(e,t)=>(n,r)=>e(n,t(r)),F=(e,t)=>{let n=P(e,t);if(Object.assign(n,e),n.dependencies=[e],b(e)){let r=n;e.getMatchingSelector&&(r.getMatchingSelector=P(e.getMatchingSelector,t)),e.removeMatchingSelector&&(r.removeMatchingSelector=P(e.removeMatchingSelector,t)),r.keySelector=P(e.keySelector,t)}return n};function I(t,n,r){let i=(i,a)=>{let o={...n,...a},s=b(t)?t.keySelector:y,{createSelectorOptions:c=()=>({}),keySelectorComposer:l=E}=o,u=T(l),d=(0,e.createCachedSelector)([t],i)({...c(),keySelector:s}),f=(e,t)=>d(e,t)(e,t);f.dependencies=[d],f.cache=d.cache;let p=new WeakMap;return f.keySelector=(e,t)=>{let n=d(e,t),r=p.get(n);return r===void 0&&(r=u({inputSelectors:[d,n]}),p.set(n,r)),r(e,t)},I(f,o,Object.assign(i,{parentChain:r}))};return{chain:i,map:(e,t)=>i(t=>{let n=e(t);return()=>n},t),build:()=>Object.assign(t,{chainHierarchy:r})}}function L(e,n=t.createSelector){return n(e,(...e)=>e)}function R(t){return L(t,e.createCachedSelector)}const z=t.createStructuredSelector;function B(t){return z(t,e.createCachedSelector)}const V=_((...e)=>(t,n)=>{let r=[];for(let i=0;i<e.length;i+=1){let a=e[i](t,n);Array.isArray(a)?r=r.concat(a):r.push(a)}return r}),H=new Set,U=1e4;let W=!1;const G=()=>{let e=Date.now();H.forEach(t=>{t.sweep(e)&&H.delete(t)}),window.setTimeout(G,U)},K=()=>{W||typeof window<`u`&&(W=!0,window.setTimeout(G,U))};var q=class{constructor(){this.entries=new Map}set(e,t){let n=this.entries.get(e);n===void 0?(H.add(this),this.entries.set(e,{data:t,time:Date.now()})):(n.data=t,n.time=Date.now())}get(e){let t=this.entries.get(e);if(t!==void 0)return t.time=Date.now(),t.data}remove(e){this.entries.delete(e)}clear(){this.entries.clear(),H.delete(this)}sweep(e){return this.entries.forEach((t,n)=>{e-t.time>U&&this.entries.delete(n)}),this.entries.size===0}};const J=e=>Array.isArray(e)?e:[e];var Y=class{},X=class{constructor(t){this.cacheObjectCreator=t.cacheObjectCreator??(()=>new e.FlatObjectCache);let n=new Y;n.cache=this.cacheObjectCreator(),this.root=n}clear(){let e=new Y;e.cache=this.cacheObjectCreator(),this.root=e}get(e){if(!Array.isArray(e)){let t=this.root.cache?.get(e);return t instanceof Y?t.selectorFn:void 0}let t=this.root;for(let n=0;n<e.length;n+=1){let r=e[n],i=t.cache?.get(r);if(i instanceof Y)t=i;else return}return t.selectorFn}set(e,t){let n=J(e),r=this.root;for(let e=0;e<n.length;e+=1){let t=n[e];r.cache||=this.cacheObjectCreator();let i=r.cache.get(t);if(i instanceof Y)r=i;else{let e=new Y;r.cache.set(t,e),r=e}}r.selectorFn=t}remove(e){let t=J(e),n=this.root;for(let e=0;e<t.length;e+=1){let r=t[e],i=n.cache?.get(r);if(i instanceof Y)n=i;else return}n.selectorFn=void 0}isValidCacheKey(e){let t=this.root.cache;if(t?.isValidCacheKey===void 0)return!0;if(!Array.isArray(e))return t.isValidCacheKey(e);for(let n=0;n<e.length;n+=1)if(!t.isValidCacheKey(e[n]))return!1;return!0}};const Z=(e,t)=>{let n=(0,r.useRef)(e);return t(e,n.current)||(n.current=e),n.current};function Q(e,...t){let i=t[0],a=Z(i,n.shallowEqual),o=(0,r.useMemo)(()=>Object.isFrozen(a)?{...a}:a,[a]);return(0,n.useSelector)((0,r.useCallback)(t=>e(t,o),[e,o]),{devModeChecks:{stabilityCheck:`never`,identityFunctionCheck:`never`}})}exports.IntervalMapCache=q,exports.TreeCache=X,exports.arrayComposeKeySelectors=V,exports.createAdaptedSelector=F,exports.createBoundSelector=M,exports.createCachedSequenceSelector=R,exports.createCachedStructuredSelector=B,exports.createChainSelector=I,exports.createEmptySelector=N,exports.createKeySelectorComposer=_,exports.createKeySelectorCreator=T,exports.createPathSelector=d,exports.createPropSelector=m,exports.createSegmentSelector=i,exports.defaultKeySelector=y,exports.initGarbageCollector=K,exports.isDebugMode=s,exports.setDebugMode=c,exports.stringComposeKeySelectors=E,exports.useSelector=Q;
|
|
2
|
+
//# sourceMappingURL=reselectKit.production.min.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reselectKit.production.min.cjs","names":["createSelector","createCachedSelector","reselectStructuredSelector","createCachedSelector","FlatObjectCache","shallowEqual"],"sources":["../../src/createSegmentSelector.ts","../../src/_helpers/isObject.ts","../../src/_helpers/defineDynamicSelectorName.ts","../../src/debug/debug.ts","../../src/debug/withDebugName.ts","../../src/_helpers/getSelectorName.ts","../../src/createPathSelector.ts","../../src/createPropSelector.ts","../../src/keys/createKeySelectorComposer.ts","../../src/_helpers/arePathsEqual.ts","../../src/keys/defaultKeySelector.ts","../../src/_helpers/isCachedSelector.ts","../../src/keys/createKeySelectorCreator.ts","../../src/keys/stringComposeKeySelectors.ts","../../src/_helpers/temporaryAssign.ts","../../src/_helpers/getObjectPaths.ts","../../src/createBoundSelector.ts","../../src/createEmptySelector.ts","../../src/createAdaptedSelector.ts","../../src/_helpers/stringifyFunction.ts","../../src/_helpers/generateSelectorKey.ts","../../src/createChainSelector.ts","../../src/createSequenceSelector.ts","../../src/createCachedSequenceSelector.ts","../../src/createStructuredSelector.ts","../../src/createCachedStructuredSelector.ts","../../src/keys/arrayComposeKeySelectors.ts","../../src/cache/intervalMapCache.ts","../../src/cache/TreeCache.ts","../../src/_hooks/useMemoWith.ts","../../src/_hooks/useSelector.ts"],"sourcesContent":["export function createSegmentSelector<State, SelectedSegment extends State | State[keyof State]>(\n fn: (state: State) => SelectedSegment,\n initial: SelectedSegment,\n): (state: State) => SelectedSegment {\n return (state: State) => fn(state) ?? initial;\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object';\n};\n","export const defineDynamicSelectorName = (selector: unknown, selectorNameGetter: () => string) => {\n let overriddenSelectorName: string;\n Object.defineProperty(selector, 'selectorName', {\n configurable: true,\n get: () => overriddenSelectorName ?? selectorNameGetter(),\n set: (value: string) => {\n overriddenSelectorName = value;\n },\n });\n};\n","let debugMode = false;\n\nexport const isDebugMode = () => debugMode;\n\nexport const setDebugMode = (value: boolean) => {\n debugMode = value;\n};\n","import { defineDynamicSelectorName } from '../_helpers/defineDynamicSelectorName';\nimport { isDebugMode } from './debug';\n\n/**\n * Runs `callback` only outside production and only while debug mode is enabled.\n * Centralizes the `NODE_ENV` / `isDebugMode` guard that the selector factories\n * would otherwise repeat around every debug-name assignment.\n */\nexport const runInDebug = (callback: () => void) => {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n /* istanbul ignore else */\n if (isDebugMode()) {\n callback();\n }\n }\n};\n\n/**\n * Assigns a lazily-computed debug name to `selector`, guarded by\n * {@link runInDebug}. Covers the common single-name case; use `runInDebug`\n * directly when a block needs to name several selectors at once.\n */\nexport const withDebugName = (selector: unknown, selectorNameGetter: () => string) => {\n runInDebug(() => {\n defineDynamicSelectorName(selector, selectorNameGetter);\n });\n};\n","export const getSelectorName = (selector: { name: string; selectorName?: string }): string => {\n if ('selectorName' in selector && selector.selectorName) {\n return selector.selectorName;\n }\n\n return selector.name;\n};\n","import { Selector } from '@veksa/reselect';\nimport { NamedParametricSelector, NamedSelector, Path } from './types';\nimport { isObject } from './_helpers/isObject';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\n\nexport type Defined<T> = Exclude<T, undefined>;\n\nexport type IsOptional<T> = undefined extends T ? true : null extends T ? true : false;\n\nexport type IsObject<T> = T extends object ? true : false;\n\nexport type PathSelector<S, R, D> = NamedSelector<S, R, [], D> & {\n path: Path;\n};\n\nexport type PathParametricSelector<S, P, R, D> = NamedParametricSelector<S, P, R, D> & {\n path: Path;\n};\n\ntype Required<T> = { [P in keyof T]-?: Exclude<T[P], undefined | null> };\n\nexport type RequiredSelectorBuilder<S, R, D> = R extends object\n ? { [K in keyof R]: () => PathSelector<S, NonNullable<R[K]>, D> }\n : {};\n\nexport type OptionalSelectorBuilder<S, R, D> = ((\n defaultValue?: R,\n) => PathSelector<S, R extends undefined ? Defined<R> : R, D>) &\n (R extends object\n ? { [K in keyof Required<R>]: () => PathSelector<S, NonNullable<R[K]>, D> }\n : {});\n\nexport type RequiredParametricSelectorBuilder<S, P, R, D> = R extends object\n ? { [K in keyof R]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D> }\n : {};\n\nexport type OptionalParametricSelectorBuilder<S, P, R, D> = ((\n defaultValue?: R,\n) => PathParametricSelector<S, P, R extends undefined ? Defined<R> : R, D>) &\n (R extends object\n ? { [K in keyof Required<R>]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D> }\n : {});\n\nexport type RequiredObjectSelectorWrapper<S, R, D> = {\n [K in keyof R]-?: IsOptional<R[K]> extends true\n ? OptionalPathSelectorType<S, R[K], D>\n : RequiredPathSelectorType<S, R[K], D>;\n};\n\nexport type OptionalObjectSelectorWrapper<S, R, D> = {\n [K in keyof R]-?: OptionalPathSelectorType<S, R[K], D>;\n};\n\nexport type RequiredObjectParametricSelectorWrapper<S, P, R, D> = {\n [K in keyof R]-?: IsOptional<R[K]> extends true\n ? OptionalPathParametricSelectorType<S, P, R[K], D>\n : RequiredPathParametricSelectorType<S, P, R[K], D>;\n};\n\nexport type OptionalObjectParametricSelectorWrapper<S, P, R, D> = {\n [K in keyof R]-?: OptionalPathParametricSelectorType<S, P, R[K], D>;\n};\n\nexport type RequiredArraySelectorWrapper<S, R, D> = {\n length: RequiredPathSelectorType<S, number, D>;\n\n [K: number]: IsOptional<R> extends true\n ? OptionalPathSelectorType<S, R, D>\n : RequiredPathSelectorType<S, R, D>;\n};\n\nexport type OptionalArraySelectorWrapper<S, R, D> = {\n length: RequiredPathSelectorType<S, number, D>;\n\n [K: number]: OptionalPathSelectorType<S, R, D>;\n};\n\nexport type RequiredArrayParametricSelectorWrapper<S, P, R, D> = {\n length: RequiredPathParametricSelectorType<S, P, number, D>;\n\n [K: number]: IsOptional<R> extends true\n ? OptionalPathParametricSelectorType<S, P, R, D>\n : RequiredPathParametricSelectorType<S, P, R, D>;\n};\n\nexport type OptionalArrayParametricSelectorWrapper<S, P, R, D> = {\n length: RequiredPathParametricSelectorType<S, P, number, D>;\n\n [K: number]: OptionalPathParametricSelectorType<S, P, R, D>;\n};\n\nexport type RequiredDataSelectorWrapper<S, R, D> = R extends unknown[]\n ? RequiredArraySelectorWrapper<S, R[number], D>\n : IsObject<R> extends true\n ? RequiredObjectSelectorWrapper<S, R, D>\n : RequiredSelectorBuilder<S, R, D>;\n\nexport type OptionalDataSelectorWrapper<S, R, D> = R extends unknown[]\n ? OptionalArraySelectorWrapper<S, R[number], D>\n : IsObject<R> extends true\n ? OptionalObjectSelectorWrapper<S, R, D>\n : OptionalSelectorBuilder<S, R, D>;\n\nexport type RequiredDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[]\n ? RequiredArrayParametricSelectorWrapper<S, P, R[number], D>\n : IsObject<R> extends true\n ? RequiredObjectParametricSelectorWrapper<S, P, R, D>\n : RequiredParametricSelectorBuilder<S, P, R, D>;\n\nexport type OptionalDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[]\n ? OptionalArrayParametricSelectorWrapper<S, P, R[number], D>\n : IsObject<R> extends true\n ? OptionalObjectParametricSelectorWrapper<S, P, R, D>\n : OptionalParametricSelectorBuilder<S, P, R, D>;\n\nexport type RequiredPathSelectorType<S, R, D> = RequiredSelectorBuilder<S, R, D> &\n RequiredDataSelectorWrapper<S, NonNullable<R>, D>;\n\nexport type OptionalPathSelectorType<S, R, D> = OptionalSelectorBuilder<S, R, D> &\n OptionalDataSelectorWrapper<S, NonNullable<R>, D>;\n\nexport type RequiredPathParametricSelectorType<S, P, R, D> = RequiredParametricSelectorBuilder<\n S,\n P,\n R,\n D\n> &\n RequiredDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;\n\nexport type OptionalPathParametricSelectorType<S, P, R, D> = OptionalParametricSelectorBuilder<\n S,\n P,\n R,\n D\n> &\n OptionalDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;\n\nconst defaultVoidFunction = () => {\n return;\n};\n\n/** @internal */\nexport const innerCreatePathSelector = (\n baseSelector: (...args: unknown[]) => unknown,\n path: Path = [],\n applyMeta: (selector: unknown) => void = defaultVoidFunction,\n): unknown => {\n const pathLength = path.length;\n\n const proxyTarget = (defaultValue?: unknown) => {\n function resultSelector(state?: unknown, props?: unknown) {\n // Selectors are almost always reached as `(state)` or `(state, props)`, and\n // dispatching those two arities directly keeps `arguments` out of the hot\n // path. The arity is matched exactly rather than always passing two: reselect\n // memoizes on the argument list, so handing a one-argument selector a second\n // `undefined` would change its cache key.\n let result: unknown;\n\n if (arguments.length === 2) {\n result = baseSelector(state, props);\n } else if (arguments.length === 1) {\n result = baseSelector(state);\n } else {\n result = baseSelector.apply(null, arguments as unknown as unknown[]);\n }\n\n for (let i = 0; i < pathLength && isObject(result); i += 1) {\n result = result[path[i]];\n }\n\n // For optional properties, we want to exclude undefined from the return type\n // but still return undefined if the property doesn't exist\n return result === undefined ? defaultValue : result;\n }\n\n Object.assign(resultSelector, baseSelector, { path });\n resultSelector.dependencies = [baseSelector];\n\n applyMeta(resultSelector);\n\n withDebugName(resultSelector, () => {\n const baseName = getSelectorName(baseSelector);\n\n return [baseName, ...path].join('.');\n });\n\n return resultSelector;\n };\n\n return new Proxy(proxyTarget, {\n get: (_target, key) => {\n return innerCreatePathSelector(baseSelector, [...path, String(key)], applyMeta);\n },\n });\n};\n\nexport function createPathSelector<S, R, P = void>(\n baseSelector: P extends void ? Selector<S, R> : Selector<S, R, [P]>,\n): P extends void\n ? IsOptional<R> extends true\n ? OptionalPathSelectorType<S, R, [Selector<S, R>]>\n : RequiredPathSelectorType<S, R, [Selector<S, R>]>\n : IsOptional<R> extends true\n ? OptionalPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]>\n : RequiredPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]> {\n return innerCreatePathSelector(baseSelector as (...args: unknown[]) => unknown) as any;\n}\n","import { Selector } from '@veksa/reselect';\nimport { innerCreatePathSelector, RequiredPathParametricSelectorType } from './createPathSelector';\nimport { Path } from './types';\n\nconst propSelectorSymbol = Symbol.for('PropSelector');\n\nexport const isPropSelector = (selector: unknown): selector is { path: Path } => {\n return selector instanceof Object && propSelectorSymbol in selector;\n};\n\nexport function createPropSelector<P>(): RequiredPathParametricSelectorType<\n unknown,\n P,\n P,\n [Selector<unknown, P, [P]>]\n> {\n const propsSelector = (_state: unknown, props: unknown) => props;\n\n const applyMeta = (selector: unknown) => {\n Object.defineProperty(selector, propSelectorSymbol, { value: true });\n };\n\n return innerCreatePathSelector(\n propsSelector,\n [],\n applyMeta,\n ) as RequiredPathParametricSelectorType<unknown, P, P, [Selector<unknown, P, [P]>]>;\n}\n","import { KeySelector } from '@veksa/re-reselect';\nimport { UnionToIntersection } from '../types';\n\nexport const composedKeySelectorSymbol = Symbol.for('ComposedKeySelector');\n\n/**\n * The loosest shape a key selector can take: a function of `state` plus any\n * number of extra arguments (props, ...). Used for variadic tuple inference.\n */\ntype AnyKeySelector = KeySelector<any>;\n\n/** Intersection of every input key selector's `state` argument. */\ntype ComposedState<Ks extends readonly AnyKeySelector[]> = UnionToIntersection<\n { [Index in keyof Ks]: Parameters<Ks[Index]>[0] }[number]\n>;\n\n/** Union of every input key selector's `props` argument (position 1), if any. */\ntype PropsUnion<Ks extends readonly AnyKeySelector[]> = {\n [Index in keyof Ks]: Parameters<Ks[Index]> extends [any, infer Props, ...any[]] ? Props : never;\n}[number];\n\n/** Intersection of every input key selector's `props`, or `never` if none are parametric. */\ntype ComposedProps<Ks extends readonly AnyKeySelector[]> = [PropsUnion<Ks>] extends [never]\n ? never\n : UnionToIntersection<PropsUnion<Ks>>;\n\n/**\n * The key selector produced by a {@link KeySelectorComposer}: a function that\n * intersects the `state` (and `props`, when any input is parametric) of every\n * composed key selector, tagged with the original inputs as `dependencies`.\n */\nexport type OutputKeySelector<S, P, D extends readonly AnyKeySelector[]> = ([P] extends [never]\n ? (state: S) => unknown\n : (state: S, props: P) => unknown) & {\n dependencies: D;\n};\n\n/**\n * Composes N key selectors into a single one. A single variadic signature with\n * tuple inference replaces the former per-arity overload set.\n */\nexport type KeySelectorComposer = <Ks extends readonly AnyKeySelector[]>(\n ...keySelectors: Ks\n) => OutputKeySelector<ComposedState<Ks>, ComposedProps<Ks>, Ks>;\n\nexport function isComposedKeySelector(\n keySelector: AnyKeySelector,\n): keySelector is AnyKeySelector & { dependencies: AnyKeySelector[] } {\n return 'dependencies' in keySelector && composedKeySelectorSymbol in keySelector;\n}\n\nexport function createKeySelectorComposer(\n baseKeySelectorComposer: (...keySelectors: AnyKeySelector[]) => AnyKeySelector,\n): KeySelectorComposer {\n return ((...keySelectors: AnyKeySelector[]) => {\n const resultSelector = baseKeySelectorComposer(...keySelectors) as AnyKeySelector & {\n dependencies: AnyKeySelector[];\n };\n\n resultSelector.dependencies = keySelectors;\n\n Object.defineProperty(resultSelector, composedKeySelectorSymbol, {\n value: true,\n });\n\n return resultSelector;\n }) as KeySelectorComposer;\n}\n","import { Path } from '../types';\n\nexport const arePathsEqual = (path: Path, anotherPath: Path) => {\n if (path.length !== anotherPath.length) {\n return false;\n }\n\n for (let i = 0; i < path.length; i += 1) {\n if (path[i] !== anotherPath[i]) {\n return false;\n }\n }\n\n return true;\n};\n","export const defaultKeySelector = () => '<DefaultKey>';\n","import { CachedSelector } from '../types';\n\nexport const isCachedSelector = (selector: unknown): selector is CachedSelector => {\n return (\n selector instanceof Object &&\n 'keySelector' in selector &&\n typeof (selector as CachedSelector).keySelector === 'function'\n );\n};\n","import { KeySelector } from '@veksa/re-reselect';\nimport { isPropSelector } from '../createPropSelector';\nimport { isComposedKeySelector, KeySelectorComposer } from './createKeySelectorComposer';\nimport { arePathsEqual } from '../_helpers/arePathsEqual';\nimport { defaultKeySelector } from './defaultKeySelector';\nimport { isCachedSelector } from '../_helpers/isCachedSelector';\n\nconst areSelectorsEqual = (selector: unknown, another: unknown) => {\n if (selector === another) {\n return true;\n }\n\n if (isPropSelector(selector) && isPropSelector(another)) {\n return arePathsEqual(selector.path, another.path);\n }\n\n return false;\n};\n\nconst flatKeySelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n if (isComposedKeySelector(keySelector)) {\n result.push(...flatKeySelectors(keySelector.dependencies));\n } else {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nconst uniqKeySelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n const isKeySelectorAdded = result.some((resultKeySelector) =>\n areSelectorsEqual(keySelector, resultKeySelector),\n );\n if (!isKeySelectorAdded) {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nexport const excludeDefaultSelectors = <S>(keySelectors: KeySelector<S>[]) => {\n const result: typeof keySelectors = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const keySelector = keySelectors[i];\n\n if (keySelector !== defaultKeySelector) {\n result.push(keySelector);\n }\n }\n\n return result;\n};\n\nexport function createKeySelectorCreator(\n keySelectorComposer: KeySelectorComposer,\n): <S, D>(selectorInputs: { inputSelectors: D; keySelector?: KeySelector<S> }) => KeySelector<S> {\n return <S>({\n inputSelectors,\n keySelector,\n }: {\n inputSelectors: unknown;\n keySelector?: KeySelector<S>;\n }) => {\n let keySelectors: KeySelector<S>[] = [];\n\n if (keySelector) {\n keySelectors.push(keySelector);\n }\n\n (inputSelectors as unknown[]).forEach((selector) => {\n if (isCachedSelector(selector)) {\n keySelectors.push(selector.keySelector);\n }\n });\n\n keySelectors = flatKeySelectors(keySelectors);\n keySelectors = uniqKeySelectors(keySelectors);\n keySelectors = excludeDefaultSelectors(keySelectors);\n\n if (keySelectors.length === 0) {\n return defaultKeySelector;\n }\n\n if (keySelectors.length === 1) {\n const [resultSelector] = keySelectors;\n return resultSelector;\n }\n\n // The composer infers a `UnionToIntersection` state from the runtime array,\n // which TS can't see as identical to `S`; narrow it back for the caller.\n return keySelectorComposer(...keySelectors) as KeySelector<S>;\n };\n}\n","import { createKeySelectorComposer } from './createKeySelectorComposer';\n\nexport const stringComposeKeySelectors = createKeySelectorComposer(\n (...keySelectors) =>\n (state, props) => {\n let key: unknown = keySelectors[0](state, props);\n\n for (let i = 1; i < keySelectors.length; i += 1) {\n key += ':';\n key += keySelectors[i](state, props);\n }\n\n return key;\n },\n);\n","const noop = () => undefined;\n\nexport function temporaryAssign(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): {\n result: Record<string, unknown>;\n rollback: () => void;\n} {\n if (typeof target !== 'object' || target === null) {\n return {\n result: source,\n rollback: noop,\n };\n }\n\n // Both containers and the closure are allocated only once something actually has\n // to be restored. This runs on every call of every bound selector, and the usual\n // case is a binding whose keys the target does not have — one entry in\n // `deleteProps`, nothing in `temporary` — while a re-entrant call that finds the\n // binding already applied changes nothing at all and can share `noop`.\n let temporary: Record<string, unknown> | null = null;\n let deleteProps: string[] | null = null;\n\n for (const prop in source as unknown as object) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n const targetProp = target[prop];\n const sourceProp = source[prop];\n\n if (targetProp !== sourceProp) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n if (temporary === null) {\n temporary = {};\n }\n temporary[prop] = targetProp;\n } else {\n if (deleteProps === null) {\n deleteProps = [];\n }\n deleteProps.push(prop);\n }\n\n target[prop] = sourceProp;\n }\n }\n }\n\n if (temporary === null && deleteProps === null) {\n return {\n result: target,\n rollback: noop,\n };\n }\n\n const restore = temporary;\n const remove = deleteProps;\n\n const rollback = () => {\n if (restore !== null) {\n for (const prop in restore) {\n if (Object.prototype.hasOwnProperty.call(restore, prop)) {\n target[prop] = restore[prop];\n }\n }\n }\n\n if (remove !== null) {\n for (const prop of remove) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n delete target[prop];\n }\n }\n }\n };\n\n return {\n result: target,\n rollback,\n };\n}\n","import { Path } from '../types';\nimport { isObject } from './isObject';\n\nexport const getObjectPaths = (value: unknown, parentPath: Path = []): Path[] => {\n if (!isObject(value)) {\n return [parentPath];\n }\n\n return Object.keys(value).reduce<Path[]>((result, key) => {\n const paths = getObjectPaths(value[key], parentPath.concat([key]));\n return result.concat(paths);\n }, []);\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector, NamedParametricSelector, NamedSelector } from './types';\nimport { isComposedKeySelector, KeySelectorComposer } from './keys/createKeySelectorComposer';\nimport { isPropSelector } from './createPropSelector';\nimport { excludeDefaultSelectors } from './keys/createKeySelectorCreator';\nimport { stringComposeKeySelectors } from './keys/stringComposeKeySelectors';\nimport { temporaryAssign } from './_helpers/temporaryAssign';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { isObject } from './_helpers/isObject';\nimport { getObjectPaths } from './_helpers/getObjectPaths';\nimport { arePathsEqual } from './_helpers/arePathsEqual';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\n\nconst generateBindingName = <P extends object>(binding: P) => {\n const structure = Object.keys(binding).reduce(\n (result, key) => ({\n ...result,\n [key]: '[*]',\n }),\n {},\n );\n const structureKeys = Object.keys(structure).join();\n const structureValues = Object.values(structure).join();\n\n return `${structureKeys} -> ${structureValues}`;\n};\n\n/**\n * The special type to prevent binding of non optional props on optional values\n */\nexport type BoundSelector<S, P2, P1 extends Partial<P2>, R> =\n P2 extends Pick<P1, keyof P2>\n ? Exclude<keyof P1, keyof P2> extends never\n ? NamedSelector<S, R>\n : NamedParametricSelector<S, Omit<P1, keyof P2>, R>\n : never;\n\nexport type BoundSelectorOptions<S, P2, P1 extends Partial<P2>, R> = {\n bindingStrategy?: (\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n ) => Selector<S, R, [Omit<P1, keyof P2>]>;\n keySelectorComposer?: KeySelectorComposer;\n};\n\nconst innerCreateBoundSelector = <S, P2, P1 extends Partial<P2>, R>(\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n) => {\n const boundSelector = (state: S, props: Omit<P1, keyof P2> | void) =>\n baseSelector(state, {\n ...props,\n ...binding,\n } as unknown as P1);\n\n return boundSelector as BoundSelector<S, P2, P1, R>;\n};\n\nconst createBoundInnerSelector = <S, P2 extends object, P1 extends Partial<P2>, R, OR extends R>(\n baseSelector: Selector<S, R, [P1]>,\n binding: P2,\n options: BoundSelectorOptions<S, P2, P1, OR> = {},\n): BoundSelector<S, P2, P1, R> => {\n const bindingStrategy =\n (options.bindingStrategy as typeof innerCreateBoundSelector) ?? innerCreateBoundSelector;\n\n const keySelectorComposer = options.keySelectorComposer ?? stringComposeKeySelectors;\n\n const boundSelector = bindingStrategy(baseSelector, binding);\n\n Object.assign(boundSelector, baseSelector);\n boundSelector.dependencies = [baseSelector];\n\n withDebugName(boundSelector, () => {\n const baseName = getSelectorName(baseSelector);\n const bindingName = generateBindingName(binding);\n\n return `${baseName} (${bindingName})`;\n });\n\n if (isCachedSelector(baseSelector)) {\n const cachedBoundSelector = boundSelector as unknown as CachedSelector;\n\n if (baseSelector.getMatchingSelector) {\n cachedBoundSelector.getMatchingSelector = bindingStrategy(\n baseSelector.getMatchingSelector,\n binding,\n );\n }\n\n if (baseSelector.removeMatchingSelector) {\n cachedBoundSelector.removeMatchingSelector = bindingStrategy(\n baseSelector.removeMatchingSelector,\n binding,\n );\n }\n\n const baseKeySelector = baseSelector.keySelector;\n\n if (isObject(binding)) {\n const paths = getObjectPaths(binding);\n let keySelectors = isComposedKeySelector(baseKeySelector)\n ? baseKeySelector.dependencies\n : [baseKeySelector];\n\n keySelectors = excludeDefaultSelectors(keySelectors);\n\n keySelectors = keySelectors\n .filter(\n (keySelector) =>\n !isPropSelector(keySelector) ||\n !paths.some((path) => arePathsEqual(keySelector.path, path)),\n )\n .map((keySelector) =>\n isPropSelector(keySelector) ? keySelector : bindingStrategy(keySelector, binding),\n );\n\n if (keySelectors.length === 0) {\n cachedBoundSelector.keySelector = defaultKeySelector;\n } else if (keySelectors.length === 1) {\n const [keySelector] = keySelectors;\n cachedBoundSelector.keySelector = keySelector;\n } else {\n cachedBoundSelector.keySelector = keySelectorComposer(...keySelectors);\n }\n } else {\n cachedBoundSelector.keySelector = bindingStrategy(baseKeySelector, binding);\n }\n }\n\n return boundSelector;\n};\n\nexport const createBoundSelector: typeof createBoundInnerSelector = (baseSelector, binding) => {\n return createBoundInnerSelector(baseSelector, binding, {\n bindingStrategy: (selector, bindingProps) => {\n const source = bindingProps as unknown as Record<string, unknown>;\n const keys = Object.keys(source);\n\n /**\n * Almost every binding is a single key — `bound(selector, { positionId })` —\n * and specialising it removes the two allocations the generic path costs per\n * call: the `{ result, rollback }` object and the `rollback` closure. On a\n * graph with a bound selector per row those are the calls that dominate.\n *\n * The `delete` in the restore stays deliberately. Leaving the key behind as\n * `undefined` would be cheaper — it avoids putting the caller's props object\n * into dictionary mode — but it also changes the object's shape, and\n * `useSelector` memoizes props shallowly: a props object that has grown an\n * extra key never again compares equal to a freshly built one, so the\n * memoization the binding exists to protect would be defeated.\n */\n if (keys.length === 1) {\n const key = keys[0];\n const value = source[key];\n\n return (state, props) => {\n const target = props as unknown as Record<string, unknown>;\n\n if (typeof target !== 'object' || target === null) {\n return selector(state, source as Parameters<typeof baseSelector>[1]);\n }\n\n const previous = target[key];\n\n // A re-entrant call that finds the binding already applied has nothing to\n // save and nothing to restore.\n if (previous === value) {\n return selector(state, props as Parameters<typeof baseSelector>[1]);\n }\n\n const had = Object.prototype.hasOwnProperty.call(target, key);\n target[key] = value;\n\n try {\n return selector(state, props as Parameters<typeof baseSelector>[1]);\n } finally {\n if (had) {\n target[key] = previous;\n } else {\n delete target[key];\n }\n }\n };\n }\n\n return (state, props) => {\n const { result: nextProps, rollback } = temporaryAssign(props, source);\n const result = selector(state, nextProps as Parameters<typeof baseSelector>[1]);\n rollback();\n return result;\n };\n },\n });\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector } from './types';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\n\n/**\n * Creates a selector that always resolves to `undefined`. Used as the \"no link\"\n * branch of a chain (e.g. an optional relation that isn't present).\n *\n * When the base selector is cached, the empty selector is tagged with\n * {@link defaultKeySelector} so that it still passes {@link isCachedSelector}\n * and takes part in key-selector composition. The default key is deliberately\n * the only cache-related metadata copied: an empty selector has no result to\n * memoize, so it needs no `cache` / `getMatchingSelector` of its own, and the\n * default key is dropped by `excludeDefaultSelectors` during composition.\n */\nexport const createEmptySelector = <S, R>(\n baseSelector: Selector<S, R, any[]>,\n): Selector<S, R | undefined> => {\n const emptySelector = () => undefined;\n\n if (isCachedSelector(baseSelector)) {\n (emptySelector as unknown as CachedSelector).keySelector = defaultKeySelector;\n }\n\n return emptySelector;\n};\n","import { Selector } from '@veksa/reselect';\nimport { CachedSelector, NamedParametricSelector } from './types';\nimport { withDebugName } from './debug/withDebugName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\n\nconst generateMappingName = <P1 extends object, P2>(mapping: (props: P2) => P1) => {\n if (mapping.name) {\n return mapping.name;\n }\n\n const structure = mapping(\n new Proxy(\n {},\n {\n get: (_target, key) => key,\n },\n ) as P2,\n );\n const structureKeys = Object.keys(structure).join();\n const structureValues = Object.values(structure).join();\n\n return `${structureKeys} -> ${structureValues}`;\n};\n\nconst innerCreateAdaptedSelector =\n <S, P1, P2, R>(\n baseSelector: Selector<S, R, [P1]>,\n mapping: (props: P2) => P1,\n ): NamedParametricSelector<S, P2, R> =>\n (state: S, props: P2) => {\n return baseSelector(state, mapping(props));\n };\n\nexport const createAdaptedSelector = <S, P1 extends object, P2, R>(\n baseSelector: Selector<S, R, [P1]>,\n mapping: (props: P2) => P1,\n) => {\n const adaptedSelector = innerCreateAdaptedSelector(baseSelector, mapping);\n\n Object.assign(adaptedSelector, baseSelector);\n adaptedSelector.dependencies = [baseSelector];\n\n withDebugName(adaptedSelector, () => {\n const baseName = getSelectorName(baseSelector);\n const mappingName = generateMappingName(mapping);\n\n return `${baseName} (${mappingName})`;\n });\n\n if (isCachedSelector(baseSelector)) {\n const cachedAdaptedSelector = adaptedSelector as unknown as CachedSelector;\n\n if (baseSelector.getMatchingSelector) {\n cachedAdaptedSelector.getMatchingSelector = innerCreateAdaptedSelector(\n baseSelector.getMatchingSelector,\n mapping,\n );\n }\n\n if (baseSelector.removeMatchingSelector) {\n cachedAdaptedSelector.removeMatchingSelector = innerCreateAdaptedSelector(\n baseSelector.removeMatchingSelector,\n mapping,\n );\n }\n\n cachedAdaptedSelector.keySelector = innerCreateAdaptedSelector(\n baseSelector.keySelector,\n mapping,\n );\n }\n\n return adaptedSelector;\n};\n","export const stringifyFunction = (source: unknown) => {\n return String(source).replace(/\\s+/g, ' ').trim();\n};\n","import { stringifyFunction } from './stringifyFunction';\n\nexport const generateSelectorKey = (selector: unknown) => {\n const dependencies = (selector as { dependencies?: unknown[] }).dependencies ?? [];\n\n let result = stringifyFunction(selector);\n\n for (let i = dependencies.length - 1; i >= 0; i -= 1) {\n const dependency = dependencies[i];\n\n result += stringifyFunction(dependency);\n }\n\n return result;\n};\n","import { createSelectorCreator, Selector } from '@veksa/reselect';\nimport { createCachedSelector, ICacheObject, KeySelector } from '@veksa/re-reselect';\nimport { KeySelectorComposer } from './keys/createKeySelectorComposer';\nimport { isCachedSelector } from './_helpers/isCachedSelector';\nimport { defaultKeySelector } from './keys/defaultKeySelector';\nimport { stringComposeKeySelectors } from './keys/stringComposeKeySelectors';\nimport { createKeySelectorCreator } from './keys/createKeySelectorCreator';\nimport { runInDebug, withDebugName } from './debug/withDebugName';\nimport { defineDynamicSelectorName } from './_helpers/defineDynamicSelectorName';\nimport { getSelectorName } from './_helpers/getSelectorName';\nimport { generateSelectorKey } from './_helpers/generateSelectorKey';\nimport { stringifyFunction } from './_helpers/stringifyFunction';\n\nexport type SelectorChain<R1, S1, R2> = (result: R1) => Selector<S1, R2>;\n\nexport type ParametricSelectorChain<R1, S1, P1, R2> = (result: R1) => Selector<S1, R2, [P1]>;\n\nexport type SelectorChainHierarchy<\n C extends SelectorChain<any, any, any>,\n H extends SelectorChainHierarchy<any, any>,\n> = C & { parentChain?: H };\n\nexport type ParametricSelectorChainHierarchy<\n C extends ParametricSelectorChain<any, any, any, any>,\n H extends ParametricSelectorChainHierarchy<any, any>,\n> = C & { parentChain?: H };\n\nexport type CreateSelectorOptions<SelectorCreator extends typeof createSelectorCreator> = {\n selectorCreator: ReturnType<SelectorCreator>;\n cacheObject: ICacheObject;\n};\n\nexport type ChainSelectorOptions<\n SelectorCreator extends typeof createSelectorCreator = typeof createSelectorCreator,\n> = {\n createSelectorOptions?: () => CreateSelectorOptions<SelectorCreator>;\n keySelectorComposer?: KeySelectorComposer;\n};\n\ninterface ChainSelectorResult<S1, R1> {\n chain: <S2, R2 = any>(\n fn: SelectorChain<R1, S2, R2>,\n chainOptions?: ChainSelectorOptions,\n ) => ChainSelectorResult<S1 & S2, R2>;\n map: <R2>(\n fn: (result: R1) => R2,\n mapOptions?: ChainSelectorOptions,\n ) => ChainSelectorResult<S1, R2>;\n build: () => Selector<S1, R1, []> & {\n chainHierarchy: SelectorChainHierarchy<any, any> | undefined;\n };\n}\n\ninterface ParametricChainSelectorResult<S1, P1, R1> {\n chain: <S2, P2 = unknown, R2 = any>(\n fn: ParametricSelectorChain<R1, S2, P2, R2>,\n chainOptions?: ChainSelectorOptions,\n ) => ParametricChainSelectorResult<S1 & S2, P1 & P2, R2>;\n map: <R2>(\n fn: (result: R1) => R2,\n mapOptions?: ChainSelectorOptions,\n ) => ParametricChainSelectorResult<S1, P1, R2>;\n build: () => Selector<S1, R1, [P1]> & {\n chainHierarchy: ParametricSelectorChainHierarchy<any, any> | undefined;\n };\n}\n\nexport function createChainSelector<S1, R1>(\n selector: Selector<S1, R1>,\n options?: ChainSelectorOptions,\n prevChain?: SelectorChainHierarchy<any, any>,\n): ChainSelectorResult<S1, R1>;\n\nexport function createChainSelector<S1, P1, R1>(\n selector: Selector<S1, R1, [P1]>,\n options?: ChainSelectorOptions,\n prevChain?: ParametricSelectorChainHierarchy<any, any>,\n): ParametricChainSelectorResult<S1, P1, R1>;\n\nexport function createChainSelector<S1, P1, R1>(\n selector: any,\n options?: ChainSelectorOptions,\n prevChain?: any,\n): any {\n const chain = <S2, P2, R2>(fn: any, chainOptions?: ChainSelectorOptions) => {\n const combinedOptions = {\n ...options,\n ...chainOptions,\n };\n\n const keySelector = isCachedSelector(selector) ? selector.keySelector : defaultKeySelector;\n\n const { createSelectorOptions = () => ({}), keySelectorComposer = stringComposeKeySelectors } =\n combinedOptions;\n\n const keySelectorCreator = createKeySelectorCreator(keySelectorComposer);\n\n const higherOrderSelector = createCachedSelector(\n [selector],\n fn,\n )({\n ...createSelectorOptions(),\n keySelector,\n });\n\n withDebugName(higherOrderSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `higher order for ${baseName} (${stringifyFunction(fn)})`;\n });\n\n type CombineSelector = Selector<S1 & S2, R1 & R2, [P1 & P2]> & {\n dependencies: any;\n cache: ICacheObject;\n keySelector?: KeySelector<S1 & S2>;\n };\n\n const combinedSelector: CombineSelector = (state: S1 & S2, props: P1 & P2): R1 & R2 => {\n const derivedSelector: any = (higherOrderSelector as any)(state, props);\n\n runInDebug(() => {\n // Debug-only: shows the branch this call took. Nothing outside the debug\n // tooling reads it, so in production it was an array allocated per call and\n // abandoned. The static `[higherOrderSelector]` below still stands.\n combinedSelector.dependencies = [higherOrderSelector, derivedSelector];\n\n const derivedSelectorName = getSelectorName(derivedSelector);\n\n if (!derivedSelectorName) {\n defineDynamicSelectorName(derivedSelector, () => {\n const baseName = getSelectorName(selector);\n const derivedSelectorKey = generateSelectorKey(derivedSelector);\n\n return `derived from ${baseName} (${derivedSelectorKey})`;\n });\n }\n\n defineDynamicSelectorName(combinedSelector, () => {\n const baseName = getSelectorName(selector);\n const dependencyName = getSelectorName(derivedSelector);\n\n return `${baseName} (chained by ${dependencyName})`;\n });\n });\n\n return derivedSelector(state, props);\n };\n\n combinedSelector.dependencies = [higherOrderSelector];\n combinedSelector.cache = higherOrderSelector.cache;\n\n /**\n * The derived selector's key selector, memoized on the derived selector itself.\n *\n * This used to be a second `createCachedSelector` over `[higherOrderSelector]`,\n * which meant every key computation paid a whole extra cached-selector layer —\n * its own key computation, its own cache lookup, and its own evaluation of\n * `higherOrderSelector` — to produce a value that depends on nothing but the\n * derived selector. A `WeakMap` keyed on that selector is the same mapping with\n * none of the layer, and it shares across cache keys rather than per key.\n *\n * Note what is deliberately *not* memoized: the `(state, props)` pair. `props`\n * is mutated in place by `createBoundSelector`, so two calls can pass the same\n * object reference with different contents, and a reference-keyed cache would\n * hand back a stale selector.\n */\n const derivedKeySelectors = new WeakMap<object, KeySelector<S1 & S2>>();\n\n combinedSelector.keySelector = (state: S1 & S2, props: P1 & P2) => {\n const derivedSelector: any = (higherOrderSelector as any)(state, props);\n\n let derivedKeySelector = derivedKeySelectors.get(derivedSelector);\n\n if (derivedKeySelector === undefined) {\n derivedKeySelector = keySelectorCreator({\n inputSelectors: [higherOrderSelector, derivedSelector],\n }) as KeySelector<S1 & S2>;\n\n derivedKeySelectors.set(derivedSelector, derivedKeySelector);\n }\n\n return (derivedKeySelector as any)(state, props);\n };\n\n withDebugName(combinedSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `${baseName} (will be chained ${stringifyFunction(fn)})`;\n });\n\n const nextPrevChain = Object.assign(fn, {\n parentChain: prevChain,\n });\n\n return createChainSelector<S1 & S2, P1 & P2, R1 & R2>(\n combinedSelector,\n combinedOptions,\n nextPrevChain,\n );\n };\n\n const map = <R2>(fn: (result: R1) => R2, mapOptions?: ChainSelectorOptions) => {\n const mapSelector = (result: R1) => {\n const output = fn(result);\n const mapSelector = () => output;\n\n withDebugName(mapSelector, () => {\n const baseName = getSelectorName(selector);\n\n return `mapped from ${baseName} (${stringifyFunction(fn)})`;\n });\n\n return mapSelector;\n };\n\n return chain(mapSelector, mapOptions);\n };\n\n const build = () => {\n return Object.assign(selector, {\n chainHierarchy: prevChain,\n });\n };\n\n return {\n chain,\n map,\n build,\n };\n}\n","import { createSelector, Selector } from '@veksa/reselect';\n\nexport function createSequenceSelector<S, R>(\n selectors: Selector<S, R>[],\n selectorCreator?: typeof createSelector,\n): Selector<S, R[]>;\n\nexport function createSequenceSelector<S, P, R>(\n selectors: Selector<S, R, [P]>[],\n selectorCreator?: typeof createSelector,\n): Selector<S, R[], [P]>;\n\nexport function createSequenceSelector(selectors: any, selectorCreator = createSelector) {\n return selectorCreator(selectors, (...results: unknown[]) => results);\n}\n","import { createSelector, Selector } from '@veksa/reselect';\nimport { createCachedSelector, PolymorphicCachedOptions } from '@veksa/re-reselect';\nimport { createSequenceSelector } from './createSequenceSelector';\n\nexport function createCachedSequenceSelector<S, R>(\n selectors: Selector<S, R>[],\n): (options: PolymorphicCachedOptions<Selector<S, R>[], R[]>) => Selector<S, R[]>;\n\nexport function createCachedSequenceSelector<S, P, R>(\n selectors: Selector<S, R, [P]>[],\n): (options: PolymorphicCachedOptions<Selector<S, R, [P]>[], R[]>) => Selector<S, R[], [P]>;\n\nexport function createCachedSequenceSelector(selectors: any): any {\n return createSequenceSelector(\n selectors,\n createCachedSelector as unknown as typeof createSelector,\n );\n}\n","import { createStructuredSelector as reselectStructuredSelector } from '@veksa/reselect';\n\nexport const createStructuredSelector = reselectStructuredSelector;\n","import { createSelector, Selector, SelectorResultsMap, SelectorsObject } from '@veksa/reselect';\nimport { createCachedSelector, PolymorphicCachedOptions } from '@veksa/re-reselect';\nimport { createStructuredSelector } from './createStructuredSelector';\nimport { UnionToIntersection } from './types';\n\n/** Intersection of the `state` argument of every selector in the object. */\ntype StructuredState<M extends SelectorsObject> = UnionToIntersection<\n { [K in keyof M]: Parameters<M[K]>[0] }[keyof M]\n>;\n\n/** Union of the `props` argument (position 1) of every parametric selector. */\ntype StructuredPropsUnion<M extends SelectorsObject> = {\n [K in keyof M]: Parameters<M[K]> extends [any, infer Props, ...any[]] ? Props : never;\n}[keyof M];\n\n/** The extra-arguments tuple: `[Props]` when any selector is parametric, else `[]`. */\ntype StructuredParams<M extends SelectorsObject> = [StructuredPropsUnion<M>] extends [never]\n ? []\n : [UnionToIntersection<StructuredPropsUnion<M>>];\n\n/** The input selectors as reselect sees them, used to type the cached options. */\ntype StructuredInputs<M extends SelectorsObject> = Selector<\n StructuredState<M>,\n unknown,\n StructuredParams<M>\n>[];\n\n/**\n * A single variadic signature replaces the former `Selector` / `ParametricSelector`\n * conditional: `state` and `props` are derived from the selectors object, so a\n * parametric input keeps its props type without a separate overload.\n */\nexport function createCachedStructuredSelector<M extends SelectorsObject>(\n selectors: M,\n): (\n options: PolymorphicCachedOptions<StructuredInputs<M>, SelectorResultsMap<M>>,\n) => Selector<StructuredState<M>, SelectorResultsMap<M>, StructuredParams<M>>;\n\nexport function createCachedStructuredSelector(selectors: any): any {\n return createStructuredSelector(\n selectors,\n createCachedSelector as unknown as typeof createSelector,\n );\n}\n","import { createKeySelectorComposer } from './createKeySelectorComposer';\n\nexport const arrayComposeKeySelectors = createKeySelectorComposer(\n (...keySelectors) =>\n (state, props) => {\n let keyPath: unknown[] = [];\n\n for (let i = 0; i < keySelectors.length; i += 1) {\n const key: unknown = keySelectors[i](state, props);\n\n if (Array.isArray(key)) {\n keyPath = keyPath.concat(key);\n } else {\n keyPath.push(key);\n }\n }\n\n return keyPath;\n },\n);\n","import { ICacheObject } from '@veksa/re-reselect';\n\ninterface CacheEntry {\n data: unknown;\n time: number;\n}\n\n/**\n * Buckets used to live in a module-level `Record<string, …>` keyed by an\n * incrementing numeric id, which meant every `get` and `set` coerced that number to\n * a string and re-read the global record — four times per cache hit in `get`.\n * Holding the entries on the instance removes both, and a `Map` keeps non-string\n * keys as they are instead of stringifying them.\n */\nconst buckets = new Set<IntervalMapCache>();\n\nconst cacheLifetime = 10000;\n\nlet garbageCollectorStarted = false;\n\nconst runGarbageCollector = () => {\n const currentTime = Date.now();\n\n buckets.forEach((bucket) => {\n if (bucket.sweep(currentTime)) {\n // A bucket the sweep emptied is dropped from the registry, so a cache whose\n // selector has been discarded stops being reachable from module scope and\n // becomes collectable. Registration happens again on the next `set`, so a\n // cache that is still in use simply re-enters.\n buckets.delete(bucket);\n }\n });\n\n window.setTimeout(runGarbageCollector, cacheLifetime);\n};\n\nexport const initGarbageCollector = () => {\n if (garbageCollectorStarted) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n garbageCollectorStarted = true;\n window.setTimeout(runGarbageCollector, cacheLifetime);\n }\n};\n\nexport class IntervalMapCache implements ICacheObject {\n private entries = new Map<unknown, CacheEntry>();\n\n public set(key: any, data: any) {\n const entry = this.entries.get(key);\n\n if (entry === undefined) {\n buckets.add(this);\n this.entries.set(key, { data, time: Date.now() });\n } else {\n entry.data = data;\n entry.time = Date.now();\n }\n }\n\n public get(key: any) {\n const entry = this.entries.get(key);\n\n if (entry === undefined) {\n return undefined;\n }\n\n entry.time = Date.now();\n\n return entry.data;\n }\n\n public remove(key: any) {\n this.entries.delete(key);\n }\n\n public clear() {\n this.entries.clear();\n buckets.delete(this);\n }\n\n /**\n * Drops entries untouched for longer than the lifetime. Returns whether the\n * bucket is now empty, which is what lets the collector unregister it.\n */\n public sweep(currentTime: number) {\n this.entries.forEach((entry, key) => {\n if (currentTime - entry.time > cacheLifetime) {\n this.entries.delete(key);\n }\n });\n\n return this.entries.size === 0;\n }\n}\n","import { FlatObjectCache, ICacheObject } from '@veksa/re-reselect';\n\nexport type TreeCacheObjectOptions = {\n cacheObjectCreator?: () => ICacheObject;\n};\n\nconst normalizeKey = (key: unknown): unknown[] => (Array.isArray(key) ? key : [key]);\n\nclass TreeCacheNode {\n public cache?: ICacheObject;\n\n public selectorFn?: unknown;\n}\n\nexport class TreeCache implements ICacheObject {\n private readonly cacheObjectCreator: () => ICacheObject;\n\n private root: TreeCacheNode;\n\n constructor(options: TreeCacheObjectOptions) {\n this.cacheObjectCreator = options.cacheObjectCreator ?? (() => new FlatObjectCache());\n\n const root = new TreeCacheNode();\n root.cache = this.cacheObjectCreator();\n this.root = root;\n }\n\n public clear() {\n const root = new TreeCacheNode();\n root.cache = this.cacheObjectCreator();\n this.root = root;\n }\n\n public get(key: unknown) {\n // A scalar key is the common case and `normalizeKey` would wrap it in a fresh\n // array on every lookup. The tree walk for one level is a single cache read, so\n // it is spelled out rather than allocated for.\n if (!Array.isArray(key)) {\n const cacheResponse: unknown = this.root.cache?.get(key);\n\n return cacheResponse instanceof TreeCacheNode ? cacheResponse.selectorFn : undefined;\n }\n\n let currentNode = this.root;\n\n for (let i = 0; i < key.length; i += 1) {\n const item = key[i];\n const cacheResponse: unknown = currentNode.cache?.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n return undefined;\n }\n }\n\n return currentNode.selectorFn;\n }\n\n public set(key: unknown, selectorFn: unknown) {\n const keyPath = normalizeKey(key);\n let currentNode = this.root;\n\n for (let i = 0; i < keyPath.length; i += 1) {\n const item = keyPath[i];\n\n if (!currentNode.cache) {\n currentNode.cache = this.cacheObjectCreator();\n }\n\n const cacheResponse: unknown = currentNode.cache.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n const node = new TreeCacheNode();\n currentNode.cache.set(item, node);\n currentNode = node;\n }\n }\n\n currentNode.selectorFn = selectorFn;\n }\n\n public remove(key: unknown) {\n const keyPath = normalizeKey(key);\n let currentNode = this.root;\n\n for (let i = 0; i < keyPath.length; i += 1) {\n const item = keyPath[i];\n const cacheResponse: unknown = currentNode.cache?.get(item);\n\n if (cacheResponse instanceof TreeCacheNode) {\n currentNode = cacheResponse;\n } else {\n return;\n }\n }\n\n currentNode.selectorFn = undefined;\n }\n\n /**\n * Called by re-reselect on every cache operation, so neither the wrapping array\n * nor the `every` callback is allocated here.\n */\n public isValidCacheKey(key: unknown) {\n const rootCache = this.root.cache;\n\n if (rootCache?.isValidCacheKey === undefined) {\n return true;\n }\n\n if (!Array.isArray(key)) {\n return rootCache.isValidCacheKey(key);\n }\n\n for (let i = 0; i < key.length; i += 1) {\n if (!rootCache.isValidCacheKey(key[i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n","import { useRef } from 'react';\n\nexport const useMemoWith = <T>(value: T, comparator: (a: T, b: T) => boolean) => {\n const ref = useRef<T>(value);\n\n if (!comparator(value, ref.current)) {\n ref.current = value;\n }\n\n return ref.current;\n};\n","import { shallowEqual, useSelector as useReduxSelector } from '@veksa/react-redux';\nimport { useMemoWith } from './useMemoWith';\nimport { useCallback, useMemo } from 'react';\n\nexport function useSelector<S extends object, R>(selector: (state: S) => R): R;\n\nexport function useSelector<S extends object, P, R>(\n selector: (state: S, props: P) => R,\n props: P,\n): R;\n\nexport function useSelector(selector: Function, ...params: any[]) {\n const props = params[0];\n const memoizedProps = useMemoWith(props, shallowEqual);\n\n // unfreeze props for performance optimization (see temporaryAssign.ts)\n const unfrozenProps = useMemo(() => {\n return Object.isFrozen(memoizedProps) ? { ...memoizedProps } : memoizedProps;\n }, [memoizedProps]);\n\n const memoizedPropsSelector = useCallback(\n (state: unknown) => {\n return selector(state, unfrozenProps);\n },\n [selector, unfrozenProps],\n );\n\n return useReduxSelector(memoizedPropsSelector, {\n devModeChecks: {\n stabilityCheck: 'never',\n identityFunctionCheck: 'never',\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { ICacheObject, KeySelector, PolymorphicCachedOptions } from "@veksa/re-reselect";
|
|
2
|
+
import { Selector, SelectorResultsMap, SelectorsObject, createSelectorCreator } from "@veksa/reselect";
|
|
3
|
+
//#region src/createSegmentSelector.d.ts
|
|
4
|
+
declare function createSegmentSelector<State, SelectedSegment extends State | State[keyof State]>(fn: (state: State) => SelectedSegment, initial: SelectedSegment): (state: State) => SelectedSegment;
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region src/types.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* A selector carrying optional debug metadata. In the unified model a
|
|
9
|
+
* "parametric" selector is simply a selector whose `Params` tuple is non-empty,
|
|
10
|
+
* so a single type covers both cases.
|
|
11
|
+
*
|
|
12
|
+
* @template Params - Extra arguments beyond `state` (e.g. `[Props]`).
|
|
13
|
+
* @template D - The selector's dependency tuple, surfaced for debug tooling.
|
|
14
|
+
*/
|
|
15
|
+
type NamedSelector<S, R, Params extends readonly any[] = [], D = unknown[]> = Selector<S, R, Params> & {
|
|
16
|
+
selectorName?: string;
|
|
17
|
+
dependencies?: D;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Back-compat alias: a parametric selector is a {@link NamedSelector} whose
|
|
21
|
+
* single extra argument is `Props`.
|
|
22
|
+
*/
|
|
23
|
+
type NamedParametricSelector<S, P, R, D = unknown[]> = NamedSelector<S, R, [P], D>;
|
|
24
|
+
type Path = string[];
|
|
25
|
+
/**
|
|
26
|
+
* Turns a union `A | B | C` into the intersection `A & B & C`. Not exported by
|
|
27
|
+
* reselect, so kept here for the selector-composition helpers that need to
|
|
28
|
+
* intersect the `state`/`props` of several selectors.
|
|
29
|
+
*/
|
|
30
|
+
type UnionToIntersection<Union> = (Union extends unknown ? (distributed: Union) => void : never) extends ((merged: infer Intersection) => void) ? Intersection : never;
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/createPathSelector.d.ts
|
|
33
|
+
type Defined<T> = Exclude<T, undefined>;
|
|
34
|
+
type IsOptional<T> = undefined extends T ? true : null extends T ? true : false;
|
|
35
|
+
type IsObject<T> = T extends object ? true : false;
|
|
36
|
+
type PathSelector<S, R, D> = NamedSelector<S, R, [], D> & {
|
|
37
|
+
path: Path;
|
|
38
|
+
};
|
|
39
|
+
type PathParametricSelector<S, P, R, D> = NamedParametricSelector<S, P, R, D> & {
|
|
40
|
+
path: Path;
|
|
41
|
+
};
|
|
42
|
+
type Required<T> = { [P in keyof T]-?: Exclude<T[P], undefined | null>; };
|
|
43
|
+
type RequiredSelectorBuilder<S, R, D> = R extends object ? { [K in keyof R]: () => PathSelector<S, NonNullable<R[K]>, D>; } : {};
|
|
44
|
+
type OptionalSelectorBuilder<S, R, D> = ((defaultValue?: R) => PathSelector<S, R extends undefined ? Defined<R> : R, D>) & (R extends object ? { [K in keyof Required<R>]: () => PathSelector<S, NonNullable<R[K]>, D>; } : {});
|
|
45
|
+
type RequiredParametricSelectorBuilder<S, P, R, D> = R extends object ? { [K in keyof R]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D>; } : {};
|
|
46
|
+
type OptionalParametricSelectorBuilder<S, P, R, D> = ((defaultValue?: R) => PathParametricSelector<S, P, R extends undefined ? Defined<R> : R, D>) & (R extends object ? { [K in keyof Required<R>]: () => PathParametricSelector<S, P, NonNullable<R[K]>, D>; } : {});
|
|
47
|
+
type RequiredObjectSelectorWrapper<S, R, D> = { [K in keyof R]-?: IsOptional<R[K]> extends true ? OptionalPathSelectorType<S, R[K], D> : RequiredPathSelectorType<S, R[K], D>; };
|
|
48
|
+
type OptionalObjectSelectorWrapper<S, R, D> = { [K in keyof R]-?: OptionalPathSelectorType<S, R[K], D>; };
|
|
49
|
+
type RequiredObjectParametricSelectorWrapper<S, P, R, D> = { [K in keyof R]-?: IsOptional<R[K]> extends true ? OptionalPathParametricSelectorType<S, P, R[K], D> : RequiredPathParametricSelectorType<S, P, R[K], D>; };
|
|
50
|
+
type OptionalObjectParametricSelectorWrapper<S, P, R, D> = { [K in keyof R]-?: OptionalPathParametricSelectorType<S, P, R[K], D>; };
|
|
51
|
+
type RequiredArraySelectorWrapper<S, R, D> = {
|
|
52
|
+
length: RequiredPathSelectorType<S, number, D>;
|
|
53
|
+
[K: number]: IsOptional<R> extends true ? OptionalPathSelectorType<S, R, D> : RequiredPathSelectorType<S, R, D>;
|
|
54
|
+
};
|
|
55
|
+
type OptionalArraySelectorWrapper<S, R, D> = {
|
|
56
|
+
length: RequiredPathSelectorType<S, number, D>;
|
|
57
|
+
[K: number]: OptionalPathSelectorType<S, R, D>;
|
|
58
|
+
};
|
|
59
|
+
type RequiredArrayParametricSelectorWrapper<S, P, R, D> = {
|
|
60
|
+
length: RequiredPathParametricSelectorType<S, P, number, D>;
|
|
61
|
+
[K: number]: IsOptional<R> extends true ? OptionalPathParametricSelectorType<S, P, R, D> : RequiredPathParametricSelectorType<S, P, R, D>;
|
|
62
|
+
};
|
|
63
|
+
type OptionalArrayParametricSelectorWrapper<S, P, R, D> = {
|
|
64
|
+
length: RequiredPathParametricSelectorType<S, P, number, D>;
|
|
65
|
+
[K: number]: OptionalPathParametricSelectorType<S, P, R, D>;
|
|
66
|
+
};
|
|
67
|
+
type RequiredDataSelectorWrapper<S, R, D> = R extends unknown[] ? RequiredArraySelectorWrapper<S, R[number], D> : IsObject<R> extends true ? RequiredObjectSelectorWrapper<S, R, D> : RequiredSelectorBuilder<S, R, D>;
|
|
68
|
+
type OptionalDataSelectorWrapper<S, R, D> = R extends unknown[] ? OptionalArraySelectorWrapper<S, R[number], D> : IsObject<R> extends true ? OptionalObjectSelectorWrapper<S, R, D> : OptionalSelectorBuilder<S, R, D>;
|
|
69
|
+
type RequiredDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[] ? RequiredArrayParametricSelectorWrapper<S, P, R[number], D> : IsObject<R> extends true ? RequiredObjectParametricSelectorWrapper<S, P, R, D> : RequiredParametricSelectorBuilder<S, P, R, D>;
|
|
70
|
+
type OptionalDataParametricSelectorWrapper<S, P, R, D> = R extends unknown[] ? OptionalArrayParametricSelectorWrapper<S, P, R[number], D> : IsObject<R> extends true ? OptionalObjectParametricSelectorWrapper<S, P, R, D> : OptionalParametricSelectorBuilder<S, P, R, D>;
|
|
71
|
+
type RequiredPathSelectorType<S, R, D> = RequiredSelectorBuilder<S, R, D> & RequiredDataSelectorWrapper<S, NonNullable<R>, D>;
|
|
72
|
+
type OptionalPathSelectorType<S, R, D> = OptionalSelectorBuilder<S, R, D> & OptionalDataSelectorWrapper<S, NonNullable<R>, D>;
|
|
73
|
+
type RequiredPathParametricSelectorType<S, P, R, D> = RequiredParametricSelectorBuilder<S, P, R, D> & RequiredDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;
|
|
74
|
+
type OptionalPathParametricSelectorType<S, P, R, D> = OptionalParametricSelectorBuilder<S, P, R, D> & OptionalDataParametricSelectorWrapper<S, P, NonNullable<R>, D>;
|
|
75
|
+
declare function createPathSelector<S, R, P = void>(baseSelector: P extends void ? Selector<S, R> : Selector<S, R, [P]>): P extends void ? IsOptional<R> extends true ? OptionalPathSelectorType<S, R, [Selector<S, R>]> : RequiredPathSelectorType<S, R, [Selector<S, R>]> : IsOptional<R> extends true ? OptionalPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]> : RequiredPathParametricSelectorType<S, P, R, [Selector<S, R, [P]>]>;
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/createPropSelector.d.ts
|
|
78
|
+
declare function createPropSelector<P>(): RequiredPathParametricSelectorType<unknown, P, P, [Selector<unknown, P, [P]>]>;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/keys/createKeySelectorComposer.d.ts
|
|
81
|
+
/**
|
|
82
|
+
* The loosest shape a key selector can take: a function of `state` plus any
|
|
83
|
+
* number of extra arguments (props, ...). Used for variadic tuple inference.
|
|
84
|
+
*/
|
|
85
|
+
type AnyKeySelector = KeySelector<any>;
|
|
86
|
+
/** Intersection of every input key selector's `state` argument. */
|
|
87
|
+
type ComposedState<Ks extends readonly AnyKeySelector[]> = UnionToIntersection<{ [Index in keyof Ks]: Parameters<Ks[Index]>[0]; }[number]>;
|
|
88
|
+
/** Union of every input key selector's `props` argument (position 1), if any. */
|
|
89
|
+
type PropsUnion<Ks extends readonly AnyKeySelector[]> = { [Index in keyof Ks]: Parameters<Ks[Index]> extends [any, infer Props, ...any[]] ? Props : never; }[number];
|
|
90
|
+
/** Intersection of every input key selector's `props`, or `never` if none are parametric. */
|
|
91
|
+
type ComposedProps<Ks extends readonly AnyKeySelector[]> = [PropsUnion<Ks>] extends [never] ? never : UnionToIntersection<PropsUnion<Ks>>;
|
|
92
|
+
/**
|
|
93
|
+
* The key selector produced by a {@link KeySelectorComposer}: a function that
|
|
94
|
+
* intersects the `state` (and `props`, when any input is parametric) of every
|
|
95
|
+
* composed key selector, tagged with the original inputs as `dependencies`.
|
|
96
|
+
*/
|
|
97
|
+
type OutputKeySelector<S, P, D extends readonly AnyKeySelector[]> = ([P] extends [never] ? (state: S) => unknown : (state: S, props: P) => unknown) & {
|
|
98
|
+
dependencies: D;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Composes N key selectors into a single one. A single variadic signature with
|
|
102
|
+
* tuple inference replaces the former per-arity overload set.
|
|
103
|
+
*/
|
|
104
|
+
type KeySelectorComposer = <Ks extends readonly AnyKeySelector[]>(...keySelectors: Ks) => OutputKeySelector<ComposedState<Ks>, ComposedProps<Ks>, Ks>;
|
|
105
|
+
declare function createKeySelectorComposer(baseKeySelectorComposer: (...keySelectors: AnyKeySelector[]) => AnyKeySelector): KeySelectorComposer;
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/createBoundSelector.d.ts
|
|
108
|
+
/**
|
|
109
|
+
* The special type to prevent binding of non optional props on optional values
|
|
110
|
+
*/
|
|
111
|
+
type BoundSelector<S, P2, P1 extends Partial<P2>, R> = P2 extends Pick<P1, keyof P2> ? Exclude<keyof P1, keyof P2> extends never ? NamedSelector<S, R> : NamedParametricSelector<S, Omit<P1, keyof P2>, R> : never;
|
|
112
|
+
type BoundSelectorOptions<S, P2, P1 extends Partial<P2>, R> = {
|
|
113
|
+
bindingStrategy?: (baseSelector: Selector<S, R, [P1]>, binding: P2) => Selector<S, R, [Omit<P1, keyof P2>]>;
|
|
114
|
+
keySelectorComposer?: KeySelectorComposer;
|
|
115
|
+
};
|
|
116
|
+
declare const createBoundInnerSelector: <S, P2 extends object, P1 extends Partial<P2>, R, OR extends R>(baseSelector: Selector<S, R, [P1]>, binding: P2, options?: BoundSelectorOptions<S, P2, P1, OR>) => BoundSelector<S, P2, P1, R>;
|
|
117
|
+
declare const createBoundSelector: typeof createBoundInnerSelector;
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/createEmptySelector.d.ts
|
|
120
|
+
/**
|
|
121
|
+
* Creates a selector that always resolves to `undefined`. Used as the "no link"
|
|
122
|
+
* branch of a chain (e.g. an optional relation that isn't present).
|
|
123
|
+
*
|
|
124
|
+
* When the base selector is cached, the empty selector is tagged with
|
|
125
|
+
* {@link defaultKeySelector} so that it still passes {@link isCachedSelector}
|
|
126
|
+
* and takes part in key-selector composition. The default key is deliberately
|
|
127
|
+
* the only cache-related metadata copied: an empty selector has no result to
|
|
128
|
+
* memoize, so it needs no `cache` / `getMatchingSelector` of its own, and the
|
|
129
|
+
* default key is dropped by `excludeDefaultSelectors` during composition.
|
|
130
|
+
*/
|
|
131
|
+
declare const createEmptySelector: <S, R>(baseSelector: Selector<S, R, any[]>) => Selector<S, R | undefined>;
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/createAdaptedSelector.d.ts
|
|
134
|
+
declare const createAdaptedSelector: <S, P1 extends object, P2, R>(baseSelector: Selector<S, R, [P1]>, mapping: (props: P2) => P1) => NamedParametricSelector<S, P2, R>;
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/createChainSelector.d.ts
|
|
137
|
+
type SelectorChain<R1, S1, R2> = (result: R1) => Selector<S1, R2>;
|
|
138
|
+
type ParametricSelectorChain<R1, S1, P1, R2> = (result: R1) => Selector<S1, R2, [P1]>;
|
|
139
|
+
type SelectorChainHierarchy<C extends SelectorChain<any, any, any>, H extends SelectorChainHierarchy<any, any>> = C & {
|
|
140
|
+
parentChain?: H;
|
|
141
|
+
};
|
|
142
|
+
type ParametricSelectorChainHierarchy<C extends ParametricSelectorChain<any, any, any, any>, H extends ParametricSelectorChainHierarchy<any, any>> = C & {
|
|
143
|
+
parentChain?: H;
|
|
144
|
+
};
|
|
145
|
+
type CreateSelectorOptions<SelectorCreator extends typeof createSelectorCreator> = {
|
|
146
|
+
selectorCreator: ReturnType<SelectorCreator>;
|
|
147
|
+
cacheObject: ICacheObject;
|
|
148
|
+
};
|
|
149
|
+
type ChainSelectorOptions<SelectorCreator extends typeof createSelectorCreator = typeof createSelectorCreator> = {
|
|
150
|
+
createSelectorOptions?: () => CreateSelectorOptions<SelectorCreator>;
|
|
151
|
+
keySelectorComposer?: KeySelectorComposer;
|
|
152
|
+
};
|
|
153
|
+
interface ChainSelectorResult<S1, R1> {
|
|
154
|
+
chain: <S2, R2 = any>(fn: SelectorChain<R1, S2, R2>, chainOptions?: ChainSelectorOptions) => ChainSelectorResult<S1 & S2, R2>;
|
|
155
|
+
map: <R2>(fn: (result: R1) => R2, mapOptions?: ChainSelectorOptions) => ChainSelectorResult<S1, R2>;
|
|
156
|
+
build: () => Selector<S1, R1, []> & {
|
|
157
|
+
chainHierarchy: SelectorChainHierarchy<any, any> | undefined;
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
interface ParametricChainSelectorResult<S1, P1, R1> {
|
|
161
|
+
chain: <S2, P2 = unknown, R2 = any>(fn: ParametricSelectorChain<R1, S2, P2, R2>, chainOptions?: ChainSelectorOptions) => ParametricChainSelectorResult<S1 & S2, P1 & P2, R2>;
|
|
162
|
+
map: <R2>(fn: (result: R1) => R2, mapOptions?: ChainSelectorOptions) => ParametricChainSelectorResult<S1, P1, R2>;
|
|
163
|
+
build: () => Selector<S1, R1, [P1]> & {
|
|
164
|
+
chainHierarchy: ParametricSelectorChainHierarchy<any, any> | undefined;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
declare function createChainSelector<S1, R1>(selector: Selector<S1, R1>, options?: ChainSelectorOptions, prevChain?: SelectorChainHierarchy<any, any>): ChainSelectorResult<S1, R1>;
|
|
168
|
+
declare function createChainSelector<S1, P1, R1>(selector: Selector<S1, R1, [P1]>, options?: ChainSelectorOptions, prevChain?: ParametricSelectorChainHierarchy<any, any>): ParametricChainSelectorResult<S1, P1, R1>;
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/createCachedSequenceSelector.d.ts
|
|
171
|
+
declare function createCachedSequenceSelector<S, R>(selectors: Selector<S, R>[]): (options: PolymorphicCachedOptions<Selector<S, R>[], R[]>) => Selector<S, R[]>;
|
|
172
|
+
declare function createCachedSequenceSelector<S, P, R>(selectors: Selector<S, R, [P]>[]): (options: PolymorphicCachedOptions<Selector<S, R, [P]>[], R[]>) => Selector<S, R[], [P]>;
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region src/createCachedStructuredSelector.d.ts
|
|
175
|
+
/** Intersection of the `state` argument of every selector in the object. */
|
|
176
|
+
type StructuredState<M extends SelectorsObject> = UnionToIntersection<{ [K in keyof M]: Parameters<M[K]>[0]; }[keyof M]>;
|
|
177
|
+
/** Union of the `props` argument (position 1) of every parametric selector. */
|
|
178
|
+
type StructuredPropsUnion<M extends SelectorsObject> = { [K in keyof M]: Parameters<M[K]> extends [any, infer Props, ...any[]] ? Props : never; }[keyof M];
|
|
179
|
+
/** The extra-arguments tuple: `[Props]` when any selector is parametric, else `[]`. */
|
|
180
|
+
type StructuredParams<M extends SelectorsObject> = [StructuredPropsUnion<M>] extends [never] ? [] : [UnionToIntersection<StructuredPropsUnion<M>>];
|
|
181
|
+
/** The input selectors as reselect sees them, used to type the cached options. */
|
|
182
|
+
type StructuredInputs<M extends SelectorsObject> = Selector<StructuredState<M>, unknown, StructuredParams<M>>[];
|
|
183
|
+
/**
|
|
184
|
+
* A single variadic signature replaces the former `Selector` / `ParametricSelector`
|
|
185
|
+
* conditional: `state` and `props` are derived from the selectors object, so a
|
|
186
|
+
* parametric input keeps its props type without a separate overload.
|
|
187
|
+
*/
|
|
188
|
+
declare function createCachedStructuredSelector<M extends SelectorsObject>(selectors: M): (options: PolymorphicCachedOptions<StructuredInputs<M>, SelectorResultsMap<M>>) => Selector<StructuredState<M>, SelectorResultsMap<M>, StructuredParams<M>>;
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/keys/defaultKeySelector.d.ts
|
|
191
|
+
declare const defaultKeySelector: () => string;
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/keys/stringComposeKeySelectors.d.ts
|
|
194
|
+
declare const stringComposeKeySelectors: KeySelectorComposer;
|
|
195
|
+
//#endregion
|
|
196
|
+
//#region src/keys/arrayComposeKeySelectors.d.ts
|
|
197
|
+
declare const arrayComposeKeySelectors: KeySelectorComposer;
|
|
198
|
+
//#endregion
|
|
199
|
+
//#region src/keys/createKeySelectorCreator.d.ts
|
|
200
|
+
declare function createKeySelectorCreator(keySelectorComposer: KeySelectorComposer): <S, D>(selectorInputs: {
|
|
201
|
+
inputSelectors: D;
|
|
202
|
+
keySelector?: KeySelector<S>;
|
|
203
|
+
}) => KeySelector<S>;
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region src/debug/debug.d.ts
|
|
206
|
+
declare const isDebugMode: () => boolean;
|
|
207
|
+
declare const setDebugMode: (value: boolean) => void;
|
|
208
|
+
//#endregion
|
|
209
|
+
//#region src/cache/intervalMapCache.d.ts
|
|
210
|
+
declare const initGarbageCollector: () => void;
|
|
211
|
+
declare class IntervalMapCache implements ICacheObject {
|
|
212
|
+
private entries;
|
|
213
|
+
set(key: any, data: any): void;
|
|
214
|
+
get(key: any): unknown;
|
|
215
|
+
remove(key: any): void;
|
|
216
|
+
clear(): void;
|
|
217
|
+
/**
|
|
218
|
+
* Drops entries untouched for longer than the lifetime. Returns whether the
|
|
219
|
+
* bucket is now empty, which is what lets the collector unregister it.
|
|
220
|
+
*/
|
|
221
|
+
sweep(currentTime: number): boolean;
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region src/cache/TreeCache.d.ts
|
|
225
|
+
type TreeCacheObjectOptions = {
|
|
226
|
+
cacheObjectCreator?: () => ICacheObject;
|
|
227
|
+
};
|
|
228
|
+
declare class TreeCache implements ICacheObject {
|
|
229
|
+
private readonly cacheObjectCreator;
|
|
230
|
+
private root;
|
|
231
|
+
constructor(options: TreeCacheObjectOptions);
|
|
232
|
+
clear(): void;
|
|
233
|
+
get(key: unknown): unknown;
|
|
234
|
+
set(key: unknown, selectorFn: unknown): void;
|
|
235
|
+
remove(key: unknown): void;
|
|
236
|
+
/**
|
|
237
|
+
* Called by re-reselect on every cache operation, so neither the wrapping array
|
|
238
|
+
* nor the `every` callback is allocated here.
|
|
239
|
+
*/
|
|
240
|
+
isValidCacheKey(key: unknown): boolean;
|
|
241
|
+
}
|
|
242
|
+
//#endregion
|
|
243
|
+
//#region src/_hooks/useSelector.d.ts
|
|
244
|
+
declare function useSelector<S extends object, R>(selector: (state: S) => R): R;
|
|
245
|
+
declare function useSelector<S extends object, P, R>(selector: (state: S, props: P) => R, props: P): R;
|
|
246
|
+
//#endregion
|
|
247
|
+
export { type ChainSelectorOptions, IntervalMapCache, TreeCache, arrayComposeKeySelectors, createAdaptedSelector, createBoundSelector, createCachedSequenceSelector, createCachedStructuredSelector, createChainSelector, createEmptySelector, createKeySelectorComposer, createKeySelectorCreator, createPathSelector, createPropSelector, createSegmentSelector, defaultKeySelector, initGarbageCollector, isDebugMode, setDebugMode, stringComposeKeySelectors, useSelector };
|
|
248
|
+
//# sourceMappingURL=reselectKit.d.ts.map
|