Skip to content

Commit 15a273a

Browse files
committed
feat: add local typings
1 parent e3ce6cb commit 15a273a

2 files changed

Lines changed: 137 additions & 0 deletions

File tree

lib/index.d.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/**
2+
* ! This should be deleted as soon as hapipal types
3+
* ! are accepted publicly.
4+
*/
5+
6+
type keyOfRandom = (
7+
'a' | 'b' | 'c' | 'd' | 'e' |
8+
'f' | 'g' | 'h' | 'i' | 'j' |
9+
'k' | 'l' | 'm' | 'n'
10+
)
11+
12+
export interface id {
13+
14+
/**
15+
* Generates a random UUID
16+
*/
17+
generate(): string
18+
19+
criteria <U extends string>(uuid: U): {
20+
$id: U,
21+
random: Record<keyOfRandom, number>
22+
}
23+
}
24+
25+
type KeyValsAsType<T> = {
26+
[
27+
K in keyof T as T[K] extends string ? (
28+
string extends T[K] ? never : T[K]
29+
) : never
30+
]?: AllowedValues<T>
31+
};
32+
33+
type AllowedValues<Criteria> = (
34+
number | string | boolean |
35+
Array<any> | typeof Function |
36+
Schema<Criteria>
37+
);
38+
39+
type Schema<Criteria> = {
40+
$param: keyof Criteria,
41+
$value?: AllowedValues<Criteria>
42+
$replace?: 'true' | true,
43+
$env?: keyof Criteria
44+
$coerce?: 'number' | 'array' | 'boolean' | 'object'
45+
$splitToken?: string | RegExp
46+
$filter?: keyof Criteria | { $env: keyof NodeJS.ProcessEnv },
47+
$base?: AllowedValues<Criteria>,
48+
$default?: AllowedValues<Criteria>
49+
$id?: string,
50+
$range?: {
51+
limit: number,
52+
value: AllowedValues<Criteria>,
53+
id: string
54+
}[]
55+
$meta?: object | string,
56+
} | KeyValsAsType<Criteria>
57+
58+
type ValueOf<T> = T[keyof T];
59+
60+
type FilterType<C, T extends string> = {
61+
$filter?: C,
62+
} | Record<T, string>
63+
64+
type InferFromObject<T, K extends keyof T = keyof T> = T[K] extends infer C ? C : T[K];
65+
66+
/**
67+
*
68+
*/
69+
type ConfidenceStore<
70+
Criteria,
71+
ReturnType
72+
> = (
73+
{
74+
[K in keyof ReturnType]: ConfidenceStore<
75+
Criteria,
76+
ReturnType[K]
77+
> | Schema<Criteria>
78+
} |
79+
{
80+
[K in keyof Schema<Criteria>]: (
81+
ConfidenceStore<Criteria, ReturnType> |
82+
KeyValsAsType<Criteria>
83+
)
84+
}
85+
);
86+
87+
/**
88+
* Finds the '/' slash path in a type starting from the beginning.
89+
*/
90+
type _Path<T, K extends keyof T> = (
91+
K extends string ? (
92+
T[K] extends Record<string, any> ? (
93+
T[K] extends ArrayLike<any> ? (
94+
`/${K}` | `/${K}${_Path<T[K], Exclude<keyof T[K], keyof any[]>>}`
95+
) : (
96+
`/${K}` | `/${K}${_Path<T[K], keyof T[K]>}`
97+
)
98+
) : `/${K}`
99+
) : never
100+
);
101+
102+
// The actual path implementation
103+
type Path<T> = '/' | _Path<T, keyof T>;
104+
105+
type PathValueImp<T, P extends Path<T>> = P extends `/${infer UKey}` ? (
106+
P extends `/${infer LKey}/${infer Rest}` ? (
107+
LKey extends keyof T ? (
108+
Rest extends keyof T[LKey] ? (
109+
T[LKey][Rest]
110+
) : (
111+
`/${Rest}` extends Path<T[LKey]> ? (
112+
PathValueImp<T[LKey], `/${Rest}`>
113+
) : never
114+
)
115+
) : never
116+
) : (
117+
UKey extends keyof T ? T[UKey] : never
118+
)
119+
) : never
120+
121+
type PathValue<T, P extends Path<T>> = P extends '/' ? T : PathValueImp<T, P>
122+
123+
export class Store<Criteria, ReturnType> {
124+
125+
constructor (document: ConfidenceStore<Criteria, ReturnType>);
126+
127+
load(document: ConfidenceStore<Criteria, ReturnType>): void;
128+
129+
get <K extends Path<ReturnType>> (key: K, criteria: Criteria): PathValue<ReturnType, K>
130+
131+
meta <K extends Path<ReturnType> = '/'>(key: K, criteria: Criteria): any;
132+
133+
static validate <T extends ConfidenceStore<any, any>>(node: T): Error | null;
134+
135+
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"version": "6.0.2",
55
"repository": "git://github.com/hapipal/confidence",
66
"main": "lib/index.js",
7+
"types": "lib/index.d.ts",
78
"keywords": [
89
"hapi",
910
"configuration",
@@ -19,6 +20,7 @@
1920
"devDependencies": {
2021
"@hapi/code": "8.x.x",
2122
"@hapi/lab": "24.x.x",
23+
"@types/node": "^18.11.18",
2224
"coveralls": "3.x.x"
2325
},
2426
"bin": {

0 commit comments

Comments
 (0)