@lejdar/webdev 0.0.5 → 0.0.6

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.
@@ -0,0 +1,11 @@
1
+ import { Get, Paths } from "../util/paths";
2
+ import { Merge, Values } from "../util/ts";
3
+ export declare class BrainContext<Brain = any, C = unknown> {
4
+ // @ts-ignore
5
+ context: C;
6
+ // @ts-ignore
7
+ brain: Brain;
8
+ }
9
+ export type ContextOf<T> = Merge<Values<{
10
+ [path in Paths<T> & string]: Get<T, path> extends BrainContext<any, infer C> ? unknown extends C ? {} : C : {};
11
+ }>>;
@@ -0,0 +1,7 @@
1
+ import { DeepPartial } from "../util/ts";
2
+ import { BrainConstructor } from "./brain-implementor";
3
+ export declare function BrainDeveloper<Base, Development = DeepPartial<Base>>(): {
4
+ <Options>(base: BrainConstructor<Base, Options>, development: BrainConstructor<Development, Options>): BrainConstructor<Base, Options>;
5
+ <Options>(base: BrainConstructor<Base, Options>, development: BrainConstructor<Development, Options>, initialize: () => Options): new (options?: {} | undefined) => Base;
6
+ <Context, Options>(base: BrainConstructor<Base, Context>, development: BrainConstructor<Development, Context>, initialize: (options: Options) => Context): BrainConstructor<Base, Options>;
7
+ };
@@ -0,0 +1,11 @@
1
+ import { ContextOf } from "./brain-context";
2
+ export type BrainConstructor<Base, Options> = {} extends Options ? {
3
+ new (options?: Options): Base;
4
+ } : {
5
+ new (options: Options): Base;
6
+ };
7
+ export declare function BrainImplementor<Base>(): {
8
+ <Implementation extends Base, Options>(implement: (options: Options) => Implementation): BrainConstructor<Base, Options & ContextOf<Implementation>>;
9
+ <Implementation extends Base, Options>(implement: (options: Options) => Implementation, initialize: () => ContextOf<Implementation>): BrainConstructor<Base, Options>;
10
+ <Implementation extends Base, Options, Initialization>(implement: (options: Options) => Implementation, initialize: (options: Initialization) => ContextOf<Implementation>): BrainConstructor<Base, Options & Initialization>;
11
+ };
@@ -0,0 +1,2 @@
1
+ import { type Paths, type Get } from "../util/paths";
2
+ export type BrainModule<Brain, Module extends Paths<Brain>> = Get<Brain, Module>;
@@ -0,0 +1,5 @@
1
+ export * from "./brain-context";
2
+ export * from "./brain-module";
3
+ export type * from "./brain-module";
4
+ export * from "./brain-implementor";
5
+ export * from "./brain-developer";
@@ -0,0 +1,6 @@
1
+ export * from './react/react';
2
+ export * from './primitives/primitives';
3
+ export * from './interface/interface';
4
+ export * from './util/util';
5
+ export * from './brain/brain';
6
+ export * from './reactive/reactive';
@@ -0,0 +1,3 @@
1
+ export * from "./result";
2
+ export * from "./operations";
3
+ export * from "./use-result";
@@ -0,0 +1,37 @@
1
+ import { Result, $Result } from "./result";
2
+ export type Query<T, E> = Result<T, E>;
3
+ export type QueryFn<T, E, Arg = never> = (arg: Arg) => Query<T, E>;
4
+ export type ActionFn<P extends any[], T, E> = (...payload: P) => Promise<$Result<T, E>>;
5
+ export type Action<P extends any[], T, E> = readonly [
6
+ ActionFn<P, T, E>,
7
+ Result<T, E> | undefined,
8
+ {
9
+ isLoading: boolean;
10
+ }
11
+ ];
12
+ export type ResetableAction<P extends any[], T, E> = readonly [
13
+ ActionFn<P, T, E>,
14
+ Result<T, E> | undefined,
15
+ {
16
+ reset: () => void;
17
+ isLoading: boolean;
18
+ }
19
+ ];
20
+ export declare function useAction<P extends any[], T, E>(mutateFn: (...payload: P) => Promise<Result<T, E>>, deps: any[]): ResetableAction<P, T, E>;
21
+ export type Pagination = {
22
+ limit: number;
23
+ };
24
+ export type PageLoadingState = {
25
+ isLoading: true;
26
+ } | {
27
+ isLoading: false;
28
+ hasMorePages: boolean;
29
+ };
30
+ export type PaginatedQuery<T, E, Arg = never> = (arg: Arg) => readonly [
31
+ T[],
32
+ {
33
+ loadNextPage(): void;
34
+ loadingState: Result<PageLoadingState, E>;
35
+ }
36
+ ];
37
+ export type UsePaginatedQuery<T, E, Arg = never> = (pagination: Pagination, ...arg: [Arg] extends [never] ? [] : [Arg]) => PaginatedQuery<T, E>;
@@ -0,0 +1,51 @@
1
+ import { Await } from "../util/ts";
2
+ export type Result<T, E> = Result.Ok<T> | Result.Fail<E>;
3
+ export type $Result<T, E> = $Result.Ok<T> | $Result.Fail<E>;
4
+ export declare namespace $Result {
5
+ type Fail<E> = {
6
+ ok: false;
7
+ error: E;
8
+ data?: never;
9
+ };
10
+ type Ok<T> = {
11
+ ok: true;
12
+ error?: never;
13
+ data: T;
14
+ };
15
+ }
16
+ export declare namespace Result {
17
+ type Ok<T> = $Result.Ok<T> & {
18
+ result: Ok<T>;
19
+ serialized: $Result.Ok<T>;
20
+ };
21
+ const ok: <T>(data: T) => {
22
+ ok: true;
23
+ data: T;
24
+ serialized: {
25
+ ok: true;
26
+ data: T;
27
+ };
28
+ readonly result: Ok<T>;
29
+ };
30
+ type Fail<E> = $Result.Fail<E> & {
31
+ result: Fail<E>;
32
+ serialized: $Result.Fail<E>;
33
+ };
34
+ const fail: <E>(error: E) => {
35
+ ok: false;
36
+ error: E;
37
+ serialized: {
38
+ ok: false;
39
+ error: E;
40
+ };
41
+ readonly result: Fail<E>;
42
+ };
43
+ type DataOf<R> = Await<R> & {
44
+ ok: true;
45
+ } extends Ok<infer T> ? T : never;
46
+ type ErrorOf<R> = Await<R> & {
47
+ ok: false;
48
+ } extends Fail<infer E> ? E : never;
49
+ const backlink: <T, E>(result: $Result<T, E>) => Result<T, E>;
50
+ }
51
+ export * from "./use-result";
@@ -0,0 +1,12 @@
1
+ import { Result } from "./result";
2
+ type UseResultHooks<T, E> = {
3
+ success(data: T): Result.Ok<T>;
4
+ error(error: E): Result.Fail<E>;
5
+ set(result: Result<T, E>): Result<T, E>;
6
+ reset(): void;
7
+ };
8
+ export declare function useResult<T, E>(initial: Result<T, E>): [Result<T, E>, UseResultHooks<T, E>];
9
+ export declare function useOptionalResult<T, E>(initial?: Result<T, E>): [Result<T, E> | undefined, UseResultHooks<T, E> & {
10
+ reset: () => void;
11
+ }];
12
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare function generate<T>(length: number, map: (index: number) => T): T[];
2
+ export declare function haveEqualItems<T>(a1: T[], a2: T[], eqauls?: (i1: T, i2: T) => boolean): boolean;
3
+ export declare function arraify<T>(item: T | T[] | readonly T[]): T[];
4
+ export declare function groupBy<T>(items: T[], group: (item: T) => any): T[][];
@@ -0,0 +1,11 @@
1
+ export type Key<T> = Exclude<keyof T, symbol> & string;
2
+ export declare function keys<T>(o: T): Key<T>[];
3
+ export type Value<T> = T[Key<T>];
4
+ export declare function values<T>(o: T): Value<T>[];
5
+ export type Entry<T> = Exclude<{
6
+ [key in keyof T]: [key, T[key]];
7
+ }[Exclude<keyof T, undefined>], undefined>;
8
+ export declare function entries<T extends object>(o: T): Entry<T>[];
9
+ export declare function fromEntries<T>(entries: Entry<T>[]): T;
10
+ export declare function isPOJO(o: unknown): o is object;
11
+ export declare function construct<T>(constructor: (this: T) => void): T;
@@ -0,0 +1,2 @@
1
+ export * from "./array";
2
+ export * from "./object";
@@ -0,0 +1,14 @@
1
+ type Recursion<T> = T | Recursion<T>[];
2
+ export type ClassNames = Recursion<Recursion<string> | null | undefined | false>;
3
+ export type ClassNameProp<P = {}> = Omit<P, "className"> & {
4
+ className?: ClassNames;
5
+ };
6
+ export default function cn(...names: ClassNames[]): string;
7
+ type Variants<Variant extends string> = Partial<Record<Variant, ClassNames>>;
8
+ type VariantSwitch<Variant extends string> = Record<Variant, boolean> | Variant | false | null | undefined;
9
+ export type VariantsOf<T> = T extends (...variants: VariantSwitch<infer Variant>[]) => any ? Variant : never;
10
+ type ComponentStyles<Component extends string> = Partial<Record<Component, ClassNames>>;
11
+ type ComponentVariants<Component extends string, Variant extends string> = Partial<Record<Variant, ComponentStyles<Component>>>;
12
+ export declare function defineComponents<Variant extends string, Component extends string>(styles: ComponentStyles<Component>, variants?: ComponentVariants<Component, Variant>): (...variants: VariantSwitch<Variant>[]) => Record<Component, string>;
13
+ export declare function defineStyle<Variant extends string>(...styling: (Variants<Variant> | ClassNames)[]): (...variants: VariantSwitch<Variant>[]) => string;
14
+ export {};
@@ -0,0 +1,15 @@
1
+ import React, { ReactNode } from "react";
2
+ import { Result } from "../interface/result";
3
+ export declare const emptyContext: unique symbol;
4
+ export default function createContex<T>(options: {
5
+ initial?: T;
6
+ debugName?: string;
7
+ mapProps?: (props: any) => T;
8
+ }): {
9
+ readonly context: React.Context<typeof emptyContext | T>;
10
+ readonly useContext: () => T;
11
+ readonly useSafe: () => Result<T, string>;
12
+ readonly Provider: (props: {
13
+ children: ReactNode;
14
+ } & T) => React.FunctionComponentElement<React.ProviderProps<typeof emptyContext | T>>;
15
+ };
@@ -0,0 +1,17 @@
1
+ export declare function useAsync<T>(awaited: (() => Promise<T>) | Promise<T>, deps?: any[]): T;
2
+ export type AsyncState<R> = {
3
+ isIdle: true;
4
+ result?: never;
5
+ isLoading: false;
6
+ } | {
7
+ isIdle: false;
8
+ result?: never;
9
+ isLoading: true;
10
+ } | {
11
+ isIdle: false;
12
+ result: R;
13
+ isLoading: false;
14
+ };
15
+ export declare function useAsyncCallback<Args extends any[], R>(fn: (...args: Args) => Promise<R>, deps?: ((...args: Args) => Promise<R>)[]): readonly [(...args: Args) => Promise<R>, AsyncState<R>];
16
+ export declare function usePrevious<T>(value: T): [T | undefined, boolean];
17
+ export declare function useDebounce<T>(value: T, time: number): T;
@@ -0,0 +1,5 @@
1
+ export type * from "./classNames";
2
+ export * from "./classNames";
3
+ export { default as cn } from "./classNames";
4
+ export { default as createContext } from "./context";
5
+ export * from "./hooks";
@@ -0,0 +1,16 @@
1
+ import { Observable } from "rxjs";
2
+ import { Collection } from "./collection";
3
+ type ItemsOf<T> = {
4
+ [key in keyof T]: T[key] extends Collection<infer Item> ? Item[] : never;
5
+ };
6
+ export declare class Aggregate<TBases extends Collection<any>[], TAggregate> extends Collection<TAggregate> {
7
+ // TODO: Weaken - check weakmap functionality
8
+ _cache: WeakMap<object, any>;
9
+ items: Observable<TAggregate[]>;
10
+ memo<T>(input: T, dependenceis: any[]): T;
11
+ constructor(aggregate: (...collections: ItemsOf<TBases>) => {
12
+ item: TAggregate;
13
+ dependencies: any[];
14
+ }[], bases: TBases);
15
+ }
16
+ export {};
@@ -0,0 +1,10 @@
1
+ import { Observable } from "rxjs";
2
+ export declare abstract class Collection<T> {
3
+ protected abstract items: Observable<T[]>;
4
+ static from<T>(items: T[]): Collection<T>;
5
+ watchOne(filter: (item: T) => boolean): Observable<T | null>;
6
+ watch(filter?: ((item: T) => boolean) | undefined): Observable<T[]>;
7
+ find(filter: (item: T) => boolean): Promise<T | null>;
8
+ list(filter?: (item: T, index: number) => boolean): Promise<T[]>;
9
+ }
10
+ export type ItemOf<C extends Collection<any>> = C extends Collection<infer T> ? T : never;
@@ -0,0 +1,6 @@
1
+ import { Observable } from "rxjs";
2
+ import { Collection } from "./collection";
3
+ export declare function useSuspendedObservable<T>(observable: Observable<T>): T;
4
+ export declare function useObservable<T>(observable: Observable<T>): T | null;
5
+ export declare function useCollection<T>(collection: Collection<T>, filter?: ((item: T) => boolean) | undefined, deps?: any[]): T[];
6
+ export declare function useItem<T>(collection: Collection<T>, filter: (item: T) => boolean, deps?: any[]): T | null;
@@ -0,0 +1,4 @@
1
+ export * from "./aggregate";
2
+ export * from "./collection";
3
+ export * from "./store";
4
+ export * from "./reactive-hooks";
@@ -0,0 +1,11 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+ import { Collection } from "./collection";
3
+ export declare class Store<T> extends Collection<T> {
4
+ items: BehaviorSubject<T[]>;
5
+ get state(): T[];
6
+ set state(items: T[]);
7
+ constructor(items?: T[]);
8
+ add(item: T): T;
9
+ update(filter: (item: T) => boolean, map: (item: T) => T): void;
10
+ remove(filter: (item: T) => boolean): void;
11
+ }
@@ -0,0 +1 @@
1
+ export declare function assert(test: boolean, message: string): void;
@@ -0,0 +1,12 @@
1
+ export declare function curry<Fn extends (...args: any[]) => any, O extends Order | undefined = undefined>(fn: Fn, order?: O, curried?: any[]): ([O] extends [undefined] ? NaturalCurry<Fn> : Curry<Fn, O>);
2
+ type Order = readonly (number | readonly number[])[];
3
+ type NaturalCurry<Fn> = Fn extends (...args: infer A) => infer R ? A extends [infer First, ...infer Rest] ? (arg: First) => NaturalCurry<(...args: Rest) => R> : R : never;
4
+ type Curry<Fn extends (...args: any[]) => any, O> = O extends readonly [
5
+ infer First,
6
+ ...infer Rest
7
+ ] ? (...args: First extends readonly number[] ? [
8
+ ...{
9
+ [key in keyof First]: Parameters<Fn>[Extract<First[key], number>];
10
+ }
11
+ ] : [Parameters<Fn>[Extract<First, number>]]) => Curry<Fn, Rest> : ReturnType<Fn>;
12
+ export {};
@@ -0,0 +1,15 @@
1
+ import { Result } from "../interface/result";
2
+ import { IsAsync } from "./ts";
3
+ type GuardRule = (...parameters: any[]) => Result<any, any> | Promise<Result<any, any>>;
4
+ type GuardOptions = {
5
+ alwaysRun?: boolean;
6
+ };
7
+ type Guardian<Rule extends GuardRule, Options extends GuardOptions = {}> = {
8
+ data: Result.DataOf<ReturnType<Rule>> | (Options["alwaysRun"] extends true ? null : never);
9
+ <R>(...permissions: Parameters<Rule>): Result.Fail<Result.ErrorOf<ReturnType<Rule>>> extends (R extends Promise<infer V> ? V : R) ? (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: any[]) => IsAsync<Rule> extends true ? Promise<R> : R>) => void : never;
10
+ };
11
+ // @ts-ignore
12
+ export declare const Guardian: {
13
+ new <Rule extends GuardRule, Options extends GuardOptions = {}>(rule: Rule, options?: Options): Guardian<Rule, Options>;
14
+ };
15
+ export {};
@@ -0,0 +1 @@
1
+ export declare function memo<T>(input: T, dependencies: any[], cache: WeakMap<any, any>): T;
@@ -0,0 +1,32 @@
1
+ import { type Key } from "../primitives/object";
2
+ type Decrement<Limit> = Limit extends [any, ...infer Rest] ? Rest : never;
3
+ export type Paths<T, Exclusive = never, Limiter extends any[] = [1, 2, 3, 4, 5]> = Key<T> | {
4
+ [key in Key<T>]: T[key] extends object ? T[key] extends Exclusive | Function ? key : Limiter extends [any] ? key : `${key}.${Paths<T[key], Exclusive, Decrement<Limiter>>}` : key;
5
+ }[Key<T>];
6
+ export declare function paths<T, Exlcusive = never>(o: T, exclude?: Exlcusive[], prefix?: string): Iterable<Paths<T>>;
7
+ export type Leafs<T, Exclusive = never, Limiter extends any[] = [1, 2, 3, 4, 5]> = {
8
+ [key in Key<T>]: T[key] extends Record<any, any> ? T[key] extends Exclusive | Function ? key : Limiter extends [any] ? key : `${key}.${Leafs<T[key], Exclusive, Decrement<Limiter>>}` : key;
9
+ }[Key<T>];
10
+ export declare function leafs<T, Exclusive = never>(o: T, exclude?: Exclusive[], prefix?: string): Iterable<Leafs<T, Exclusive>>;
11
+ export type Get<T, P> = P extends `${infer Key}.${infer Rest}` ? Get<T[Extract<Key, keyof T>], Extract<Rest, Paths<T[Extract<Key, keyof T>]>>> : T[Extract<P, keyof T>];
12
+ type Split<P> = P extends `${infer Key}.${infer Rest}` ? [Key, ...Split<Rest>] : [];
13
+ export declare function get<T, P extends string>(o: T, path: P | Split<P>): Get<T, P>;
14
+ export type Flat<T, Exclusive = never> = {
15
+ [key in Leafs<T, Exclusive>]: Get<T, key>;
16
+ };
17
+ export declare function flatten<T, Exclusive = never>(o: T, exclude?: Exclusive[]): Flat<T, Exclusive>;
18
+ type ShallowPaths<T> = {
19
+ [Path in Key<T>]: Path extends `${infer Key}.${string}` ? Key : Path;
20
+ }[Key<T>];
21
+ type Subpaths<T, Prefix extends string> = {
22
+ [Path in Key<T>]: Path extends `${Prefix}.${infer Subpath}` ? Subpath : never;
23
+ }[Key<T>];
24
+ export type Inflated<T> = {
25
+ [key in ShallowPaths<T>]: key extends keyof T ? T[key] : Inflated<{
26
+ [subpath in Subpaths<T, key>]: T[Extract<`${key}.${subpath}`, keyof T>];
27
+ }>;
28
+ };
29
+ export declare function unflatten<T>(o: Flat<T>): T;
30
+ export type Patch<T, P, Exclusive = never> = {} extends T ? P : {} extends P ? T : Inflated<Omit<Flat<T, Exclusive>, keyof Flat<P, Exclusive>> & Flat<P, Exclusive>>;
31
+ export declare function patch<T, P>(original: T, patch: P): Patch<T, P>;
32
+ export {};
@@ -0,0 +1,13 @@
1
+ export declare class Range {
2
+ // @ts-ignore
3
+ readonly from: number;
4
+ // @ts-ignore
5
+ readonly to: number;
6
+ // @ts-ignore
7
+ private readonly range;
8
+ constructor(...definition: [RangeDefinition] | [number, number]);
9
+ [Symbol.iterator](): ArrayIterator<number>;
10
+ toArray(): number[];
11
+ contains(r: Range | number): boolean;
12
+ }
13
+ export type RangeDefinition = [number, number] | Range;
@@ -0,0 +1,25 @@
1
+ export type Fn<Args extends any[] = any[], Return = any> = (...args: Args) => Return;
2
+ export type Recursion<T> = T | Recursion<T>[];
3
+ export type PropsOf<T extends (...args: any[]) => any> = Parameters<T>[0];
4
+ export type DeepPartial<T> = {
5
+ [P in keyof T]?: T[P] extends object ? T[P] extends Function ? T[P] : DeepPartial<T[P]> : T[P];
6
+ };
7
+ export type Merge<U> = (U extends any ? (x: U) => any : never) extends (x: infer I) => any ? I : never;
8
+ export type DeeplyOptional<T extends object> = {
9
+ [key in keyof T]?: T[key] extends object ? DeeplyOptional<T[key]> : T[key];
10
+ };
11
+ export type NothingOrEveryhing<T extends object> = T | {
12
+ [key in keyof T]?: never;
13
+ };
14
+ export type NoInfer<T> = [T][T extends any ? 0 : never];
15
+ export type Await<T> = T extends Promise<infer V> ? V : T;
16
+ export type IsAsync<T> = ReturnType<Extract<T, Fn>> extends Promise<any> ? true : false;
17
+ export type RemoveNever<T> = {
18
+ [K in keyof T as T[K] extends never ? never : K]: T[K];
19
+ };
20
+ export type NeverColleasing<T, E> = [T] extends [never] ? E : T;
21
+ export type NullishColleasing<T, E> = T extends undefined | null ? E : T;
22
+ export type Values<T> = T[keyof T];
23
+ export type Permutate<U extends string | symbol | number> = [U] extends [never] ? [] : {
24
+ [K in U]: [K, ...Permutate<Exclude<U, K>>];
25
+ }[U];
@@ -0,0 +1,7 @@
1
+ export * from "./curry";
2
+ export * from "./memo";
3
+ export * from "./paths";
4
+ export * from "./ts";
5
+ export * from "./range";
6
+ export * from "./guardian";
7
+ export * from './uuid';
@@ -0,0 +1 @@
1
+ export { uuid } from "uuidv4";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lejdar/webdev",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "scripts": {
53
53
  "dev": "vite",
54
- "build": "vite builde",
54
+ "build": "vite build && tsgo",
55
55
  "build:watch": "node build.js",
56
56
  "test": "vitest ",
57
57
  "test:ui": "vitest --ui --coverage",
@@ -81,6 +81,7 @@
81
81
  "rxjs": "^7.8.2"
82
82
  },
83
83
  "dependencies": {
84
+ "@lejdar/webdev": "^0.0.5",
84
85
  "@types/assert": "^1.5.11",
85
86
  "@types/node": "^22.14.1",
86
87
  "assert": "^2.1.0",