jurist 0.0.4 → 0.0.5

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/jurist.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- import { Tree, Join, TreePathName } from 'treetrunks';
2
- export * from 'treetrunks';
1
+ import { Join, Tree, TreePathName } from "treetrunks";
3
2
 
3
+ export * from "treetrunks"
4
+
5
+ //#region src/jurist.d.ts
4
6
  type Roles<L extends Laws<any, any, any, any>> = L extends Laws<infer Role, any, any, any> ? Role : never;
5
7
  type Permissions<L extends Laws<any, any, any, any>> = L extends Laws<any, any, infer Permission, any> ? Permission : never;
6
8
  type PermissionData<L extends Laws<any, any, any, any>, D> = Entries<Permissions<L>, D>;
@@ -38,6 +40,8 @@ type Count<N extends number, A extends any[] = []> = [
38
40
  ...A,
39
41
  any
40
42
  ][`length`] extends N ? A[`length`] : A[`length`] | Count<N, [...A, any]>;
41
- type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][];
43
+ type Entries<K extends PropertyKey = PropertyKey, V = any> = [K, V][];
42
44
 
43
- export { type Count, Escalator, type EscalatorStyle, Laws, type PermissionData, type Permissions, type Roles };
45
+ //#endregion
46
+ export { Count, Escalator, EscalatorStyle, Laws, PermissionData, Permissions, Roles };
47
+ //# sourceMappingURL=jurist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jurist.d.ts","names":[],"sources":["../src/jurist.d.ts"],"sourcesContent":["import type { Join, Tree, TreePathName } from \"treetrunks\";\nexport * from \"treetrunks\";\nexport type Roles<L extends Laws<any, any, any, any>> = L extends Laws<infer Role, any, any, any> ? Role : never;\nexport type Permissions<L extends Laws<any, any, any, any>> = L extends Laws<any, any, infer Permission, any> ? Permission : never;\nexport type PermissionData<L extends Laws<any, any, any, any>, D> = Entries<Permissions<L>, D>;\nexport declare class Laws<Role extends string, PermissionTree extends Tree, Permission extends Join<TreePathName<PermissionTree>, `_`>, RolePermissions extends {\n [r in Role]: ReadonlySet<Permission>;\n}> {\n readonly roles: Role[];\n readonly permissionTree: PermissionTree;\n readonly rolePermissions: RolePermissions;\n protected readonly decompressedRolePermissions: {\n [r in Role]: ReadonlySet<string>;\n };\n constructor(options: {\n roles: Role[];\n permissions: PermissionTree;\n rolePermissions: RolePermissions;\n });\n check(role: Role, permission: Permission): boolean;\n}\nexport type EscalatorStyle = `firstFound` | `lastFound` | `untilMiss`;\nexport declare class Escalator<S extends EscalatorStyle, L extends Laws<any, any, any, any>, P extends PermissionData<L, any>, D extends P extends PermissionData<L, infer d> ? d : never, F> {\n readonly style: S;\n readonly laws: L;\n readonly permissionData: P;\n readonly fallback: F;\n constructor(options: Readonly<{\n style: S;\n laws: L;\n permissionData: P;\n fallback: F;\n }>);\n get(role: Roles<L>): D | F;\n}\nexport type Count<N extends number, A extends any[] = []> = [\n ...A,\n any\n][`length`] extends N ? A[`length`] : A[`length`] | Count<N, [...A, any]>;\ntype Entries<K extends PropertyKey = PropertyKey, V = any> = [K, V][];\n"],"mappings":";;;;;AAEA,IAAW,QAAQ;CAAC;CAAG,MAAM;CAAM,MAAM;CAAG,MAAM;CAAM,MAAM;AAAK;AACnE,IAAW,cAAc;CAAC;CAAG,MAAM;CAAM,MAAM;CAAG,MAAM;CAAM,MAAM;AAAW;AAC/E,IAAW,iBAAiB;CAAC;CAAG,MAAM;CAAM,MAAM;CAAG,MAAM;CAAa,MAAM;CAAG,MAAM;AAAO;AAC9F,IAAW,OAAO;CAAC;CAAG,MAAM;CAAM,MAAM;CAAgB,MAAM;CAAiB,MAAM;CAAa,MAAM;CAAM,MAAM;CAAM,MAAM;CAAgB,MAAM;CAAU,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;AAChK,IAAW,iBAAiB,CAAC,CAAI;AACjC,IAAG,YAAA;CAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;AACH,IAAW,QAAQ;CAAC;CAAG,MAAG;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;AAC1B,IAAI,UAAU;CAAC;CAAG,MAAM;CAAa,MAAM;CAAA,MAAA;CAAA,MAAA;AAAA"}
package/dist/jurist.js CHANGED
@@ -1,78 +1,70 @@
1
- export * from 'treetrunks';
1
+ export * from "treetrunks"
2
2
 
3
- // src/jurist.ts
3
+ //#region src/jurist.ts
4
4
  var Laws = class {
5
- roles;
6
- permissionTree;
7
- rolePermissions;
8
- decompressedRolePermissions;
9
- constructor(options) {
10
- const { roles, permissions, rolePermissions } = options;
11
- this.roles = roles;
12
- this.permissionTree = permissions;
13
- this.rolePermissions = rolePermissions;
14
- this.decompressedRolePermissions = fromEntries(
15
- toEntries(rolePermissions).map(
16
- ([role, permissionsOfRole]) => [
17
- role,
18
- decompressRolePermissions(permissionsOfRole)
19
- ]
20
- )
21
- );
22
- }
23
- check(role, permission) {
24
- return this.decompressedRolePermissions[role].has(permission);
25
- }
5
+ roles;
6
+ permissionTree;
7
+ rolePermissions;
8
+ decompressedRolePermissions;
9
+ constructor(options) {
10
+ const { roles, permissions, rolePermissions } = options;
11
+ this.roles = roles;
12
+ this.permissionTree = permissions;
13
+ this.rolePermissions = rolePermissions;
14
+ this.decompressedRolePermissions = fromEntries(toEntries(rolePermissions).map(([role, permissionsOfRole]) => [role, decompressRolePermissions(permissionsOfRole)]));
15
+ }
16
+ check(role, permission) {
17
+ return this.decompressedRolePermissions[role].has(permission);
18
+ }
26
19
  };
27
20
  function decompressRolePermissions(permissionSet) {
28
- const decompressed = new Set(permissionSet);
29
- for (const permission of permissionSet) {
30
- const preconditions = permission.split(`_`);
31
- for (let i = 0; i < preconditions.length - 1; i++) {
32
- const subPermission = preconditions.slice(0, i + 1).join(`_`);
33
- decompressed.add(subPermission);
34
- }
35
- }
36
- return decompressed;
21
+ const decompressed = new Set(permissionSet);
22
+ for (const permission of permissionSet) {
23
+ const preconditions = permission.split(`_`);
24
+ for (let i = 0; i < preconditions.length - 1; i++) {
25
+ const subPermission = preconditions.slice(0, i + 1).join(`_`);
26
+ decompressed.add(subPermission);
27
+ }
28
+ }
29
+ return decompressed;
37
30
  }
38
31
  var Escalator = class {
39
- style;
40
- laws;
41
- permissionData;
42
- fallback;
43
- constructor(options) {
44
- const { style, laws, permissionData, fallback } = options;
45
- this.style = style;
46
- this.laws = laws;
47
- this.permissionData = permissionData;
48
- this.fallback = fallback;
49
- }
50
- get(role) {
51
- let result = this.fallback;
52
- for (const [permission, data] of this.permissionData) {
53
- const hasPermission = this.laws.check(role, permission);
54
- switch (this.style) {
55
- case `firstFound`:
56
- if (hasPermission) return data;
57
- break;
58
- case `lastFound`:
59
- if (hasPermission) result = data;
60
- break;
61
- case `untilMiss`:
62
- if (hasPermission) result = data;
63
- else return result;
64
- }
65
- }
66
- return result;
67
- }
32
+ style;
33
+ laws;
34
+ permissionData;
35
+ fallback;
36
+ constructor(options) {
37
+ const { style, laws, permissionData, fallback } = options;
38
+ this.style = style;
39
+ this.laws = laws;
40
+ this.permissionData = permissionData;
41
+ this.fallback = fallback;
42
+ }
43
+ get(role) {
44
+ let result = this.fallback;
45
+ for (const [permission, data] of this.permissionData) {
46
+ const hasPermission = this.laws.check(role, permission);
47
+ switch (this.style) {
48
+ case `firstFound`:
49
+ if (hasPermission) return data;
50
+ break;
51
+ case `lastFound`:
52
+ if (hasPermission) result = data;
53
+ break;
54
+ case `untilMiss`: if (hasPermission) result = data;
55
+ else return result;
56
+ }
57
+ }
58
+ return result;
59
+ }
68
60
  };
69
61
  function fromEntries(entries) {
70
- return Object.fromEntries(entries);
62
+ return Object.fromEntries(entries);
71
63
  }
72
64
  function toEntries(obj) {
73
- return Object.entries(obj);
65
+ return Object.entries(obj);
74
66
  }
75
67
 
68
+ //#endregion
76
69
  export { Escalator, Laws };
77
- //# sourceMappingURL=jurist.js.map
78
70
  //# sourceMappingURL=jurist.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/jurist.ts"],"names":[],"mappings":";;;AA2BO,IAAM,OAAN,MAKL;AAAA,EACe,KAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACG,2BAAA;AAAA,EAIZ,YAAY,OAIhB,EAAA;AACF,IAAA,MAAM,EAAE,KAAA,EAAO,WAAa,EAAA,eAAA,EAAoB,GAAA,OAAA;AAChD,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,cAAiB,GAAA,WAAA;AACtB,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA;AACvB,IAAA,IAAA,CAAK,2BAA8B,GAAA,WAAA;AAAA,MAClC,SAAA,CAA2B,eAAe,CAAE,CAAA,GAAA;AAAA,QAC3C,CAAC,CAAC,IAAM,EAAA,iBAAiB,CAAM,KAAA;AAAA,UAC9B,IAAA;AAAA,UACA,0BAA0B,iBAAiB;AAAA;AAC5C;AACD,KACD;AAAA;AACD,EAEO,KAAA,CAAM,MAAY,UAAiC,EAAA;AACzD,IAAA,OAAO,IAAK,CAAA,2BAAA,CAA4B,IAAI,CAAA,CAAE,IAAI,UAAU,CAAA;AAAA;AAE9D;AAEA,SAAS,0BACR,aACsB,EAAA;AACtB,EAAM,MAAA,YAAA,GAAe,IAAI,GAAA,CAAY,aAAa,CAAA;AAClD,EAAA,KAAA,MAAW,cAAc,aAAe,EAAA;AACvC,IAAM,MAAA,aAAA,GAAgB,UAAW,CAAA,KAAA,CAAM,CAAG,CAAA,CAAA,CAAA;AAC1C,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,aAAc,CAAA,MAAA,GAAS,GAAG,CAAK,EAAA,EAAA;AAClD,MAAM,MAAA,aAAA,GAAgB,cAAc,KAAM,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,KAAK,CAAG,CAAA,CAAA,CAAA;AAC5D,MAAA,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA;AAC/B;AAED,EAAO,OAAA,YAAA;AACR;AAGO,IAAM,YAAN,MAML;AAAA,EACe,KAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACT,YACN,OAMC,EAAA;AACD,IAAA,MAAM,EAAE,KAAA,EAAO,IAAM,EAAA,cAAA,EAAgB,UAAa,GAAA,OAAA;AAClD,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AACZ,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAAA;AACjB,EAEO,IAAI,IAAuB,EAAA;AACjC,IAAA,IAAI,SAAgB,IAAK,CAAA,QAAA;AACzB,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,IAAI,CAAA,IAAK,KAAK,cAAgB,EAAA;AACrD,MAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,MAAM,UAAU,CAAA;AACtD,MAAA,QAAQ,KAAK,KAAO;AAAA,QACnB,KAAK,CAAA,UAAA,CAAA;AACJ,UAAA,IAAI,eAAsB,OAAA,IAAA;AAC1B,UAAA;AAAA,QACD,KAAK,CAAA,SAAA,CAAA;AACJ,UAAA,IAAI,eAAwB,MAAA,GAAA,IAAA;AAC5B,UAAA;AAAA,QACD,KAAK,CAAA,SAAA,CAAA;AACJ,UAAA,IAAI,eAAwB,MAAA,GAAA,IAAA;AAAA,eAChB,OAAA,MAAA;AAAA;AACd;AAED,IAAO,OAAA,MAAA;AAAA;AAET;AAyBA,SAAS,YAA+B,OAA4B,EAAA;AACnE,EAAO,OAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAClC;AAEA,SAAS,UAA4B,GAAsC,EAAA;AAC1E,EAAO,OAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC1B","file":"jurist.js","sourcesContent":["import type { Join, Tree, TreePathName } from \"treetrunks\"\n\nexport * from \"treetrunks\"\n\nexport type Roles<L extends Laws<any, any, any, any>> = L extends Laws<\n\tinfer Role,\n\tany,\n\tany,\n\tany\n>\n\t? Role\n\t: never\n\nexport type Permissions<L extends Laws<any, any, any, any>> = L extends Laws<\n\tany,\n\tany,\n\tinfer Permission,\n\tany\n>\n\t? Permission\n\t: never\n\nexport type PermissionData<L extends Laws<any, any, any, any>, D> = Entries<\n\tPermissions<L>,\n\tD\n>\n\nexport class Laws<\n\tRole extends string,\n\tPermissionTree extends Tree,\n\tPermission extends Join<TreePathName<PermissionTree>, `_`>,\n\tRolePermissions extends { [r in Role]: ReadonlySet<Permission> },\n> {\n\tpublic readonly roles: Role[]\n\tpublic readonly permissionTree: PermissionTree\n\tpublic readonly rolePermissions: RolePermissions\n\tprotected readonly decompressedRolePermissions: {\n\t\t[r in Role]: ReadonlySet<string>\n\t}\n\n\tpublic constructor(options: {\n\t\troles: Role[]\n\t\tpermissions: PermissionTree\n\t\trolePermissions: RolePermissions\n\t}) {\n\t\tconst { roles, permissions, rolePermissions } = options\n\t\tthis.roles = roles\n\t\tthis.permissionTree = permissions\n\t\tthis.rolePermissions = rolePermissions\n\t\tthis.decompressedRolePermissions = fromEntries(\n\t\t\ttoEntries<RolePermissions>(rolePermissions).map(\n\t\t\t\t([role, permissionsOfRole]) => [\n\t\t\t\t\trole,\n\t\t\t\t\tdecompressRolePermissions(permissionsOfRole),\n\t\t\t\t],\n\t\t\t),\n\t\t)\n\t}\n\n\tpublic check(role: Role, permission: Permission): boolean {\n\t\treturn this.decompressedRolePermissions[role].has(permission)\n\t}\n}\n\nfunction decompressRolePermissions(\n\tpermissionSet: ReadonlySet<string>,\n): ReadonlySet<string> {\n\tconst decompressed = new Set<string>(permissionSet)\n\tfor (const permission of permissionSet) {\n\t\tconst preconditions = permission.split(`_`)\n\t\tfor (let i = 0; i < preconditions.length - 1; i++) {\n\t\t\tconst subPermission = preconditions.slice(0, i + 1).join(`_`)\n\t\t\tdecompressed.add(subPermission)\n\t\t}\n\t}\n\treturn decompressed\n}\n\nexport type EscalatorStyle = `firstFound` | `lastFound` | `untilMiss`\nexport class Escalator<\n\tS extends EscalatorStyle,\n\tL extends Laws<any, any, any, any>,\n\tP extends PermissionData<L, any>,\n\tD extends P extends PermissionData<L, infer d> ? d : never,\n\tF,\n> {\n\tpublic readonly style: S\n\tpublic readonly laws: L\n\tpublic readonly permissionData: P\n\tpublic readonly fallback: F\n\tpublic constructor(\n\t\toptions: Readonly<{\n\t\t\tstyle: S\n\t\t\tlaws: L\n\t\t\tpermissionData: P\n\t\t\tfallback: F\n\t\t}>,\n\t) {\n\t\tconst { style, laws, permissionData, fallback } = options\n\t\tthis.style = style\n\t\tthis.laws = laws\n\t\tthis.permissionData = permissionData\n\t\tthis.fallback = fallback\n\t}\n\n\tpublic get(role: Roles<L>): D | F {\n\t\tlet result: D | F = this.fallback\n\t\tfor (const [permission, data] of this.permissionData) {\n\t\t\tconst hasPermission = this.laws.check(role, permission)\n\t\t\tswitch (this.style) {\n\t\t\t\tcase `firstFound`:\n\t\t\t\t\tif (hasPermission) return data\n\t\t\t\t\tbreak\n\t\t\t\tcase `lastFound`:\n\t\t\t\t\tif (hasPermission) result = data\n\t\t\t\t\tbreak\n\t\t\t\tcase `untilMiss`:\n\t\t\t\t\tif (hasPermission) result = data\n\t\t\t\t\telse return result\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n}\n\ntype Flat<R extends { [K in PropertyKey]: any }> = {\n\t[K in keyof R]: R[K]\n}\n\nexport type Count<N extends number, A extends any[] = []> = [\n\t...A,\n\tany,\n][`length`] extends N\n\t? A[`length`]\n\t: A[`length`] | Count<N, [...A, any]>\n\ntype Entries<K extends PropertyKey = keyof any, V = any> = [K, V][]\n\ntype KeyOfEntries<E extends Entries> = E extends [infer K, any][] ? K : never\n\ntype ValueOfEntry<E extends Entries, K extends KeyOfEntries<E>> = {\n\t[P in Count<E[`length`]>]: E[P] extends [K, infer V] ? V : never\n}[Count<E[`length`]>]\n\ntype FromEntries<E extends Entries> = Flat<{\n\t[K in KeyOfEntries<E>]: ValueOfEntry<E, K>\n}>\n\nfunction fromEntries<E extends Entries>(entries: E): FromEntries<E> {\n\treturn Object.fromEntries(entries) as FromEntries<E>\n}\n\nfunction toEntries<T extends object>(obj: T): Entries<keyof T, T[keyof T]> {\n\treturn Object.entries(obj) as Entries<keyof T, T[keyof T]>\n}\n"]}
1
+ {"version":3,"file":"jurist.js","names":["options: {\n\t\troles: Role[]\n\t\tpermissions: PermissionTree\n\t\trolePermissions: RolePermissions\n\t}","role: Role","permission: Permission","permissionSet: ReadonlySet<string>","options: Readonly<{\n\t\t\tstyle: S\n\t\t\tlaws: L\n\t\t\tpermissionData: P\n\t\t\tfallback: F\n\t\t}>","role: Roles<L>","result: D | F","entries: E","obj: T"],"sources":["../src/jurist.ts"],"sourcesContent":["import type { Join, Tree, TreePathName } from \"treetrunks\"\n\nexport * from \"treetrunks\"\n\nexport type Roles<L extends Laws<any, any, any, any>> = L extends Laws<\n\tinfer Role,\n\tany,\n\tany,\n\tany\n>\n\t? Role\n\t: never\n\nexport type Permissions<L extends Laws<any, any, any, any>> = L extends Laws<\n\tany,\n\tany,\n\tinfer Permission,\n\tany\n>\n\t? Permission\n\t: never\n\nexport type PermissionData<L extends Laws<any, any, any, any>, D> = Entries<\n\tPermissions<L>,\n\tD\n>\n\nexport class Laws<\n\tRole extends string,\n\tPermissionTree extends Tree,\n\tPermission extends Join<TreePathName<PermissionTree>, `_`>,\n\tRolePermissions extends { [r in Role]: ReadonlySet<Permission> },\n> {\n\tpublic readonly roles: Role[]\n\tpublic readonly permissionTree: PermissionTree\n\tpublic readonly rolePermissions: RolePermissions\n\tprotected readonly decompressedRolePermissions: {\n\t\t[r in Role]: ReadonlySet<string>\n\t}\n\n\tpublic constructor(options: {\n\t\troles: Role[]\n\t\tpermissions: PermissionTree\n\t\trolePermissions: RolePermissions\n\t}) {\n\t\tconst { roles, permissions, rolePermissions } = options\n\t\tthis.roles = roles\n\t\tthis.permissionTree = permissions\n\t\tthis.rolePermissions = rolePermissions\n\t\tthis.decompressedRolePermissions = fromEntries(\n\t\t\ttoEntries<RolePermissions>(rolePermissions).map(\n\t\t\t\t([role, permissionsOfRole]) => [\n\t\t\t\t\trole,\n\t\t\t\t\tdecompressRolePermissions(permissionsOfRole),\n\t\t\t\t],\n\t\t\t),\n\t\t)\n\t}\n\n\tpublic check(role: Role, permission: Permission): boolean {\n\t\treturn this.decompressedRolePermissions[role].has(permission)\n\t}\n}\n\nfunction decompressRolePermissions(\n\tpermissionSet: ReadonlySet<string>,\n): ReadonlySet<string> {\n\tconst decompressed = new Set<string>(permissionSet)\n\tfor (const permission of permissionSet) {\n\t\tconst preconditions = permission.split(`_`)\n\t\tfor (let i = 0; i < preconditions.length - 1; i++) {\n\t\t\tconst subPermission = preconditions.slice(0, i + 1).join(`_`)\n\t\t\tdecompressed.add(subPermission)\n\t\t}\n\t}\n\treturn decompressed\n}\n\nexport type EscalatorStyle = `firstFound` | `lastFound` | `untilMiss`\nexport class Escalator<\n\tS extends EscalatorStyle,\n\tL extends Laws<any, any, any, any>,\n\tP extends PermissionData<L, any>,\n\tD extends P extends PermissionData<L, infer d> ? d : never,\n\tF,\n> {\n\tpublic readonly style: S\n\tpublic readonly laws: L\n\tpublic readonly permissionData: P\n\tpublic readonly fallback: F\n\tpublic constructor(\n\t\toptions: Readonly<{\n\t\t\tstyle: S\n\t\t\tlaws: L\n\t\t\tpermissionData: P\n\t\t\tfallback: F\n\t\t}>,\n\t) {\n\t\tconst { style, laws, permissionData, fallback } = options\n\t\tthis.style = style\n\t\tthis.laws = laws\n\t\tthis.permissionData = permissionData\n\t\tthis.fallback = fallback\n\t}\n\n\tpublic get(role: Roles<L>): D | F {\n\t\tlet result: D | F = this.fallback\n\t\tfor (const [permission, data] of this.permissionData) {\n\t\t\tconst hasPermission = this.laws.check(role, permission)\n\t\t\tswitch (this.style) {\n\t\t\t\tcase `firstFound`:\n\t\t\t\t\tif (hasPermission) return data\n\t\t\t\t\tbreak\n\t\t\t\tcase `lastFound`:\n\t\t\t\t\tif (hasPermission) result = data\n\t\t\t\t\tbreak\n\t\t\t\tcase `untilMiss`:\n\t\t\t\t\tif (hasPermission) result = data\n\t\t\t\t\telse return result\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n}\n\ntype Flat<R extends { [K in PropertyKey]: any }> = {\n\t[K in keyof R]: R[K]\n}\n\nexport type Count<N extends number, A extends any[] = []> = [\n\t...A,\n\tany,\n][`length`] extends N\n\t? A[`length`]\n\t: A[`length`] | Count<N, [...A, any]>\n\ntype Entries<K extends PropertyKey = PropertyKey, V = any> = [K, V][]\n\ntype KeyOfEntries<E extends Entries> = E extends [infer K, any][] ? K : never\n\ntype ValueOfEntry<E extends Entries, K extends KeyOfEntries<E>> = {\n\t[P in Count<E[`length`]>]: E[P] extends [K, infer V] ? V : never\n}[Count<E[`length`]>]\n\ntype FromEntries<E extends Entries> = Flat<{\n\t[K in KeyOfEntries<E>]: ValueOfEntry<E, K>\n}>\n\nfunction fromEntries<E extends Entries>(entries: E): FromEntries<E> {\n\treturn Object.fromEntries(entries) as FromEntries<E>\n}\n\nfunction toEntries<T extends object>(obj: T): Entries<keyof T, T[keyof T]> {\n\treturn Object.entries(obj) as Entries<keyof T, T[keyof T]>\n}\n"],"mappings":";;;AA2BA,IAAa,OAAb,MAKE;CACD,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAmB;CAInB,AAAO,YAAYA,SAIhB;EACF,MAAM,EAAE,OAAO,aAAa,iBAAiB,GAAG;AAChD,OAAK,QAAQ;AACb,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;AACvB,OAAK,8BAA8B,YAClC,UAA2B,gBAAgB,CAAC,IAC3C,CAAC,CAAC,MAAM,kBAAkB,KAAK,CAC9B,MACA,0BAA0B,kBAAkB,AAC5C,EACD,CACD;CACD;CAED,AAAO,MAAMC,MAAYC,YAAiC;AACzD,SAAO,KAAK,4BAA4B,MAAM,IAAI,WAAW;CAC7D;AACD;AAED,SAAS,0BACRC,eACsB;CACtB,MAAM,eAAe,IAAI,IAAY;AACrC,MAAK,MAAM,cAAc,eAAe;EACvC,MAAM,gBAAgB,WAAW,OAAO,GAAG;AAC3C,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;GAClD,MAAM,gBAAgB,cAAc,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG;AAC7D,gBAAa,IAAI,cAAc;EAC/B;CACD;AACD,QAAO;AACP;AAGD,IAAa,YAAb,MAME;CACD,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAO,YACNC,SAMC;EACD,MAAM,EAAE,OAAO,MAAM,gBAAgB,UAAU,GAAG;AAClD,OAAK,QAAQ;AACb,OAAK,OAAO;AACZ,OAAK,iBAAiB;AACtB,OAAK,WAAW;CAChB;CAED,AAAO,IAAIC,MAAuB;EACjC,IAAIC,SAAgB,KAAK;AACzB,OAAK,MAAM,CAAC,YAAY,KAAK,IAAI,KAAK,gBAAgB;GACrD,MAAM,gBAAgB,KAAK,KAAK,MAAM,MAAM,WAAW;AACvD,WAAQ,KAAK,OAAb;IACC,MAAM;AACL,SAAI,cAAe,QAAO;AAC1B;IACD,MAAM;AACL,SAAI,cAAe,UAAS;AAC5B;IACD,MAAM,WACL,KAAI,cAAe,UAAS;QACvB,QAAO;GACb;EACD;AACD,SAAO;CACP;AACD;AAyBD,SAAS,YAA+BC,SAA4B;AACnE,QAAO,OAAO,YAAY,QAAQ;AAClC;AAED,SAAS,UAA4BC,KAAsC;AAC1E,QAAO,OAAO,QAAQ,IAAI;AAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jurist",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Jeremy Banka",
@@ -21,17 +21,17 @@
21
21
  ],
22
22
  "main": "dist/jurist.js",
23
23
  "dependencies": {
24
- "treetrunks": "0.1.2"
24
+ "treetrunks": "0.1.3"
25
25
  },
26
26
  "devDependencies": {
27
27
  "concurrently": "9.1.2",
28
- "eslint": "9.23.0",
28
+ "eslint": "9.25.1",
29
29
  "rimraf": "6.0.1",
30
- "tsup": "8.4.0",
31
- "vitest": "3.1.1"
30
+ "tsdown": "0.9.3",
31
+ "vitest": "3.1.2"
32
32
  },
33
33
  "scripts": {
34
- "build": "tsup-node",
34
+ "build": "tsdown",
35
35
  "lint:biome": "biome check -- .",
36
36
  "lint:eslint": "eslint -- .",
37
37
  "lint:types": "tsc --noEmit",
package/src/jurist.ts CHANGED
@@ -134,7 +134,7 @@ export type Count<N extends number, A extends any[] = []> = [
134
134
  ? A[`length`]
135
135
  : A[`length`] | Count<N, [...A, any]>
136
136
 
137
- type Entries<K extends PropertyKey = keyof any, V = any> = [K, V][]
137
+ type Entries<K extends PropertyKey = PropertyKey, V = any> = [K, V][]
138
138
 
139
139
  type KeyOfEntries<E extends Entries> = E extends [infer K, any][] ? K : never
140
140