atomaric 0.0.32 → 0.0.33

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "atomaric",
3
3
  "description": "Manage your project state",
4
- "version": "0.0.32",
4
+ "version": "0.0.33",
5
5
  "type": "module",
6
6
  "main": "./build/atomaric.umd.cjs",
7
7
  "module": "./build/atomaric.js",
package/types/model.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useSyncExternalStore } from 'react';
2
- import { Path, PathValue } from '../src/model';
2
+ import { Path, PathValue } from './paths';
3
3
 
4
4
  type Sunscriber<Value> = (value: Value) => void;
5
5
 
package/types/paths.ts ADDED
@@ -0,0 +1,109 @@
1
+ export type Path<T, Sep extends string> = T extends any ? PathInternal<T, Sep> : never;
2
+ // export type PathValue<T, Sep extends string, ValuePath extends Path<T, Sep>> = TPathValue<T, Sep, ValuePath>;
3
+
4
+ /////////////////////////////////////////////////////////////////////////
5
+ /////////////////////////////////////////////////////////////////////////
6
+ /////////////////////////////////////////////////////////////////////////
7
+ /////////////////////////////////////////////////////////////////////////
8
+ /////////////////////////////////////////////////////////////////////////
9
+ /////////////////////////////////////////////////////////////////////////
10
+ /////////////////////////////////////////////////////////////////////////
11
+ /////////////////////////////////////////////////////////////////////////
12
+
13
+ type PathInternal<T, Sep extends string, TraversedTypes = T> = T extends ReadonlyArray<infer V>
14
+ ? IsTuple<T> extends true
15
+ ? {
16
+ [K in TupleKeys<T>]-?: PathImpl<K & string, Sep, T[K], TraversedTypes>;
17
+ }[TupleKeys<T>]
18
+ : PathImpl<ArrayKey, Sep, V, TraversedTypes>
19
+ : {
20
+ [K in keyof T]-?: PathImpl<K & string, Sep, T[K], TraversedTypes>;
21
+ }[keyof T];
22
+
23
+ export type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
24
+
25
+ type PathImpl<K extends string | number, Sep extends string, V, TraversedTypes> = V extends
26
+ | Primitive
27
+ | BrowserNativeObject
28
+ ? `${K}`
29
+ : true extends AnyIsEqual<TraversedTypes, V>
30
+ ? `${K}`
31
+ : `${K}` | `${K}${Sep}${PathInternal<V, Sep, TraversedTypes | V>}`;
32
+
33
+ export type ArrayKey = number;
34
+ export type Primitive = null | undefined | string | number | boolean | symbol | bigint;
35
+ export type IsTuple<T extends ReadonlyArray<any>> = number extends T['length'] ? false : true;
36
+ export type BrowserNativeObject = Date | FileList | File;
37
+
38
+ type AnyIsEqual<T1, T2> = T1 extends T2 ? (IsEqual<T1, T2> extends true ? true : never) : never;
39
+ export type IsEqual<T1, T2> = T1 extends T2
40
+ ? (<G>() => G extends T1 ? 1 : 2) extends <G>() => G extends T2 ? 1 : 2
41
+ ? true
42
+ : false
43
+ : false;
44
+
45
+ ////////////////////////////////////////////////////////////////////////////
46
+ ////////////////////////////////////////////////////////////////////////////
47
+ ////////////////////////////////////////////////////////////////////////////
48
+ ////////////////////////////////////////////////////////////////////////////
49
+ ////////////////////////////////////////////////////////////////////////////
50
+ ////////////////////////////////////////////////////////////////////////////
51
+ ////////////////////////////////////////////////////////////////////////////
52
+ ////////////////////////////////////////////////////////////////////////////
53
+ ////////////////////////////////////////////////////////////////////////////
54
+ ////////////////////////////////////////////////////////////////////////////
55
+ ////////////////////////////////////////////////////////////////////////////
56
+ ////////////////////////////////////////////////////////////////////////////
57
+ ////////////////////////////////////////////////////////////////////////////
58
+
59
+ export type PathValue<T, Sep extends string, P extends Path<T, Sep> | ArrayPath<T, Sep>> = T extends any
60
+ ? P extends `${infer K}${Sep}${infer R}`
61
+ ? K extends keyof T
62
+ ? R extends Path<T[K], Sep>
63
+ ? PathValue<T[K], Sep, R>
64
+ : never
65
+ : K extends `${ArrayKey}`
66
+ ? T extends ReadonlyArray<infer V>
67
+ ? PathValue<V, Sep, R & Path<V, Sep>>
68
+ : never
69
+ : never
70
+ : P extends keyof T
71
+ ? T[P]
72
+ : P extends `${ArrayKey}`
73
+ ? T extends ReadonlyArray<infer V>
74
+ ? V
75
+ : never
76
+ : never
77
+ : never;
78
+
79
+ export type ArrayPath<T, Sep extends string> = T extends any ? ArrayPathInternal<T, Sep> : never;
80
+
81
+ type ArrayPathInternal<T, Sep extends string, TraversedTypes = T> = T extends ReadonlyArray<infer V>
82
+ ? IsTuple<T> extends true
83
+ ? {
84
+ [K in TupleKeys<T>]-?: ArrayPathImpl<K & string, Sep, T[K], TraversedTypes>;
85
+ }[TupleKeys<T>]
86
+ : ArrayPathImpl<ArrayKey, Sep, V, TraversedTypes>
87
+ : {
88
+ [K in keyof T]-?: ArrayPathImpl<K & string, Sep, T[K], TraversedTypes>;
89
+ }[keyof T];
90
+
91
+ type ArrayPathImpl<K extends string | number, Sep extends string, V, TraversedTypes> = V extends
92
+ | Primitive
93
+ | BrowserNativeObject
94
+ ? IsAny<V> extends true
95
+ ? string
96
+ : never
97
+ : V extends ReadonlyArray<infer U>
98
+ ? U extends Primitive | BrowserNativeObject
99
+ ? IsAny<V> extends true
100
+ ? string
101
+ : never
102
+ : true extends AnyIsEqual<TraversedTypes, V>
103
+ ? never
104
+ : `${K}` | `${K}${Sep}${ArrayPathInternal<V, Sep, TraversedTypes | V>}`
105
+ : true extends AnyIsEqual<TraversedTypes, V>
106
+ ? never
107
+ : `${K}${Sep}${ArrayPathInternal<V, Sep, TraversedTypes | V>}`;
108
+
109
+ export type IsAny<T> = 0 extends 1 & T ? true : false;