@bool-ts/guard-sdk 1.1.0-beta.10 → 1.1.0-beta.12
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/dist/definers/policies.d.ts +2 -2
- package/dist/definers/resources.d.ts +5 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -7
- package/dist/index.js.map +3 -3
- package/dist/ultils/types/enforceUnique.d.ts +6 -7
- package/package.json +1 -1
- package/src/definers/policies.ts +2 -3
- package/src/definers/resources.ts +3 -9
- package/src/index.ts +1 -0
- package/src/ultils/types/enforceUnique.ts +25 -28
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export type TEnforceUnique<Arr extends readonly any[], K extends keyof Arr[number]> = HasDuplicate<Arr, K> extends true ? `Duplicate key "${K & string}" found` : Arr;
|
|
1
|
+
type IsDuplicated<Arr extends readonly any[], K extends string, CurrentValue, Index extends string> = {
|
|
2
|
+
[I in keyof Arr]: I extends Index ? never : Arr[I] extends Record<K, any> ? Arr[I][K] extends CurrentValue ? true : never : never;
|
|
3
|
+
}[number] extends never ? false : true;
|
|
4
|
+
export type TEnforceUnique<Arr extends readonly any[], K extends keyof Arr[number]> = {
|
|
5
|
+
[I in keyof Arr]: IsDuplicated<Arr, K & string, Arr[I] extends Record<K, any> ? Arr[I][K] : never, I & string> extends true ? `❌ ERROR: Duplicate value "${Arr[I][K] & string}" found at key "${K & string}"` : Arr[I];
|
|
6
|
+
};
|
|
8
7
|
export {};
|
package/package.json
CHANGED
package/src/definers/policies.ts
CHANGED
|
@@ -3,11 +3,10 @@ import type { TEnforceUnique } from "../ultils/types";
|
|
|
3
3
|
|
|
4
4
|
import { deepFreeze } from "../ultils/functions";
|
|
5
5
|
|
|
6
|
-
export const definePolicies = <const
|
|
7
|
-
policies: TEnforceUnique<
|
|
6
|
+
export const definePolicies = <const T extends readonly TPolicyDefinition[]>(
|
|
7
|
+
policies: T & TEnforceUnique<T, "alias">
|
|
8
8
|
) => {
|
|
9
9
|
if (
|
|
10
|
-
policies === `Duplicate key "alias" found` ||
|
|
11
10
|
new Set([
|
|
12
11
|
...policies
|
|
13
12
|
.map((policy) =>
|
|
@@ -7,10 +7,9 @@ export const defineResources = <
|
|
|
7
7
|
const T extends readonly TResourceDefinition[],
|
|
8
8
|
D extends TDeepReadonly<T>
|
|
9
9
|
>(
|
|
10
|
-
resources: TEnforceUnique<T, "alias">
|
|
10
|
+
resources: T & TEnforceUnique<T, "alias">
|
|
11
11
|
) => {
|
|
12
12
|
if (
|
|
13
|
-
resources === `Duplicate key "alias" found` ||
|
|
14
13
|
new Set([
|
|
15
14
|
...resources
|
|
16
15
|
.map((resource) =>
|
|
@@ -24,14 +23,10 @@ export const defineResources = <
|
|
|
24
23
|
|
|
25
24
|
const resourceFreezed = deepFreeze(resources);
|
|
26
25
|
|
|
27
|
-
if (resourceFreezed === `Duplicate key "alias" found`) {
|
|
28
|
-
throw new Error("Duplicated resource alias.");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
26
|
return Object.freeze({
|
|
32
27
|
getResource: <
|
|
33
28
|
K extends D extends never ? never : D[number]["alias"],
|
|
34
|
-
R extends
|
|
29
|
+
R extends Extract<D[number], { alias: K }>
|
|
35
30
|
>(
|
|
36
31
|
alias: K
|
|
37
32
|
): R => {
|
|
@@ -49,10 +44,9 @@ export const defineResources = <
|
|
|
49
44
|
},
|
|
50
45
|
resources: resourceFreezed,
|
|
51
46
|
definePolicies: <const K extends readonly TPolicyDefinition<T>[]>(
|
|
52
|
-
policies: TEnforceUnique<K, "alias">
|
|
47
|
+
policies: K & TEnforceUnique<K, "alias">
|
|
53
48
|
) => {
|
|
54
49
|
if (
|
|
55
|
-
policies === `Duplicate key "alias" found` ||
|
|
56
50
|
new Set([
|
|
57
51
|
...policies
|
|
58
52
|
.map((policy) =>
|
package/src/index.ts
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
|
-
type
|
|
2
|
-
infer Head,
|
|
3
|
-
...infer Tail
|
|
4
|
-
]
|
|
5
|
-
? Head extends Record<K, any>
|
|
6
|
-
? [Head[K], ...ValuesOfKey<Tail, K>]
|
|
7
|
-
: ValuesOfKey<Tail, K>
|
|
8
|
-
: [];
|
|
9
|
-
|
|
10
|
-
type Includes<Arr extends any[], V> = Arr extends [infer H, ...infer R]
|
|
11
|
-
? [V] extends [H]
|
|
12
|
-
? true
|
|
13
|
-
: Includes<R, V>
|
|
14
|
-
: false;
|
|
15
|
-
|
|
16
|
-
type HasDuplicate<
|
|
1
|
+
type IsDuplicated<
|
|
17
2
|
Arr extends readonly any[],
|
|
18
|
-
K extends
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
:
|
|
25
|
-
|
|
3
|
+
K extends string,
|
|
4
|
+
CurrentValue,
|
|
5
|
+
Index extends string
|
|
6
|
+
> = {
|
|
7
|
+
[I in keyof Arr]: I extends Index
|
|
8
|
+
? never
|
|
9
|
+
: Arr[I] extends Record<K, any>
|
|
10
|
+
? Arr[I][K] extends CurrentValue
|
|
11
|
+
? true
|
|
12
|
+
: never
|
|
13
|
+
: never;
|
|
14
|
+
}[number] extends never
|
|
15
|
+
? false
|
|
16
|
+
: true;
|
|
26
17
|
|
|
27
18
|
export type TEnforceUnique<
|
|
28
19
|
Arr extends readonly any[],
|
|
29
20
|
K extends keyof Arr[number]
|
|
30
|
-
> =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
> = {
|
|
22
|
+
[I in keyof Arr]: IsDuplicated<
|
|
23
|
+
Arr,
|
|
24
|
+
K & string,
|
|
25
|
+
Arr[I] extends Record<K, any> ? Arr[I][K] : never,
|
|
26
|
+
I & string
|
|
27
|
+
> extends true
|
|
28
|
+
? `❌ ERROR: Duplicate value "${Arr[I][K] & string}" found at key "${K & string}"`
|
|
29
|
+
: Arr[I];
|
|
30
|
+
};
|