@ngutil/common 0.0.102 → 0.0.104

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.
@@ -79,10 +79,10 @@ class Destructible {
79
79
  dispose() {
80
80
  this.ngOnDestroy();
81
81
  }
82
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: Destructible, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
83
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: Destructible, isStandalone: true, ngImport: i0 }); }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: Destructible, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
83
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.13", type: Destructible, isStandalone: true, ngImport: i0 }); }
84
84
  }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: Destructible, decorators: [{
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: Destructible, decorators: [{
86
86
  type: Directive
87
87
  }] });
88
88
 
@@ -1 +1 @@
1
- {"version":3,"file":"ngutil-common.mjs","sources":["../../../../packages/common/src/destruct.ts","../../../../packages/common/src/number-with-unit.ts","../../../../packages/common/src/util.ts","../../../../packages/common/src/coerce/bool-attr.ts","../../../../packages/common/src/coerce/element.ts","../../../../packages/common/src/form/observable.ts","../../../../packages/common/src/unngzone.ts","../../../../packages/common/src/dom.ts","../../../../packages/common/src/lifecycle.ts","../../../../packages/common/src/ngutil-common.ts"],"sourcesContent":["import { Directive, OnDestroy } from \"@angular/core\"\n\nimport { Observable, share, Subject, take, takeUntil } from \"rxjs\"\n\nexport interface IDisposable {\n dispose(): void\n}\n\nexport class Destruct {\n readonly #on = new Subject<void>()\n readonly on = this.#on.pipe(share())\n\n constructor(fn?: () => void) {\n if (fn != null) {\n this.any(fn)\n }\n }\n get done(): boolean {\n return this.#on.closed\n }\n\n sub<T>(o: Observable<T>): Observable<T> {\n if (this.done) {\n return o.pipe(take(0))\n } else {\n return o.pipe(takeUntil(this.on))\n }\n }\n\n disposable<T extends IDisposable>(d: T): T {\n if (this.done) {\n d.dispose()\n } else {\n this.on.subscribe(d.dispose.bind(d))\n }\n\n return d\n }\n\n node<T extends Node>(el: T): T {\n const remove = () => {\n const parent = el.parentNode\n if (parent) {\n parent.removeChild(el)\n }\n }\n if (this.done) {\n remove()\n } else {\n this.on.subscribe(remove)\n }\n\n return el\n }\n\n any(f: () => void): void {\n if (this.done) {\n f()\n } else {\n this.on.subscribe(f)\n }\n }\n\n run() {\n if (!this.done) {\n this.#on.next()\n this.#on.complete()\n }\n }\n}\n\n@Directive()\nexport abstract class Destructible implements OnDestroy, IDisposable {\n /** @ignore */\n readonly d = new Destruct()\n\n /** @ignore */\n ngOnDestroy() {\n this.d.run()\n delete (this as any).d\n }\n\n /** @ignore */\n dispose() {\n this.ngOnDestroy()\n }\n}\n","export type NumberWithUnitInput = number | string | NumberWithUnit\n\nconst specials = [\"auto\", \"inherit\"]\n\nexport const UNIT_REGEX = \"v[h|w|min|max]|p[c|t|x]|[re|e|c|m]m|[l|c]h|%|in|Q|ex|m?s\"\nexport const NUMBER_REGEX = \"[+-]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)\"\n\nconst regex = new RegExp(`^(${NUMBER_REGEX})\\\\s*(${UNIT_REGEX})?$`)\n\nexport class NumberWithUnit {\n static coerce(value: any, defaultUnit?: string) {\n if (value instanceof NumberWithUnit) {\n return value\n } else if (specials.includes(value)) {\n return new NumberWithUnit(NaN, value)\n } else if (typeof value === \"string\") {\n const match = value.match(regex)\n if (match) {\n return new NumberWithUnit(Number(match[1]), match[2] || defaultUnit)\n }\n } else if (typeof value === \"number\") {\n return new NumberWithUnit(value, defaultUnit)\n }\n\n throw new Error(`Not implemented number with unit: ${value}`)\n }\n\n constructor(\n public readonly value: number,\n public readonly unit?: string\n ) {}\n\n toString() {\n if (isNaN(this.value)) {\n return this.unit\n } else if (this.unit != null) {\n return `${this.value}${this.unit}`\n } else {\n return `${this.value}`\n }\n }\n}\n","import { isEqual as _isEqual, cloneDeep, isPlainObject } from \"es-toolkit\"\n\nimport { DeepReadonly } from \"./types/readonly\"\nimport { IfAny, IfTuple } from \"./types/util\"\n\n// export { deepFreeze }\n\nexport const deepClone: <T>(obj: T) => T = typeof structuredClone === \"function\" ? structuredClone : cloneDeep\n// export const deepFreeze: <T>(obj: T) => DeepReadonly<T> = o => Object.freeze(o) as any\n// export const isPlainObject: (arg: any) => arg is { [key: string]: any } = _isPlainObject as any\nexport { isPlainObject }\n\n// TODO: submit es-toolkit pr for this\nexport const isEqual: <A, B extends A>(a: A, b: B) => a is B = _isEqual as unknown as any\n\nexport function isEqualStrict<A, B extends A>(a: A, b: B): a is B {\n return a === b\n}\n// export const isEqualStrict: <A, B extends A>(a: A, b: B) => a is B = (a, b) => a === b\n\nexport function deepFreeze<T>(obj: T): DeepReadonly<T> {\n if (obj == null) {\n return obj as any\n }\n\n if (obj instanceof Map) {\n obj.clear =\n obj.delete =\n obj.set =\n function () {\n throw new Error(\"map is read-only\")\n }\n } else if (obj instanceof Set) {\n obj.add =\n obj.clear =\n obj.delete =\n function () {\n throw new Error(\"set is read-only\")\n }\n }\n\n // Freeze self\n Object.freeze(obj)\n\n Object.getOwnPropertyNames(obj).forEach(name => {\n const prop = (obj as any)[name]\n const type = typeof prop\n\n // Freeze prop if it is an object or function and also not already frozen\n if ((type === \"object\" || type === \"function\") && !Object.isFrozen(prop)) {\n deepFreeze(prop)\n }\n })\n\n return obj as any\n}\n\n/**\n * @example\n * ```ts\n * toSorted([{id: 1}, {id: 2}, {id: 3}], sortBy([{id: \"desc\"}]))\n * ```\n */\nexport function toSorted<T>(items: readonly T[], fn: (a: T, b: T) => number): T[] {\n if (typeof (items as any).toSorted === \"function\") {\n return (items as any).toSorted(fn)\n } else {\n return items.slice(0).sort(fn)\n }\n}\n\ntype FalsyIfNull<O> = O extends null ? null : never\ntype FalsyIfUndefined<O> = O extends undefined ? undefined : never\ntype FalsyIfBool<O> = O extends boolean ? false : never\ntype FalsyIfString<O> = O extends string ? \"\" : never\ntype FalsyIfNumber<O> = O extends number ? 0 : never\ntype FalsyIfTuple<O> = IfTuple<O, O, never, never>\ntype FalsyIfAny<O> = IfAny<O, O, never>\n\nexport type IsFalsy<O> =\n | FalsyIfNull<O>\n | FalsyIfUndefined<O>\n | FalsyIfBool<O>\n | FalsyIfString<O>\n | FalsyIfNumber<O>\n | FalsyIfTuple<O>\n | FalsyIfAny<O>\n\nexport function isFalsy<T>(value: T): value is IsFalsy<T> & T {\n if (value == null) {\n return true\n } else if (typeof value === \"string\") {\n return value.length === 0\n } else if (typeof value === \"number\") {\n return isNaN(value) || value === 0\n } else if (Array.isArray(value)) {\n return value.length === 0\n } else if (isPlainObject(value)) {\n return Object.keys(value).length === 0\n } else if ((value as any) instanceof Set) {\n return (value as any).size === 0\n } else if ((value as any) instanceof Map) {\n return (value as any).size === 0\n }\n return value === false\n}\n\nexport type IsTruthy<T> = Exclude<T, undefined | null | false | \"\" | 0>\n\nexport function isTruthy<T>(value: T): value is IsTruthy<T> {\n return !isFalsy(value)\n}\n","import { isTruthy } from \"../util\"\n\nexport type BooleanInput = string | boolean | null | undefined\n\nexport function coerceBoolAttr(value: BooleanInput): boolean {\n return isTruthy(value) || (typeof value === \"string\" && value !== \"false\")\n}\n","import { ElementRef } from \"@angular/core\"\n\nexport type ElementInput<T extends Element = HTMLElement> = T | ElementRef<T>\n\nexport function coerceElement<T>(value: T | ElementRef<T>): T {\n if (value instanceof ElementRef) {\n return value.nativeElement\n }\n return value\n}\n\nexport function isElementInput(value: any): value is ElementInput {\n return value instanceof Element || value instanceof ElementRef\n}\n","import { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\nimport { FormControl } from \"@angular/forms\"\n\nimport { debounceTime, distinctUntilChanged, map, Observable, shareReplay, startWith } from \"rxjs\"\n\nimport { isEqual } from \"es-toolkit\"\n\nimport { isFalsy } from \"../util\"\n\nexport interface ObservableOptions {\n distinct?: boolean\n destruct?: boolean\n}\n\nexport interface ObservableValueOptions extends ObservableOptions {\n debounce?: number\n falsyToUndefined?: boolean\n}\n\nexport type FormControlProperties =\n | \"valid\"\n | \"invalid\"\n | \"status\"\n | \"pristine\"\n | \"dirty\"\n | \"touched\"\n | \"untouched\"\n | \"disabled\"\n | \"enabled\"\n | \"errors\"\n\nexport const DEFAULT: ObservableOptions = { distinct: true, destruct: true }\nexport const VALUE_DEFAULT: ObservableValueOptions = { ...DEFAULT, falsyToUndefined: true }\n\nexport function fcObservableValue<T, O extends ObservableValueOptions>(\n fc: FormControl<T>,\n opts: O = VALUE_DEFAULT as any\n): Observable<O extends { falsyToNull: true } ? T | null : T> {\n let result: Observable<any> = fc.valueChanges.pipe(\n startWith(null),\n map(() => fc.value)\n )\n\n if (opts.debounce) {\n result = result.pipe(debounceTime(opts.debounce))\n }\n\n if (opts.falsyToUndefined) {\n result = result.pipe(map(v => (isFalsy(v) ? undefined : v)))\n }\n\n return handleCommonOptions(result, opts) as any\n}\n\nexport function fcObservableProperty<T, P extends FormControlProperties>(\n fc: FormControl<T>,\n property: P,\n opts: ObservableOptions = DEFAULT\n): Observable<FormControl<T>[P]> {\n const result = fc.statusChanges.pipe(\n startWith(null),\n map(() => fc[property])\n )\n\n return handleCommonOptions(result, opts)\n}\n\nfunction handleCommonOptions<T>(o: Observable<T>, opts: ObservableOptions): Observable<T> {\n if (opts.distinct) {\n o = o.pipe(distinctUntilChanged(isEqual))\n }\n\n if (opts.destruct) {\n o = o.pipe(takeUntilDestroyed())\n }\n\n return o.pipe(shareReplay(1))\n}\n","export const Zone = (window as any).Zone\n\nexport function __zone_symbol__<T extends string>(val: T): T {\n const symbol =\n typeof Zone !== \"undefined\" && (Zone as any).__symbol__\n ? (Zone as any).__symbol__(val)\n : `__zone_symbol__${val}`\n return typeof window[symbol] !== \"undefined\" ? symbol : val\n}\n\nexport const rawSetTimeout = window[__zone_symbol__(\"setTimeout\")]\nexport const rawClearTimeout = window[__zone_symbol__(\"clearTimeout\")]\nexport const rawSetInterval = window[__zone_symbol__(\"setInterval\")]\nexport const rawClearInterval = window[__zone_symbol__(\"clearInterval\")]\nexport const rawRequestAnimationFrame = window[__zone_symbol__(\"requestAnimationFrame\")]\nexport const rawCancelAnimationFrame = window[__zone_symbol__(\"cancelAnimationFrame\")]\n","import { rawRequestAnimationFrame } from \"./unngzone\"\n\ntype FastDomHandler = () => void\n\nclass _FastDOM {\n #rafId: any\n #mutate: Array<FastDomHandler> = []\n #measure: Array<FastDomHandler> = []\n\n public mutate(handler: FastDomHandler) {\n this.#mutate.push(handler)\n this._schedule()\n }\n\n public mutateNext(handler: FastDomHandler) {\n this.#mutate.push(() => {\n this.#mutate.push(handler)\n })\n this._schedule()\n }\n\n public measure(handler: FastDomHandler) {\n this.#measure.push(handler)\n this._schedule()\n }\n\n public setStyle(el: HTMLElement, style: { [key: string]: any }, chain?: FastDomHandler) {\n this.mutate(() => {\n for (const [k, v] of Object.entries(style)) {\n if (v == null) {\n el.style.removeProperty(k)\n } else {\n el.style.setProperty(k, v)\n }\n }\n\n chain && chain()\n })\n }\n\n public setAttributes(el: HTMLElement, attrs: { [key: string]: any }, chain?: FastDomHandler) {\n this.mutate(() => {\n for (const [k, v] of Object.entries(attrs)) {\n if (v == null) {\n el.removeAttribute(k)\n } else {\n el.setAttribute(k, v)\n }\n }\n\n chain && chain()\n })\n }\n\n private _schedule() {\n if (!this.#rafId) {\n this.#rafId = rawRequestAnimationFrame(this._apply.bind(this))\n }\n }\n\n private _apply() {\n this.#rafId = null\n\n const measure = this.#measure.slice()\n const mutate = this.#mutate.slice()\n this.#measure.length = 0\n this.#mutate.length = 0\n\n runQ(measure)\n runQ(mutate)\n\n if (this.#measure.length || this.#mutate.length) {\n this._schedule()\n }\n }\n}\n\nfunction runQ(items: FastDomHandler[]) {\n let item: FastDomHandler\n while ((item = items.shift()!)) {\n item()\n }\n}\n\nexport const FastDOM = new _FastDOM()\n","import {\n catchError,\n concat,\n concatMap,\n filter,\n forkJoin,\n from,\n map,\n Observable,\n ObservableInput,\n of,\n reduce,\n ReplaySubject,\n scan,\n share,\n shareReplay,\n Subject,\n Subscriber,\n take,\n takeLast,\n takeUntil,\n takeWhile,\n tap,\n throwError\n} from \"rxjs\"\n\nimport { flatten } from \"es-toolkit\"\n\nexport type LifecycleHandler = () => ObservableInput<unknown> | null | undefined | void\n\nexport class StopLifecycle extends Error {}\n\nexport type LifecycleOptions = Record<string, { order?: \"parallel\" | \"sequential\"; cancellable?: boolean }>\n\nexport type LifecycleRemap<A, B> =\n A extends Lifecycle<infer AO, infer AS>\n ? B extends Lifecycle<infer BO, infer BS>\n ? Partial<{ [K in AS]: BS }>\n : never\n : never\n\nexport class Lifecycle<T extends LifecycleOptions, S extends keyof T = keyof T> {\n readonly states: T\n readonly #handlers: Partial<Record<S, Array<LifecycleHandler>>> = {}\n\n readonly #until = new Subject<void>()\n readonly #trigger = new Subject<S>()\n readonly #status = this.#trigger.pipe(\n takeUntil(this.#until),\n scan(\n (result, trigger) => {\n if (!result[trigger]) {\n result[trigger] = this.#run(trigger as S).pipe(\n tap(executed => {\n if (executed === false) {\n delete result[trigger]\n }\n }),\n map(executed => [trigger, !!executed] as [S, boolean]),\n shareReplay(1)\n )\n }\n return result\n },\n {} as Record<S, Observable<[S, boolean]>>\n ),\n concatMap(triggers => {\n const srcs = Object.values(triggers) as Array<Observable<[S, boolean]>>\n return concat(...srcs).pipe(\n takeWhile(([_, executed]) => executed, false),\n reduce(\n (result, [name, executed]) => {\n return { ...result, [name]: executed }\n },\n {} as Record<S, boolean>\n )\n )\n }),\n tap(status => {\n if (this.#handlers == null) {\n return\n }\n\n for (const [k, v] of Object.entries(status)) {\n if (v) {\n delete (this.#handlers as any)[k]\n }\n }\n }),\n share()\n )\n\n readonly status$ = this.#status.pipe(shareReplay(1))\n readonly current$ = new ReplaySubject<S>()\n\n constructor(states: T) {\n this.states = { ...states }\n\n for (const value of Object.values(states)) {\n if (value.order == null) {\n value.order = \"parallel\"\n }\n }\n }\n\n on(state: S, fn: LifecycleHandler) {\n if (state in this.#handlers) {\n this.#handlers[state]!.push(fn)\n } else {\n this.#handlers[state] = [fn]\n }\n\n return () => {\n const idx = this.#handlers[state]!.indexOf(fn)\n if (idx > -1) {\n this.#handlers[state]!.splice(idx, 1)\n }\n }\n }\n\n onExecute(state: S) {\n return this.current$.pipe(\n takeUntil(this.#until),\n filter(current => current === state)\n )\n }\n\n onDone(state: S) {\n return this.status$.pipe(\n filter(status => status[state]),\n take(1)\n )\n }\n\n run(...states: Array<S | S[]>) {\n const flattened = flatten(states).filter((v, i, a) => a.indexOf(v) === i)\n const expectedCount = flattened.length\n return new Observable((dest: Subscriber<void>) => {\n dest.add(\n this.#status.subscribe(currentStatus => {\n const executedCount = Object.entries(currentStatus).reduce(\n (result, [name, done]) => result + (done && flattened.includes(name as S) ? 1 : 0),\n 0\n )\n\n if (executedCount >= expectedCount) {\n dest.next()\n dest.complete()\n }\n })\n )\n\n for (const s of flattened) {\n this.#trigger.next(s as S)\n }\n })\n }\n\n /**\n * Run this state changes on other state\n */\n control<T extends Lifecycle<any, any>>(state: T, remap?: LifecycleRemap<this, T>) {\n const remove: Array<() => void> = []\n\n for (const selfState of Object.keys(this.states)) {\n const otherState = (remap as unknown as any)?.[selfState] || selfState\n if (otherState in state.states) {\n remove.push(this.on(selfState as any, () => state.run(otherState)))\n }\n }\n\n return () => {\n for (const fn of remove) {\n fn()\n }\n }\n }\n\n destroy() {\n ;(this as any).#handlers = null\n this.#until.next()\n this.#until.complete()\n }\n\n #run(state: S) {\n return new Observable((dest: Subscriber<boolean>) => {\n this.current$.next(state)\n\n const handlers = this.#handlers[state]\n if (handlers == null || handlers.length === 0) {\n dest.next(true)\n dest.complete()\n return\n }\n\n const observables: Array<Observable<any>> = handlers.map(handler => {\n const observable = handler()\n if (observable == null) {\n return of(null)\n } else {\n return from(observable)\n }\n })\n\n const config = this.states[state]\n\n if (observables.length === 1) {\n return observables[0].pipe(map(() => true)).subscribe(dest)\n } else if (config.order === \"parallel\") {\n return forkJoin(observables)\n .pipe(map(() => true))\n .subscribe(dest)\n } else if (config.order === \"sequential\") {\n return concat(...observables)\n .pipe(map(() => true))\n .subscribe(dest)\n } else {\n dest.next(true)\n dest.complete()\n }\n\n return\n }).pipe(\n takeLast(1),\n catchError(error => {\n if (error instanceof StopLifecycle) {\n return of(false)\n } else {\n return throwError(() => error)\n }\n })\n )\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_isEqual","isEqual"],"mappings":"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"}
1
+ {"version":3,"file":"ngutil-common.mjs","sources":["../../../../packages/common/src/destruct.ts","../../../../packages/common/src/number-with-unit.ts","../../../../packages/common/src/util.ts","../../../../packages/common/src/coerce/bool-attr.ts","../../../../packages/common/src/coerce/element.ts","../../../../packages/common/src/form/observable.ts","../../../../packages/common/src/unngzone.ts","../../../../packages/common/src/dom.ts","../../../../packages/common/src/lifecycle.ts","../../../../packages/common/src/ngutil-common.ts"],"sourcesContent":["import { Directive, OnDestroy } from \"@angular/core\"\n\nimport { Observable, share, Subject, take, takeUntil } from \"rxjs\"\n\nexport interface IDisposable {\n dispose(): void\n}\n\nexport class Destruct {\n readonly #on = new Subject<void>()\n readonly on = this.#on.pipe(share())\n\n constructor(fn?: () => void) {\n if (fn != null) {\n this.any(fn)\n }\n }\n get done(): boolean {\n return this.#on.closed\n }\n\n sub<T>(o: Observable<T>): Observable<T> {\n if (this.done) {\n return o.pipe(take(0))\n } else {\n return o.pipe(takeUntil(this.on))\n }\n }\n\n disposable<T extends IDisposable>(d: T): T {\n if (this.done) {\n d.dispose()\n } else {\n this.on.subscribe(d.dispose.bind(d))\n }\n\n return d\n }\n\n node<T extends Node>(el: T): T {\n const remove = () => {\n const parent = el.parentNode\n if (parent) {\n parent.removeChild(el)\n }\n }\n if (this.done) {\n remove()\n } else {\n this.on.subscribe(remove)\n }\n\n return el\n }\n\n any(f: () => void): void {\n if (this.done) {\n f()\n } else {\n this.on.subscribe(f)\n }\n }\n\n run() {\n if (!this.done) {\n this.#on.next()\n this.#on.complete()\n }\n }\n}\n\n@Directive()\nexport abstract class Destructible implements OnDestroy, IDisposable {\n /** @ignore */\n readonly d = new Destruct()\n\n /** @ignore */\n ngOnDestroy() {\n this.d.run()\n delete (this as any).d\n }\n\n /** @ignore */\n dispose() {\n this.ngOnDestroy()\n }\n}\n","export type NumberWithUnitInput = number | string | NumberWithUnit\n\nconst specials = [\"auto\", \"inherit\"]\n\nexport const UNIT_REGEX = \"v[h|w|min|max]|p[c|t|x]|[re|e|c|m]m|[l|c]h|%|in|Q|ex|m?s\"\nexport const NUMBER_REGEX = \"[+-]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.\\\\d*|\\\\d+)\"\n\nconst regex = new RegExp(`^(${NUMBER_REGEX})\\\\s*(${UNIT_REGEX})?$`)\n\nexport class NumberWithUnit {\n static coerce(value: any, defaultUnit?: string) {\n if (value instanceof NumberWithUnit) {\n return value\n } else if (specials.includes(value)) {\n return new NumberWithUnit(NaN, value)\n } else if (typeof value === \"string\") {\n const match = value.match(regex)\n if (match) {\n return new NumberWithUnit(Number(match[1]), match[2] || defaultUnit)\n }\n } else if (typeof value === \"number\") {\n return new NumberWithUnit(value, defaultUnit)\n }\n\n throw new Error(`Not implemented number with unit: ${value}`)\n }\n\n constructor(\n public readonly value: number,\n public readonly unit?: string\n ) {}\n\n toString() {\n if (isNaN(this.value)) {\n return this.unit\n } else if (this.unit != null) {\n return `${this.value}${this.unit}`\n } else {\n return `${this.value}`\n }\n }\n}\n","import { isEqual as _isEqual, cloneDeep, isPlainObject } from \"es-toolkit\"\n\nimport { DeepReadonly } from \"./types/readonly\"\nimport { IfAny, IfTuple } from \"./types/util\"\n\n// export { deepFreeze }\n\nexport const deepClone: <T>(obj: T) => T = typeof structuredClone === \"function\" ? structuredClone : cloneDeep\n// export const deepFreeze: <T>(obj: T) => DeepReadonly<T> = o => Object.freeze(o) as any\n// export const isPlainObject: (arg: any) => arg is { [key: string]: any } = _isPlainObject as any\nexport { isPlainObject }\n\n// TODO: submit es-toolkit pr for this\nexport const isEqual: <A, B extends A>(a: A, b: B) => a is B = _isEqual as unknown as any\n\nexport function isEqualStrict<A, B extends A>(a: A, b: B): a is B {\n return a === b\n}\n// export const isEqualStrict: <A, B extends A>(a: A, b: B) => a is B = (a, b) => a === b\n\nexport function deepFreeze<T>(obj: T): DeepReadonly<T> {\n if (obj == null) {\n return obj as any\n }\n\n if (obj instanceof Map) {\n obj.clear =\n obj.delete =\n obj.set =\n function () {\n throw new Error(\"map is read-only\")\n }\n } else if (obj instanceof Set) {\n obj.add =\n obj.clear =\n obj.delete =\n function () {\n throw new Error(\"set is read-only\")\n }\n }\n\n // Freeze self\n Object.freeze(obj)\n\n Object.getOwnPropertyNames(obj).forEach(name => {\n const prop = (obj as any)[name]\n const type = typeof prop\n\n // Freeze prop if it is an object or function and also not already frozen\n if ((type === \"object\" || type === \"function\") && !Object.isFrozen(prop)) {\n deepFreeze(prop)\n }\n })\n\n return obj as any\n}\n\n/**\n * @example\n * ```ts\n * toSorted([{id: 1}, {id: 2}, {id: 3}], sortBy([{id: \"desc\"}]))\n * ```\n */\nexport function toSorted<T>(items: readonly T[], fn: (a: T, b: T) => number): T[] {\n if (typeof (items as any).toSorted === \"function\") {\n return (items as any).toSorted(fn)\n } else {\n return items.slice(0).sort(fn)\n }\n}\n\ntype FalsyIfNull<O> = O extends null ? null : never\ntype FalsyIfUndefined<O> = O extends undefined ? undefined : never\ntype FalsyIfBool<O> = O extends boolean ? false : never\ntype FalsyIfString<O> = O extends string ? \"\" : never\ntype FalsyIfNumber<O> = O extends number ? 0 : never\ntype FalsyIfTuple<O> = IfTuple<O, O, never, never>\ntype FalsyIfAny<O> = IfAny<O, O, never>\n\nexport type IsFalsy<O> =\n | FalsyIfNull<O>\n | FalsyIfUndefined<O>\n | FalsyIfBool<O>\n | FalsyIfString<O>\n | FalsyIfNumber<O>\n | FalsyIfTuple<O>\n | FalsyIfAny<O>\n\nexport function isFalsy<T>(value: T): value is IsFalsy<T> & T {\n if (value == null) {\n return true\n } else if (typeof value === \"string\") {\n return value.length === 0\n } else if (typeof value === \"number\") {\n return isNaN(value) || value === 0\n } else if (Array.isArray(value)) {\n return value.length === 0\n } else if (isPlainObject(value)) {\n return Object.keys(value).length === 0\n } else if ((value as any) instanceof Set) {\n return (value as any).size === 0\n } else if ((value as any) instanceof Map) {\n return (value as any).size === 0\n }\n return value === false\n}\n\nexport type IsTruthy<T> = Exclude<T, undefined | null | false | \"\" | 0>\n\nexport function isTruthy<T>(value: T): value is IsTruthy<T> {\n return !isFalsy(value)\n}\n","import { isTruthy } from \"../util\"\n\nexport type BooleanInput = string | boolean | null | undefined\n\nexport function coerceBoolAttr(value: BooleanInput): boolean {\n return isTruthy(value) || (typeof value === \"string\" && value !== \"false\")\n}\n","import { ElementRef } from \"@angular/core\"\n\nexport type ElementInput<T extends Element = HTMLElement> = T | ElementRef<T>\n\nexport function coerceElement<T>(value: T | ElementRef<T>): T {\n if (value instanceof ElementRef) {\n return value.nativeElement\n }\n return value\n}\n\nexport function isElementInput(value: any): value is ElementInput {\n return value instanceof Element || value instanceof ElementRef\n}\n","import { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\nimport { FormControl } from \"@angular/forms\"\n\nimport { debounceTime, distinctUntilChanged, map, Observable, shareReplay, startWith } from \"rxjs\"\n\nimport { isEqual } from \"es-toolkit\"\n\nimport { isFalsy } from \"../util\"\n\nexport interface ObservableOptions {\n distinct?: boolean\n destruct?: boolean\n}\n\nexport interface ObservableValueOptions extends ObservableOptions {\n debounce?: number\n falsyToUndefined?: boolean\n}\n\nexport type FormControlProperties =\n | \"valid\"\n | \"invalid\"\n | \"status\"\n | \"pristine\"\n | \"dirty\"\n | \"touched\"\n | \"untouched\"\n | \"disabled\"\n | \"enabled\"\n | \"errors\"\n\nexport const DEFAULT: ObservableOptions = { distinct: true, destruct: true }\nexport const VALUE_DEFAULT: ObservableValueOptions = { ...DEFAULT, falsyToUndefined: true }\n\nexport function fcObservableValue<T, O extends ObservableValueOptions>(\n fc: FormControl<T>,\n opts: O = VALUE_DEFAULT as any\n): Observable<O extends { falsyToUndefined: true } ? T | null : T> {\n let result: Observable<any> = fc.valueChanges.pipe(\n startWith(null),\n map(() => fc.value)\n )\n\n if (opts.debounce) {\n result = result.pipe(debounceTime(opts.debounce))\n }\n\n if (opts.falsyToUndefined) {\n result = result.pipe(map(v => (isFalsy(v) ? undefined : v)))\n }\n\n return handleCommonOptions(result, opts) as any\n}\n\nexport function fcObservableProperty<T, P extends FormControlProperties>(\n fc: FormControl<T>,\n property: P,\n opts: ObservableOptions = DEFAULT\n): Observable<FormControl<T>[P]> {\n const result = fc.statusChanges.pipe(\n startWith(null),\n map(() => fc[property])\n )\n\n return handleCommonOptions(result, opts)\n}\n\nfunction handleCommonOptions<T>(o: Observable<T>, opts: ObservableOptions): Observable<T> {\n if (opts.distinct) {\n o = o.pipe(distinctUntilChanged(isEqual))\n }\n\n if (opts.destruct) {\n o = o.pipe(takeUntilDestroyed())\n }\n\n return o.pipe(shareReplay(1))\n}\n","export const Zone = (window as any).Zone\n\nexport function __zone_symbol__<T extends string>(val: T): T {\n const symbol =\n typeof Zone !== \"undefined\" && (Zone as any).__symbol__\n ? (Zone as any).__symbol__(val)\n : `__zone_symbol__${val}`\n return typeof window[symbol] !== \"undefined\" ? symbol : val\n}\n\nexport const rawSetTimeout = window[__zone_symbol__(\"setTimeout\")]\nexport const rawClearTimeout = window[__zone_symbol__(\"clearTimeout\")]\nexport const rawSetInterval = window[__zone_symbol__(\"setInterval\")]\nexport const rawClearInterval = window[__zone_symbol__(\"clearInterval\")]\nexport const rawRequestAnimationFrame = window[__zone_symbol__(\"requestAnimationFrame\")]\nexport const rawCancelAnimationFrame = window[__zone_symbol__(\"cancelAnimationFrame\")]\n","import { rawRequestAnimationFrame } from \"./unngzone\"\n\ntype FastDomHandler = () => void\n\nclass _FastDOM {\n #rafId: any\n #mutate: Array<FastDomHandler> = []\n #measure: Array<FastDomHandler> = []\n\n public mutate(handler: FastDomHandler) {\n this.#mutate.push(handler)\n this._schedule()\n }\n\n public mutateNext(handler: FastDomHandler) {\n this.#mutate.push(() => {\n this.#mutate.push(handler)\n })\n this._schedule()\n }\n\n public measure(handler: FastDomHandler) {\n this.#measure.push(handler)\n this._schedule()\n }\n\n public setStyle(el: HTMLElement, style: { [key: string]: any }, chain?: FastDomHandler) {\n this.mutate(() => {\n for (const [k, v] of Object.entries(style)) {\n if (v == null) {\n el.style.removeProperty(k)\n } else {\n el.style.setProperty(k, v)\n }\n }\n\n chain && chain()\n })\n }\n\n public setAttributes(el: HTMLElement, attrs: { [key: string]: any }, chain?: FastDomHandler) {\n this.mutate(() => {\n for (const [k, v] of Object.entries(attrs)) {\n if (v == null) {\n el.removeAttribute(k)\n } else {\n el.setAttribute(k, v)\n }\n }\n\n chain && chain()\n })\n }\n\n private _schedule() {\n if (!this.#rafId) {\n this.#rafId = rawRequestAnimationFrame(this._apply.bind(this))\n }\n }\n\n private _apply() {\n this.#rafId = null\n\n const measure = this.#measure.slice()\n const mutate = this.#mutate.slice()\n this.#measure.length = 0\n this.#mutate.length = 0\n\n runQ(measure)\n runQ(mutate)\n\n if (this.#measure.length || this.#mutate.length) {\n this._schedule()\n }\n }\n}\n\nfunction runQ(items: FastDomHandler[]) {\n let item: FastDomHandler\n while ((item = items.shift()!)) {\n item()\n }\n}\n\nexport const FastDOM = new _FastDOM()\n","import {\n catchError,\n concat,\n concatMap,\n filter,\n forkJoin,\n from,\n map,\n Observable,\n ObservableInput,\n of,\n reduce,\n ReplaySubject,\n scan,\n share,\n shareReplay,\n Subject,\n Subscriber,\n take,\n takeLast,\n takeUntil,\n takeWhile,\n tap,\n throwError\n} from \"rxjs\"\n\nimport { flatten } from \"es-toolkit\"\n\nexport type LifecycleHandler = () => ObservableInput<unknown> | null | undefined | void\n\nexport class StopLifecycle extends Error {}\n\nexport type LifecycleOptions = Record<string, { order?: \"parallel\" | \"sequential\"; cancellable?: boolean }>\n\nexport type LifecycleRemap<A, B> =\n A extends Lifecycle<infer AO, infer AS>\n ? B extends Lifecycle<infer BO, infer BS>\n ? Partial<{ [K in AS]: BS }>\n : never\n : never\n\nexport class Lifecycle<T extends LifecycleOptions, S extends keyof T = keyof T> {\n readonly states: T\n readonly #handlers: Partial<Record<S, Array<LifecycleHandler>>> = {}\n\n readonly #until = new Subject<void>()\n readonly #trigger = new Subject<S>()\n readonly #status = this.#trigger.pipe(\n takeUntil(this.#until),\n scan(\n (result, trigger) => {\n if (!result[trigger]) {\n result[trigger] = this.#run(trigger as S).pipe(\n tap(executed => {\n if (executed === false) {\n delete result[trigger]\n }\n }),\n map(executed => [trigger, !!executed] as [S, boolean]),\n shareReplay(1)\n )\n }\n return result\n },\n {} as Record<S, Observable<[S, boolean]>>\n ),\n concatMap(triggers => {\n const srcs = Object.values(triggers) as Array<Observable<[S, boolean]>>\n return concat(...srcs).pipe(\n takeWhile(([_, executed]) => executed, false),\n reduce(\n (result, [name, executed]) => {\n return { ...result, [name]: executed }\n },\n {} as Record<S, boolean>\n )\n )\n }),\n tap(status => {\n if (this.#handlers == null) {\n return\n }\n\n for (const [k, v] of Object.entries(status)) {\n if (v) {\n delete (this.#handlers as any)[k]\n }\n }\n }),\n share()\n )\n\n readonly status$ = this.#status.pipe(shareReplay(1))\n readonly current$ = new ReplaySubject<S>()\n\n constructor(states: T) {\n this.states = { ...states }\n\n for (const value of Object.values(states)) {\n if (value.order == null) {\n value.order = \"parallel\"\n }\n }\n }\n\n on(state: S, fn: LifecycleHandler) {\n if (state in this.#handlers) {\n this.#handlers[state]!.push(fn)\n } else {\n this.#handlers[state] = [fn]\n }\n\n return () => {\n const idx = this.#handlers[state]!.indexOf(fn)\n if (idx > -1) {\n this.#handlers[state]!.splice(idx, 1)\n }\n }\n }\n\n onExecute(state: S) {\n return this.current$.pipe(\n takeUntil(this.#until),\n filter(current => current === state)\n )\n }\n\n onDone(state: S) {\n return this.status$.pipe(\n filter(status => status[state]),\n take(1)\n )\n }\n\n run(...states: Array<S | S[]>) {\n const flattened = flatten(states).filter((v, i, a) => a.indexOf(v) === i)\n const expectedCount = flattened.length\n return new Observable((dest: Subscriber<void>) => {\n dest.add(\n this.#status.subscribe(currentStatus => {\n const executedCount = Object.entries(currentStatus).reduce(\n (result, [name, done]) => result + (done && flattened.includes(name as S) ? 1 : 0),\n 0\n )\n\n if (executedCount >= expectedCount) {\n dest.next()\n dest.complete()\n }\n })\n )\n\n for (const s of flattened) {\n this.#trigger.next(s as S)\n }\n })\n }\n\n /**\n * Run this state changes on other state\n */\n control<T extends Lifecycle<any, any>>(state: T, remap?: LifecycleRemap<this, T>) {\n const remove: Array<() => void> = []\n\n for (const selfState of Object.keys(this.states)) {\n const otherState = (remap as unknown as any)?.[selfState] || selfState\n if (otherState in state.states) {\n remove.push(this.on(selfState as any, () => state.run(otherState)))\n }\n }\n\n return () => {\n for (const fn of remove) {\n fn()\n }\n }\n }\n\n destroy() {\n ;(this as any).#handlers = null\n this.#until.next()\n this.#until.complete()\n }\n\n #run(state: S) {\n return new Observable((dest: Subscriber<boolean>) => {\n this.current$.next(state)\n\n const handlers = this.#handlers[state]\n if (handlers == null || handlers.length === 0) {\n dest.next(true)\n dest.complete()\n return\n }\n\n const observables: Array<Observable<any>> = handlers.map(handler => {\n const observable = handler()\n if (observable == null) {\n return of(null)\n } else {\n return from(observable)\n }\n })\n\n const config = this.states[state]\n\n if (observables.length === 1) {\n return observables[0].pipe(map(() => true)).subscribe(dest)\n } else if (config.order === \"parallel\") {\n return forkJoin(observables)\n .pipe(map(() => true))\n .subscribe(dest)\n } else if (config.order === \"sequential\") {\n return concat(...observables)\n .pipe(map(() => true))\n .subscribe(dest)\n } else {\n dest.next(true)\n dest.complete()\n }\n\n return\n }).pipe(\n takeLast(1),\n catchError(error => {\n if (error instanceof StopLifecycle) {\n return of(false)\n } else {\n return throwError(() => error)\n }\n })\n )\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_isEqual","isEqual"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,17 +1,344 @@
1
- export { ConnectProtocol } from "./connect-protocol";
2
- export { Destruct, Destructible, IDisposable } from "./destruct";
3
- export { NumberWithUnit, NumberWithUnitInput, UNIT_REGEX, NUMBER_REGEX } from "./number-with-unit";
4
- export { coerceBoolAttr, BooleanInput } from "./coerce/bool-attr";
5
- export { coerceElement, ElementInput, isElementInput } from "./coerce/element";
6
- export * from "./form";
7
- export { rawCancelAnimationFrame, rawClearInterval, rawClearTimeout, rawRequestAnimationFrame, rawSetInterval, rawSetTimeout, __zone_symbol__ } from "./unngzone";
8
- export { FastDOM } from "./dom";
9
- export { Concat } from "./types/concat";
10
- export { Eval, IfAny, IsAny, IfTuple, IsTuple, TupleItems, ObjectKey, MaxRecursion } from "./types/util";
11
- export { Flatten, FlattenKeys } from "./types/flatten";
12
- export { MergeUnion } from "./types/merge-union";
13
- export { NumberRange } from "./types/number-range";
14
- export { Primitive, Builtins, isPrimitive, AsPrimitive, ToPrimitiveMap } from "./types/primitive";
15
- export { DeepReadonly, ReadonlyDate } from "./types/readonly";
16
- export * from "./util";
17
- export * from "./lifecycle";
1
+ import { Observable, ObservableInput, ReplaySubject } from 'rxjs';
2
+ import * as i0 from '@angular/core';
3
+ import { OnDestroy, ElementRef } from '@angular/core';
4
+ import { FormControl } from '@angular/forms';
5
+ import { Primitive } from 'utility-types';
6
+ export { Primitive, isPrimitive } from 'utility-types';
7
+ export { isPlainObject } from 'es-toolkit';
8
+
9
+ /**
10
+ * @example
11
+ * ```ts
12
+ * class Busy implements ConnectProtocol {
13
+ * connect(ob: Observable<any>): Observable<any> {
14
+ * return new Observable(s => {
15
+ * const sub = this.doSomething().subscribe(s)
16
+ * return sub.unsubscribe.bind(sub)
17
+ * })
18
+ * }
19
+ * }
20
+ * ```
21
+ */
22
+ interface ConnectProtocol {
23
+ /**
24
+ * @returns When the observable is unsubscribed, the connect method cleans up everything
25
+ */
26
+ connect(...args: any[]): Observable<unknown>;
27
+ }
28
+
29
+ interface IDisposable {
30
+ dispose(): void;
31
+ }
32
+ declare class Destruct {
33
+ #private;
34
+ readonly on: Observable<void>;
35
+ constructor(fn?: () => void);
36
+ get done(): boolean;
37
+ sub<T>(o: Observable<T>): Observable<T>;
38
+ disposable<T extends IDisposable>(d: T): T;
39
+ node<T extends Node>(el: T): T;
40
+ any(f: () => void): void;
41
+ run(): void;
42
+ }
43
+ declare abstract class Destructible implements OnDestroy, IDisposable {
44
+ /** @ignore */
45
+ readonly d: Destruct;
46
+ /** @ignore */
47
+ ngOnDestroy(): void;
48
+ /** @ignore */
49
+ dispose(): void;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<Destructible, never>;
51
+ static ɵdir: i0.ɵɵDirectiveDeclaration<Destructible, never, never, {}, {}, never, never, true, never>;
52
+ }
53
+
54
+ type NumberWithUnitInput = number | string | NumberWithUnit;
55
+ declare const UNIT_REGEX = "v[h|w|min|max]|p[c|t|x]|[re|e|c|m]m|[l|c]h|%|in|Q|ex|m?s";
56
+ declare const NUMBER_REGEX = "[+-]?(?:\\d*\\.\\d+|\\d+\\.\\d*|\\d+)";
57
+ declare class NumberWithUnit {
58
+ readonly value: number;
59
+ readonly unit?: string | undefined;
60
+ static coerce(value: any, defaultUnit?: string): NumberWithUnit;
61
+ constructor(value: number, unit?: string | undefined);
62
+ toString(): string | undefined;
63
+ }
64
+
65
+ type BooleanInput = string | boolean | null | undefined;
66
+ declare function coerceBoolAttr(value: BooleanInput): boolean;
67
+
68
+ type ElementInput<T extends Element = HTMLElement> = T | ElementRef<T>;
69
+ declare function coerceElement<T>(value: T | ElementRef<T>): T;
70
+ declare function isElementInput(value: any): value is ElementInput;
71
+
72
+ interface ObservableOptions {
73
+ distinct?: boolean;
74
+ destruct?: boolean;
75
+ }
76
+ interface ObservableValueOptions extends ObservableOptions {
77
+ debounce?: number;
78
+ falsyToUndefined?: boolean;
79
+ }
80
+ type FormControlProperties = "valid" | "invalid" | "status" | "pristine" | "dirty" | "touched" | "untouched" | "disabled" | "enabled" | "errors";
81
+ declare const DEFAULT: ObservableOptions;
82
+ declare const VALUE_DEFAULT: ObservableValueOptions;
83
+ declare function fcObservableValue<T, O extends ObservableValueOptions>(fc: FormControl<T>, opts?: O): Observable<O extends {
84
+ falsyToUndefined: true;
85
+ } ? T | null : T>;
86
+ declare function fcObservableProperty<T, P extends FormControlProperties>(fc: FormControl<T>, property: P, opts?: ObservableOptions): Observable<FormControl<T>[P]>;
87
+
88
+ declare function __zone_symbol__<T extends string>(val: T): T;
89
+ declare const rawSetTimeout: ((handler: TimerHandler, timeout?: number, ...arguments: any[]) => number) & typeof setTimeout;
90
+ declare const rawClearTimeout: ((id: number | undefined) => void) & typeof clearTimeout;
91
+ declare const rawSetInterval: ((handler: TimerHandler, timeout?: number, ...arguments: any[]) => number) & typeof setInterval;
92
+ declare const rawClearInterval: ((id: number | undefined) => void) & typeof clearInterval;
93
+ declare const rawRequestAnimationFrame: ((callback: FrameRequestCallback) => number) & typeof requestAnimationFrame;
94
+ declare const rawCancelAnimationFrame: ((handle: number) => void) & typeof cancelAnimationFrame;
95
+
96
+ type FastDomHandler = () => void;
97
+ declare class _FastDOM {
98
+ #private;
99
+ mutate(handler: FastDomHandler): void;
100
+ mutateNext(handler: FastDomHandler): void;
101
+ measure(handler: FastDomHandler): void;
102
+ setStyle(el: HTMLElement, style: {
103
+ [key: string]: any;
104
+ }, chain?: FastDomHandler): void;
105
+ setAttributes(el: HTMLElement, attrs: {
106
+ [key: string]: any;
107
+ }, chain?: FastDomHandler): void;
108
+ private _schedule;
109
+ private _apply;
110
+ }
111
+ declare const FastDOM: _FastDOM;
112
+
113
+ type ConcatTail<SEP extends string, V extends string> = V extends never ? "" : `${SEP}${V}`;
114
+ /**
115
+ * Concatenate strings with separator
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * type C = Concat<".", ["A", "B", "C"]> = "A.B.C"
120
+ * ```
121
+ */
122
+ type Concat<SEP extends string, VALS extends string[]> = VALS extends [
123
+ infer V1 extends string,
124
+ ...infer OV extends string[]
125
+ ] ? OV["length"] extends 0 ? `${V1}` : `${V1}${ConcatTail<SEP, Concat<SEP, OV>>}` : never;
126
+
127
+ type AllKeys<T> = T extends any ? keyof T : never;
128
+ type TypeOfKey<T, TK extends AllKeys<T>> = T extends {
129
+ [K in TK]?: any;
130
+ } ? T[TK] : never;
131
+ type MergeUnion<T> = Eval<{
132
+ [K in AllKeys<T>]: TypeOfKey<T, K>;
133
+ }>;
134
+
135
+ type MaxRecursion = 10;
136
+ type IfAny<O, T, F> = 0 extends 1 & O ? T : F;
137
+ type IsAny<T> = IfAny<T, true, false>;
138
+ type IfTuple<O, T, F, E = never> = O extends Array<any> ? (-1 extends O["length"] ? F : O["length"] extends 0 ? E : T) : F;
139
+ type IsTuple<T, E = never> = IfTuple<T, true, false, E>;
140
+ /**
141
+ * @example
142
+ * ```ts
143
+ * type Tuple = TupleEntries<[1, "ok", false]>
144
+ * Tuple = {0: 1, 1: "ok", 2: false}
145
+ * ```
146
+ */
147
+ type TupleItems<T> = T extends Array<any> ? MergeUnion<_TupleItems<T>> : never;
148
+ type _TupleItems<T extends any[], K extends number[] = [], O extends {
149
+ [key: string]: number;
150
+ } = never> = T["length"] extends K["length"] ? O : _TupleItems<T, [...K, K["length"]], O | {
151
+ [key in K["length"]]: T[K["length"]];
152
+ }>;
153
+ type ObjectKey = string | number | symbol;
154
+ /**
155
+ * Evaulate type expressions
156
+ *
157
+ * ```ts
158
+ * export type KeyOf<T> = Eval<{ [K in keyof T]: T[K] extends never ? never : K }[keyof T]>
159
+ * ```
160
+ */
161
+ type Eval<T> = Array<T>[number];
162
+
163
+ type Builtins = Primitive | Function | Date;
164
+ type ToPrimitiveMap = {
165
+ string: string;
166
+ default: string;
167
+ number: number;
168
+ bigint: bigint;
169
+ boolean: boolean;
170
+ symbol: symbol;
171
+ };
172
+ type AsString<T, P, F = never> = P extends string ? (T extends Primitive ? P : F) : never;
173
+ type HasValueOf<T, P, F = never> = T extends {
174
+ valueOf(): P;
175
+ } ? P : F;
176
+ type HasToPrimitive<T, P, F = never> = T extends {
177
+ [Symbol.toPrimitive](hint: string): P;
178
+ } ? P : F;
179
+ type _AsPrimitive<T, P> = HasToPrimitive<T, P, HasValueOf<T, P, AsString<T, P>>>;
180
+ type AsPrimitive<T> = IsAny<T> extends true ? ToPrimitiveMap[keyof ToPrimitiveMap] : {
181
+ [K in keyof ToPrimitiveMap]: _AsPrimitive<T, ToPrimitiveMap[K]>;
182
+ }[keyof ToPrimitiveMap];
183
+
184
+ type KeyTypes = string | number;
185
+ type FlattenExclude = Function;
186
+ /**
187
+ * @param T - The object witch we want to flatten
188
+ * @param P - The prefix of paths (default: [])
189
+ * @param E - The value excludes (default: Function)
190
+ * @param D - Max depth (default: 10)
191
+ *
192
+ * @example
193
+ * Input type:
194
+ * ```ts
195
+ * interface User {
196
+ * id: number
197
+ * name: string
198
+ * }
199
+ *
200
+ * interface Category {
201
+ * id: number
202
+ * title: string
203
+ * }
204
+ *
205
+ * interface Article {
206
+ * id: number
207
+ * title: string
208
+ * author: User
209
+ * categories: Array<Category>
210
+ * }
211
+ * ```
212
+ *
213
+ * Result type:
214
+ * type F = Flatten<Article> = {
215
+ * "id": number,
216
+ * "title": number,
217
+ * "author.id": number,
218
+ * "author.name": string,
219
+ * "categories.*.id": number,
220
+ * "categories.*.title": string,
221
+ * }
222
+ */
223
+ type Flatten<T, P extends string[] = [], E = FlattenExclude, D extends number = MaxRecursion> = _Flatten<T, E, P, D>;
224
+ type _Flatten<T, E, P extends string[], D extends number> = MergeUnion<_FlattenItem<T, E, P, D>>;
225
+ type _FlattenItem<T, E, P extends string[], D extends number> = P["length"] extends D ? never : T extends E ? never : IsAny<T> extends true ? _Path<T, P> : T extends Builtins ? _Path<T, P> : T extends Array<infer V> ? IsTuple<T> extends true ? _FlattenTuple<T, E, P, D> : _FlattenArray<V, E, P, D> : T extends object ? _FlattenObject<T, E, P, D> : _Path<T, P>;
226
+ type _FlattenTuple<T extends any[], E, P extends string[], D extends number, I = TupleItems<T>> = {
227
+ [K in keyof I]: K extends KeyTypes ? IsAny<I[K]> extends true ? _Path<any, [...P, `${K}`]> : _FlattenItem<I[K], E, [...P, `${K}`], D> : never;
228
+ }[keyof I];
229
+ type _FlattenArray<T, E, P extends string[], D extends number> = IsAny<T> extends true ? _Path<any, [...P, `*.${string}`]> : _FlattenItem<T, E, [...P, "*"], D>;
230
+ type _FlattenObject<T extends object, E, P extends string[], D extends number> = {
231
+ [K in keyof T]-?: K extends KeyTypes ? IsAny<T[K]> extends true ? _Path<any, [...P, `${K}`]> : _FlattenItem<T[K], E, [...P, `${K}`], D> : never;
232
+ }[keyof T];
233
+ type _Path<T, P extends string[]> = P["length"] extends 0 ? never : {
234
+ [key in Concat<".", P>]: T;
235
+ };
236
+ /**
237
+ * @param T - The object witch we want to flatten
238
+ * @param P - The prefix of paths (default: [])
239
+ * @param E - The value excludes (default: Function)
240
+ * @param D - Max depth (default: 10)
241
+ *
242
+ * @example
243
+ * Input type:
244
+ * ```ts
245
+ * interface User {
246
+ * id: number
247
+ * name: string
248
+ * }
249
+ *
250
+ * interface Category {
251
+ * id: number
252
+ * title: string
253
+ * }
254
+ *
255
+ * interface Article {
256
+ * id: number
257
+ * title: string
258
+ * author: User
259
+ * categories: Array<Category>
260
+ * }
261
+ * ```
262
+ *
263
+ * Result type:
264
+ * type FK = FlattenKeys<Article> =
265
+ * | "id"
266
+ * | "title"
267
+ * | "author.id"
268
+ * | "author.name"
269
+ * | "categories.*.id"
270
+ * | "categories.*.title"
271
+ */
272
+ type FlattenKeys<T, P extends string[] = [], E = FlattenExclude, D extends number = MaxRecursion> = keyof Flatten<T, P, E, D>;
273
+
274
+ type Enumerate<N extends number, Acc extends number[] = []> = Acc["length"] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc["length"]]>;
275
+ /**
276
+ * type XY = NumberRange<0, 10>
277
+ */
278
+ type NumberRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
279
+
280
+ type DeepReadonly<T, D extends number = MaxRecursion> = _DeepReadonly<T, [], D>;
281
+ type _DeepReadonly<T, P extends number[], D extends number> = P["length"] extends D ? never : IsAny<T> extends true ? any : T extends Primitive | ((...args: any[]) => any) ? T : T extends Date ? ReadonlyDate : T extends Array<infer V> ? IsTuple<T> extends true ? _DeepReadonlyTuple<T, P, D> : _DeepReadonlyArray<V, P, D> : T extends Map<infer MK, infer MV> ? _DeepReadonlyMap<MK, MV, P, D> : T extends Set<infer V> ? _DeepReadonlySet<V, P, D> : T extends object ? _DeepReadonlyObject<T, P, D> : T;
282
+ type _DeepReadonlyTuple<T extends any[], P extends number[], D extends number> = _ReadonlyTuple<T, [], [], P, D>;
283
+ type _ReadonlyTuple<T extends any[], K extends number[], R extends readonly any[], P extends number[], D extends number> = T["length"] extends K["length"] ? R : _ReadonlyTuple<T, [...K, K["length"]], readonly [...R, _DeepReadonly<T[K["length"]], [...P, 0], D>], P, D>;
284
+ type _DeepReadonlyArray<T, P extends number[], D extends number> = ReadonlyArray<IsAny<T> extends true ? any : _DeepReadonly<T, [...P, 0], D>>;
285
+ type _DeepReadonlyObject<T extends object, P extends number[], D extends number> = {
286
+ readonly [K in keyof T]: IsAny<T[K]> extends true ? any : _DeepReadonly<T[K], [...P, 0], D>;
287
+ };
288
+ type _DeepReadonlyMap<K, V, P extends number[], D extends number> = ReadonlyMap<K, _DeepReadonly<V, [...P, 0], D>>;
289
+ type _DeepReadonlySet<V, P extends number[], D extends number> = ReadonlySet<_DeepReadonly<V, [...P, 0], D>>;
290
+ type ReadonlyDate = Omit<Date, "setTime" | "setMilliseconds" | "setUTCMilliseconds" | "setSeconds" | "setUTCSeconds" | "setMinutes" | "setUTCMinutes" | "setHours" | "setUTCHours" | "setDate" | "setUTCDate" | "setMonth" | "setUTCMonth" | "setFullYear" | "setUTCFullYear">;
291
+
292
+ declare const deepClone: <T>(obj: T) => T;
293
+
294
+ declare const isEqual: <A, B extends A>(a: A, b: B) => a is B;
295
+ declare function isEqualStrict<A, B extends A>(a: A, b: B): a is B;
296
+ declare function deepFreeze<T>(obj: T): DeepReadonly<T>;
297
+ /**
298
+ * @example
299
+ * ```ts
300
+ * toSorted([{id: 1}, {id: 2}, {id: 3}], sortBy([{id: "desc"}]))
301
+ * ```
302
+ */
303
+ declare function toSorted<T>(items: readonly T[], fn: (a: T, b: T) => number): T[];
304
+ type FalsyIfNull<O> = O extends null ? null : never;
305
+ type FalsyIfUndefined<O> = O extends undefined ? undefined : never;
306
+ type FalsyIfBool<O> = O extends boolean ? false : never;
307
+ type FalsyIfString<O> = O extends string ? "" : never;
308
+ type FalsyIfNumber<O> = O extends number ? 0 : never;
309
+ type FalsyIfTuple<O> = IfTuple<O, O, never, never>;
310
+ type FalsyIfAny<O> = IfAny<O, O, never>;
311
+ type IsFalsy<O> = FalsyIfNull<O> | FalsyIfUndefined<O> | FalsyIfBool<O> | FalsyIfString<O> | FalsyIfNumber<O> | FalsyIfTuple<O> | FalsyIfAny<O>;
312
+ declare function isFalsy<T>(value: T): value is IsFalsy<T> & T;
313
+ type IsTruthy<T> = Exclude<T, undefined | null | false | "" | 0>;
314
+ declare function isTruthy<T>(value: T): value is IsTruthy<T>;
315
+
316
+ type LifecycleHandler = () => ObservableInput<unknown> | null | undefined | void;
317
+ declare class StopLifecycle extends Error {
318
+ }
319
+ type LifecycleOptions = Record<string, {
320
+ order?: "parallel" | "sequential";
321
+ cancellable?: boolean;
322
+ }>;
323
+ type LifecycleRemap<A, B> = A extends Lifecycle<infer AO, infer AS> ? B extends Lifecycle<infer BO, infer BS> ? Partial<{
324
+ [K in AS]: BS;
325
+ }> : never : never;
326
+ declare class Lifecycle<T extends LifecycleOptions, S extends keyof T = keyof T> {
327
+ #private;
328
+ readonly states: T;
329
+ readonly status$: Observable<Record<S, boolean>>;
330
+ readonly current$: ReplaySubject<S>;
331
+ constructor(states: T);
332
+ on(state: S, fn: LifecycleHandler): () => void;
333
+ onExecute(state: S): Observable<S>;
334
+ onDone(state: S): Observable<Record<S, boolean>>;
335
+ run(...states: Array<S | S[]>): Observable<void>;
336
+ /**
337
+ * Run this state changes on other state
338
+ */
339
+ control<T extends Lifecycle<any, any>>(state: T, remap?: LifecycleRemap<this, T>): () => void;
340
+ destroy(): void;
341
+ }
342
+
343
+ export { DEFAULT, Destruct, Destructible, FastDOM, Lifecycle, NUMBER_REGEX, NumberWithUnit, StopLifecycle, UNIT_REGEX, VALUE_DEFAULT, __zone_symbol__, coerceBoolAttr, coerceElement, deepClone, deepFreeze, fcObservableProperty, fcObservableValue, isElementInput, isEqual, isEqualStrict, isFalsy, isTruthy, rawCancelAnimationFrame, rawClearInterval, rawClearTimeout, rawRequestAnimationFrame, rawSetInterval, rawSetTimeout, toSorted };
344
+ export type { AsPrimitive, BooleanInput, Builtins, Concat, ConnectProtocol, DeepReadonly, ElementInput, Eval, Flatten, FlattenKeys, FormControlProperties, IDisposable, IfAny, IfTuple, IsAny, IsFalsy, IsTruthy, IsTuple, LifecycleHandler, LifecycleOptions, LifecycleRemap, MaxRecursion, MergeUnion, NumberRange, NumberWithUnitInput, ObjectKey, ObservableOptions, ObservableValueOptions, ReadonlyDate, ToPrimitiveMap, TupleItems };
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@ngutil/common",
3
- "version": "0.0.102",
3
+ "version": "0.0.104",
4
4
  "peerDependencies": {
5
- "@angular/cdk": "19.2.11",
6
- "@angular/core": "19.2.8",
5
+ "@angular/cdk": "20.2.14",
6
+ "@angular/core": "20.3.13",
7
7
  "es-toolkit": "^1.35.0",
8
8
  "rxjs": "^7.8.1",
9
9
  "utility-types": "^3.11.0"
@@ -1,2 +0,0 @@
1
- export type BooleanInput = string | boolean | null | undefined;
2
- export declare function coerceBoolAttr(value: BooleanInput): boolean;
@@ -1,4 +0,0 @@
1
- import { ElementRef } from "@angular/core";
2
- export type ElementInput<T extends Element = HTMLElement> = T | ElementRef<T>;
3
- export declare function coerceElement<T>(value: T | ElementRef<T>): T;
4
- export declare function isElementInput(value: any): value is ElementInput;
@@ -1,20 +0,0 @@
1
- import { Observable } from "rxjs";
2
- /**
3
- * @example
4
- * ```ts
5
- * class Busy implements ConnectProtocol {
6
- * connect(ob: Observable<any>): Observable<any> {
7
- * return new Observable(s => {
8
- * const sub = this.doSomething().subscribe(s)
9
- * return sub.unsubscribe.bind(sub)
10
- * })
11
- * }
12
- * }
13
- * ```
14
- */
15
- export interface ConnectProtocol {
16
- /**
17
- * @returns When the observable is unsubscribed, the connect method cleans up everything
18
- */
19
- connect(...args: any[]): Observable<unknown>;
20
- }
package/destruct.d.ts DELETED
@@ -1,27 +0,0 @@
1
- import { OnDestroy } from "@angular/core";
2
- import { Observable } from "rxjs";
3
- import * as i0 from "@angular/core";
4
- export interface IDisposable {
5
- dispose(): void;
6
- }
7
- export declare class Destruct {
8
- #private;
9
- readonly on: Observable<void>;
10
- constructor(fn?: () => void);
11
- get done(): boolean;
12
- sub<T>(o: Observable<T>): Observable<T>;
13
- disposable<T extends IDisposable>(d: T): T;
14
- node<T extends Node>(el: T): T;
15
- any(f: () => void): void;
16
- run(): void;
17
- }
18
- export declare abstract class Destructible implements OnDestroy, IDisposable {
19
- /** @ignore */
20
- readonly d: Destruct;
21
- /** @ignore */
22
- ngOnDestroy(): void;
23
- /** @ignore */
24
- dispose(): void;
25
- static ɵfac: i0.ɵɵFactoryDeclaration<Destructible, never>;
26
- static ɵdir: i0.ɵɵDirectiveDeclaration<Destructible, never, never, {}, {}, never, never, true, never>;
27
- }
package/dom.d.ts DELETED
@@ -1,17 +0,0 @@
1
- type FastDomHandler = () => void;
2
- declare class _FastDOM {
3
- #private;
4
- mutate(handler: FastDomHandler): void;
5
- mutateNext(handler: FastDomHandler): void;
6
- measure(handler: FastDomHandler): void;
7
- setStyle(el: HTMLElement, style: {
8
- [key: string]: any;
9
- }, chain?: FastDomHandler): void;
10
- setAttributes(el: HTMLElement, attrs: {
11
- [key: string]: any;
12
- }, chain?: FastDomHandler): void;
13
- private _schedule;
14
- private _apply;
15
- }
16
- export declare const FastDOM: _FastDOM;
17
- export {};
package/form/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./observable";
@@ -1,17 +0,0 @@
1
- import { FormControl } from "@angular/forms";
2
- import { Observable } from "rxjs";
3
- export interface ObservableOptions {
4
- distinct?: boolean;
5
- destruct?: boolean;
6
- }
7
- export interface ObservableValueOptions extends ObservableOptions {
8
- debounce?: number;
9
- falsyToUndefined?: boolean;
10
- }
11
- export type FormControlProperties = "valid" | "invalid" | "status" | "pristine" | "dirty" | "touched" | "untouched" | "disabled" | "enabled" | "errors";
12
- export declare const DEFAULT: ObservableOptions;
13
- export declare const VALUE_DEFAULT: ObservableValueOptions;
14
- export declare function fcObservableValue<T, O extends ObservableValueOptions>(fc: FormControl<T>, opts?: O): Observable<O extends {
15
- falsyToNull: true;
16
- } ? T | null : T>;
17
- export declare function fcObservableProperty<T, P extends FormControlProperties>(fc: FormControl<T>, property: P, opts?: ObservableOptions): Observable<FormControl<T>[P]>;
package/lifecycle.d.ts DELETED
@@ -1,27 +0,0 @@
1
- import { Observable, ObservableInput, ReplaySubject } from "rxjs";
2
- export type LifecycleHandler = () => ObservableInput<unknown> | null | undefined | void;
3
- export declare class StopLifecycle extends Error {
4
- }
5
- export type LifecycleOptions = Record<string, {
6
- order?: "parallel" | "sequential";
7
- cancellable?: boolean;
8
- }>;
9
- export type LifecycleRemap<A, B> = A extends Lifecycle<infer AO, infer AS> ? B extends Lifecycle<infer BO, infer BS> ? Partial<{
10
- [K in AS]: BS;
11
- }> : never : never;
12
- export declare class Lifecycle<T extends LifecycleOptions, S extends keyof T = keyof T> {
13
- #private;
14
- readonly states: T;
15
- readonly status$: Observable<Record<S, boolean>>;
16
- readonly current$: ReplaySubject<S>;
17
- constructor(states: T);
18
- on(state: S, fn: LifecycleHandler): () => void;
19
- onExecute(state: S): Observable<S>;
20
- onDone(state: S): Observable<Record<S, boolean>>;
21
- run(...states: Array<S | S[]>): Observable<void>;
22
- /**
23
- * Run this state changes on other state
24
- */
25
- control<T extends Lifecycle<any, any>>(state: T, remap?: LifecycleRemap<this, T>): () => void;
26
- destroy(): void;
27
- }
@@ -1,10 +0,0 @@
1
- export type NumberWithUnitInput = number | string | NumberWithUnit;
2
- export declare const UNIT_REGEX = "v[h|w|min|max]|p[c|t|x]|[re|e|c|m]m|[l|c]h|%|in|Q|ex|m?s";
3
- export declare const NUMBER_REGEX = "[+-]?(?:\\d*\\.\\d+|\\d+\\.\\d*|\\d+)";
4
- export declare class NumberWithUnit {
5
- readonly value: number;
6
- readonly unit?: string | undefined;
7
- static coerce(value: any, defaultUnit?: string): NumberWithUnit;
8
- constructor(value: number, unit?: string | undefined);
9
- toString(): string | undefined;
10
- }
package/types/concat.d.ts DELETED
@@ -1,14 +0,0 @@
1
- type ConcatTail<SEP extends string, V extends string> = V extends never ? "" : `${SEP}${V}`;
2
- /**
3
- * Concatenate strings with separator
4
- *
5
- * @example
6
- * ```ts
7
- * type C = Concat<".", ["A", "B", "C"]> = "A.B.C"
8
- * ```
9
- */
10
- export type Concat<SEP extends string, VALS extends string[]> = VALS extends [
11
- infer V1 extends string,
12
- ...infer OV extends string[]
13
- ] ? OV["length"] extends 0 ? `${V1}` : `${V1}${ConcatTail<SEP, Concat<SEP, OV>>}` : never;
14
- export {};
@@ -1,94 +0,0 @@
1
- import { Concat } from "./concat";
2
- import { MergeUnion } from "./merge-union";
3
- import { Builtins } from "./primitive";
4
- import { IsAny, IsTuple, MaxRecursion, TupleItems } from "./util";
5
- type KeyTypes = string | number;
6
- export type FlattenExclude = Function;
7
- /**
8
- * @param T - The object witch we want to flatten
9
- * @param P - The prefix of paths (default: [])
10
- * @param E - The value excludes (default: Function)
11
- * @param D - Max depth (default: 10)
12
- *
13
- * @example
14
- * Input type:
15
- * ```ts
16
- * interface User {
17
- * id: number
18
- * name: string
19
- * }
20
- *
21
- * interface Category {
22
- * id: number
23
- * title: string
24
- * }
25
- *
26
- * interface Article {
27
- * id: number
28
- * title: string
29
- * author: User
30
- * categories: Array<Category>
31
- * }
32
- * ```
33
- *
34
- * Result type:
35
- * type F = Flatten<Article> = {
36
- * "id": number,
37
- * "title": number,
38
- * "author.id": number,
39
- * "author.name": string,
40
- * "categories.*.id": number,
41
- * "categories.*.title": string,
42
- * }
43
- */
44
- export type Flatten<T, P extends string[] = [], E = FlattenExclude, D extends number = MaxRecursion> = _Flatten<T, E, P, D>;
45
- type _Flatten<T, E, P extends string[], D extends number> = MergeUnion<_FlattenItem<T, E, P, D>>;
46
- type _FlattenItem<T, E, P extends string[], D extends number> = P["length"] extends D ? never : T extends E ? never : IsAny<T> extends true ? _Path<T, P> : T extends Builtins ? _Path<T, P> : T extends Array<infer V> ? IsTuple<T> extends true ? _FlattenTuple<T, E, P, D> : _FlattenArray<V, E, P, D> : T extends object ? _FlattenObject<T, E, P, D> : _Path<T, P>;
47
- type _FlattenTuple<T extends any[], E, P extends string[], D extends number, I = TupleItems<T>> = {
48
- [K in keyof I]: K extends KeyTypes ? IsAny<I[K]> extends true ? _Path<any, [...P, `${K}`]> : _FlattenItem<I[K], E, [...P, `${K}`], D> : never;
49
- }[keyof I];
50
- type _FlattenArray<T, E, P extends string[], D extends number> = IsAny<T> extends true ? _Path<any, [...P, `*.${string}`]> : _FlattenItem<T, E, [...P, "*"], D>;
51
- type _FlattenObject<T extends object, E, P extends string[], D extends number> = {
52
- [K in keyof T]-?: K extends KeyTypes ? IsAny<T[K]> extends true ? _Path<any, [...P, `${K}`]> : _FlattenItem<T[K], E, [...P, `${K}`], D> : never;
53
- }[keyof T];
54
- type _Path<T, P extends string[]> = P["length"] extends 0 ? never : {
55
- [key in Concat<".", P>]: T;
56
- };
57
- /**
58
- * @param T - The object witch we want to flatten
59
- * @param P - The prefix of paths (default: [])
60
- * @param E - The value excludes (default: Function)
61
- * @param D - Max depth (default: 10)
62
- *
63
- * @example
64
- * Input type:
65
- * ```ts
66
- * interface User {
67
- * id: number
68
- * name: string
69
- * }
70
- *
71
- * interface Category {
72
- * id: number
73
- * title: string
74
- * }
75
- *
76
- * interface Article {
77
- * id: number
78
- * title: string
79
- * author: User
80
- * categories: Array<Category>
81
- * }
82
- * ```
83
- *
84
- * Result type:
85
- * type FK = FlattenKeys<Article> =
86
- * | "id"
87
- * | "title"
88
- * | "author.id"
89
- * | "author.name"
90
- * | "categories.*.id"
91
- * | "categories.*.title"
92
- */
93
- export type FlattenKeys<T, P extends string[] = [], E = FlattenExclude, D extends number = MaxRecursion> = keyof Flatten<T, P, E, D>;
94
- export {};
@@ -1,9 +0,0 @@
1
- import { Eval } from "./util";
2
- type AllKeys<T> = T extends any ? keyof T : never;
3
- type TypeOfKey<T, TK extends AllKeys<T>> = T extends {
4
- [K in TK]?: any;
5
- } ? T[TK] : never;
6
- export type MergeUnion<T> = Eval<{
7
- [K in AllKeys<T>]: TypeOfKey<T, K>;
8
- }>;
9
- export {};
@@ -1,6 +0,0 @@
1
- type Enumerate<N extends number, Acc extends number[] = []> = Acc["length"] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc["length"]]>;
2
- /**
3
- * type XY = NumberRange<0, 10>
4
- */
5
- export type NumberRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
6
- export {};
@@ -1,23 +0,0 @@
1
- import { isPrimitive, Primitive } from "utility-types";
2
- import { IsAny } from "./util";
3
- export { Primitive, isPrimitive };
4
- export type Builtins = Primitive | Function | Date;
5
- export type ToPrimitiveMap = {
6
- string: string;
7
- default: string;
8
- number: number;
9
- bigint: bigint;
10
- boolean: boolean;
11
- symbol: symbol;
12
- };
13
- type AsString<T, P, F = never> = P extends string ? (T extends Primitive ? P : F) : never;
14
- type HasValueOf<T, P, F = never> = T extends {
15
- valueOf(): P;
16
- } ? P : F;
17
- type HasToPrimitive<T, P, F = never> = T extends {
18
- [Symbol.toPrimitive](hint: string): P;
19
- } ? P : F;
20
- type _AsPrimitive<T, P> = HasToPrimitive<T, P, HasValueOf<T, P, AsString<T, P>>>;
21
- export type AsPrimitive<T> = IsAny<T> extends true ? ToPrimitiveMap[keyof ToPrimitiveMap] : {
22
- [K in keyof ToPrimitiveMap]: _AsPrimitive<T, ToPrimitiveMap[K]>;
23
- }[keyof ToPrimitiveMap];
@@ -1,14 +0,0 @@
1
- import { Primitive } from "./primitive";
2
- import { IsAny, IsTuple, MaxRecursion } from "./util";
3
- export type DeepReadonly<T, D extends number = MaxRecursion> = _DeepReadonly<T, [], D>;
4
- type _DeepReadonly<T, P extends number[], D extends number> = P["length"] extends D ? never : IsAny<T> extends true ? any : T extends Primitive | ((...args: any[]) => any) ? T : T extends Date ? ReadonlyDate : T extends Array<infer V> ? IsTuple<T> extends true ? _DeepReadonlyTuple<T, P, D> : _DeepReadonlyArray<V, P, D> : T extends Map<infer MK, infer MV> ? _DeepReadonlyMap<MK, MV, P, D> : T extends Set<infer V> ? _DeepReadonlySet<V, P, D> : T extends object ? _DeepReadonlyObject<T, P, D> : T;
5
- type _DeepReadonlyTuple<T extends any[], P extends number[], D extends number> = _ReadonlyTuple<T, [], [], P, D>;
6
- type _ReadonlyTuple<T extends any[], K extends number[], R extends readonly any[], P extends number[], D extends number> = T["length"] extends K["length"] ? R : _ReadonlyTuple<T, [...K, K["length"]], readonly [...R, _DeepReadonly<T[K["length"]], [...P, 0], D>], P, D>;
7
- type _DeepReadonlyArray<T, P extends number[], D extends number> = ReadonlyArray<IsAny<T> extends true ? any : _DeepReadonly<T, [...P, 0], D>>;
8
- type _DeepReadonlyObject<T extends object, P extends number[], D extends number> = {
9
- readonly [K in keyof T]: IsAny<T[K]> extends true ? any : _DeepReadonly<T[K], [...P, 0], D>;
10
- };
11
- type _DeepReadonlyMap<K, V, P extends number[], D extends number> = ReadonlyMap<K, _DeepReadonly<V, [...P, 0], D>>;
12
- type _DeepReadonlySet<V, P extends number[], D extends number> = ReadonlySet<_DeepReadonly<V, [...P, 0], D>>;
13
- export type ReadonlyDate = Omit<Date, "setTime" | "setMilliseconds" | "setUTCMilliseconds" | "setSeconds" | "setUTCSeconds" | "setMinutes" | "setUTCMinutes" | "setHours" | "setUTCHours" | "setDate" | "setUTCDate" | "setMonth" | "setUTCMonth" | "setFullYear" | "setUTCFullYear">;
14
- export {};
package/types/util.d.ts DELETED
@@ -1,29 +0,0 @@
1
- import { MergeUnion } from "./merge-union";
2
- export type MaxRecursion = 10;
3
- export type IfAny<O, T, F> = 0 extends 1 & O ? T : F;
4
- export type IsAny<T> = IfAny<T, true, false>;
5
- export type IfTuple<O, T, F, E = never> = O extends Array<any> ? (-1 extends O["length"] ? F : O["length"] extends 0 ? E : T) : F;
6
- export type IsTuple<T, E = never> = IfTuple<T, true, false, E>;
7
- /**
8
- * @example
9
- * ```ts
10
- * type Tuple = TupleEntries<[1, "ok", false]>
11
- * Tuple = {0: 1, 1: "ok", 2: false}
12
- * ```
13
- */
14
- export type TupleItems<T> = T extends Array<any> ? MergeUnion<_TupleItems<T>> : never;
15
- type _TupleItems<T extends any[], K extends number[] = [], O extends {
16
- [key: string]: number;
17
- } = never> = T["length"] extends K["length"] ? O : _TupleItems<T, [...K, K["length"]], O | {
18
- [key in K["length"]]: T[K["length"]];
19
- }>;
20
- export type ObjectKey = string | number | symbol;
21
- /**
22
- * Evaulate type expressions
23
- *
24
- * ```ts
25
- * export type KeyOf<T> = Eval<{ [K in keyof T]: T[K] extends never ? never : K }[keyof T]>
26
- * ```
27
- */
28
- export type Eval<T> = Array<T>[number];
29
- export {};
package/unngzone.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export declare const Zone: any;
2
- export declare function __zone_symbol__<T extends string>(val: T): T;
3
- export declare const rawSetTimeout: ((handler: TimerHandler, timeout?: number, ...arguments: any[]) => number) & typeof setTimeout;
4
- export declare const rawClearTimeout: ((id: number | undefined) => void) & typeof clearTimeout;
5
- export declare const rawSetInterval: ((handler: TimerHandler, timeout?: number, ...arguments: any[]) => number) & typeof setInterval;
6
- export declare const rawClearInterval: ((id: number | undefined) => void) & typeof clearInterval;
7
- export declare const rawRequestAnimationFrame: ((callback: FrameRequestCallback) => number) & typeof requestAnimationFrame;
8
- export declare const rawCancelAnimationFrame: ((handle: number) => void) & typeof cancelAnimationFrame;
package/util.d.ts DELETED
@@ -1,26 +0,0 @@
1
- import { isPlainObject } from "es-toolkit";
2
- import { DeepReadonly } from "./types/readonly";
3
- import { IfAny, IfTuple } from "./types/util";
4
- export declare const deepClone: <T>(obj: T) => T;
5
- export { isPlainObject };
6
- export declare const isEqual: <A, B extends A>(a: A, b: B) => a is B;
7
- export declare function isEqualStrict<A, B extends A>(a: A, b: B): a is B;
8
- export declare function deepFreeze<T>(obj: T): DeepReadonly<T>;
9
- /**
10
- * @example
11
- * ```ts
12
- * toSorted([{id: 1}, {id: 2}, {id: 3}], sortBy([{id: "desc"}]))
13
- * ```
14
- */
15
- export declare function toSorted<T>(items: readonly T[], fn: (a: T, b: T) => number): T[];
16
- type FalsyIfNull<O> = O extends null ? null : never;
17
- type FalsyIfUndefined<O> = O extends undefined ? undefined : never;
18
- type FalsyIfBool<O> = O extends boolean ? false : never;
19
- type FalsyIfString<O> = O extends string ? "" : never;
20
- type FalsyIfNumber<O> = O extends number ? 0 : never;
21
- type FalsyIfTuple<O> = IfTuple<O, O, never, never>;
22
- type FalsyIfAny<O> = IfAny<O, O, never>;
23
- export type IsFalsy<O> = FalsyIfNull<O> | FalsyIfUndefined<O> | FalsyIfBool<O> | FalsyIfString<O> | FalsyIfNumber<O> | FalsyIfTuple<O> | FalsyIfAny<O>;
24
- export declare function isFalsy<T>(value: T): value is IsFalsy<T> & T;
25
- export type IsTruthy<T> = Exclude<T, undefined | null | false | "" | 0>;
26
- export declare function isTruthy<T>(value: T): value is IsTruthy<T>;