@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.
@@ -1,8 +1,7 @@
1
- type ValuesOfKey<Arr extends any[], K extends keyof any> = Arr extends [
2
- infer Head,
3
- ...infer Tail
4
- ] ? Head extends Record<K, any> ? [Head[K], ...ValuesOfKey<Tail, K>] : ValuesOfKey<Tail, K> : [];
5
- type Includes<Arr extends any[], V> = Arr extends [infer H, ...infer R] ? [V] extends [H] ? true : Includes<R, V> : false;
6
- type HasDuplicate<Arr extends readonly any[], K extends keyof any> = Arr extends [infer Head, ...infer Tail] ? Head extends Record<K, any> ? Includes<ValuesOfKey<Tail, K>, Head[K]> extends true ? true : HasDuplicate<Tail, K> : HasDuplicate<Tail, K> : false;
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
@@ -46,5 +46,5 @@
46
46
  "test": "bun --hot run __test/index.ts"
47
47
  },
48
48
  "types": "./dist/index.d.ts",
49
- "version": "1.1.0-beta.10"
49
+ "version": "1.1.0-beta.12"
50
50
  }
@@ -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 K extends readonly TPolicyDefinition[]>(
7
- policies: TEnforceUnique<K, "alias">
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 D extends never ? never : Extract<D[number], { alias: K }>
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,4 +1,5 @@
1
1
  export type * from "./interfaces";
2
+ export type * from "./types";
2
3
 
3
4
  export * from "./constants";
4
5
  export * from "./decorators";
@@ -1,33 +1,30 @@
1
- type ValuesOfKey<Arr extends any[], K extends keyof any> = Arr extends [
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 keyof any
19
- > = Arr extends [infer Head, ...infer Tail]
20
- ? Head extends Record<K, any>
21
- ? Includes<ValuesOfKey<Tail, K>, Head[K]> extends true
22
- ? true
23
- : HasDuplicate<Tail, K>
24
- : HasDuplicate<Tail, K>
25
- : false;
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
- HasDuplicate<Arr, K> extends true
32
- ? `Duplicate key "${K & string}" found`
33
- : Arr;
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
+ };