@nmnmcc/ability 0.1.0 → 0.3.0

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.
Files changed (85) hide show
  1. package/README.md +353 -170
  2. package/dist/Authorizer.d.ts +216 -0
  3. package/dist/Authorizer.d.ts.map +1 -0
  4. package/dist/Authorizer.js +55 -0
  5. package/dist/Authorizer.js.map +1 -0
  6. package/dist/Condition.d.ts +536 -0
  7. package/dist/Condition.d.ts.map +1 -0
  8. package/dist/Condition.js +141 -0
  9. package/dist/Condition.js.map +1 -0
  10. package/dist/Decision.d.ts +131 -0
  11. package/dist/Decision.d.ts.map +1 -0
  12. package/dist/Decision.js +83 -0
  13. package/dist/Decision.js.map +1 -0
  14. package/dist/Domain.d.ts +148 -0
  15. package/dist/Domain.d.ts.map +1 -0
  16. package/dist/Domain.js +34 -0
  17. package/dist/Domain.js.map +1 -0
  18. package/dist/HttpApi.d.ts +129 -0
  19. package/dist/HttpApi.d.ts.map +1 -0
  20. package/dist/HttpApi.js +95 -0
  21. package/dist/HttpApi.js.map +1 -0
  22. package/dist/Policy.d.ts +429 -0
  23. package/dist/Policy.d.ts.map +1 -0
  24. package/dist/Policy.js +162 -0
  25. package/dist/Policy.js.map +1 -0
  26. package/dist/Principal.d.ts +35 -0
  27. package/dist/Principal.d.ts.map +1 -0
  28. package/dist/Principal.js +37 -0
  29. package/dist/Principal.js.map +1 -0
  30. package/dist/Resource.d.ts +213 -0
  31. package/dist/Resource.d.ts.map +1 -0
  32. package/dist/Resource.js +71 -0
  33. package/dist/Resource.js.map +1 -0
  34. package/dist/Rule.d.ts +189 -0
  35. package/dist/Rule.d.ts.map +1 -0
  36. package/dist/Rule.js +50 -0
  37. package/dist/Rule.js.map +1 -0
  38. package/dist/_virtual/_rolldown/runtime.js +1 -2
  39. package/dist/index.d.ts +9 -4
  40. package/dist/index.js +9 -4
  41. package/dist/internal/authorizer.d.ts +28 -0
  42. package/dist/internal/authorizer.d.ts.map +1 -0
  43. package/dist/internal/authorizer.js +153 -0
  44. package/dist/internal/authorizer.js.map +1 -0
  45. package/dist/internal/condition.d.ts +11 -0
  46. package/dist/internal/condition.d.ts.map +1 -0
  47. package/dist/internal/condition.js +393 -0
  48. package/dist/internal/condition.js.map +1 -0
  49. package/dist/internal/domain.js +34 -0
  50. package/dist/internal/domain.js.map +1 -0
  51. package/dist/internal/httpApi.js +41 -0
  52. package/dist/internal/httpApi.js.map +1 -0
  53. package/dist/internal/policy.js +524 -0
  54. package/dist/internal/policy.js.map +1 -0
  55. package/dist/internal/resource.js +66 -0
  56. package/dist/internal/resource.js.map +1 -0
  57. package/dist/internal/rule.js +131 -0
  58. package/dist/internal/rule.js.map +1 -0
  59. package/package.json +61 -74
  60. package/src/Authorizer.ts +330 -0
  61. package/src/Condition.ts +706 -0
  62. package/src/Decision.ts +117 -0
  63. package/src/Domain.ts +189 -0
  64. package/src/HttpApi.ts +148 -0
  65. package/src/Policy.ts +575 -0
  66. package/src/Principal.ts +41 -0
  67. package/src/Resource.ts +290 -0
  68. package/src/Rule.ts +265 -0
  69. package/src/index.ts +57 -0
  70. package/src/internal/authorizer.ts +271 -0
  71. package/src/internal/condition.ts +607 -0
  72. package/src/internal/domain.ts +56 -0
  73. package/src/internal/httpApi.ts +84 -0
  74. package/src/internal/policy.ts +815 -0
  75. package/src/internal/resource.ts +98 -0
  76. package/src/internal/rule.ts +203 -0
  77. package/dist/Ability.d.ts +0 -516
  78. package/dist/Ability.js +0 -211
  79. package/dist/AbilityExtra.d.ts +0 -79
  80. package/dist/AbilityExtra.js +0 -195
  81. package/dist/AbilityRef.d.ts +0 -110
  82. package/dist/AbilityRef.js +0 -160
  83. package/dist/internal/ability.d.ts +0 -114
  84. package/dist/internal/ability.js +0 -624
  85. package/dist/internal/serializable.js +0 -22
@@ -0,0 +1,84 @@
1
+ // A `load` function of a requirement is kept in an annotation, so its error
2
+ // type and its service type are erased to `unknown`. The language service
3
+ // check for `unknown` in an Effect is off here.
4
+ // @effect-diagnostics anyUnknownInErrorContext:off
5
+ import * as Context from "effect/Context"
6
+ import * as Effect from "effect/Effect"
7
+ import * as Layer from "effect/Layer"
8
+ import * as Option from "effect/Option"
9
+ import { HttpRouter } from "effect/http"
10
+ import type * as Authorizer from "../Authorizer.ts"
11
+ import type * as HttpApi from "../HttpApi.ts"
12
+ import { GroupRequired, Required } from "../HttpApi.ts"
13
+
14
+ /** @internal */
15
+ export const requires = (
16
+ _authorizer: unknown,
17
+ action: string,
18
+ kind: string,
19
+ load?: HttpApi.Requirement["load"],
20
+ ): HttpApi.Requirement =>
21
+ Object.freeze(load === undefined ? { action, kind } : { action, kind, load })
22
+
23
+ /** @internal */
24
+ export const layer = (
25
+ middleware: Context.ServiceClass<any, string, any>,
26
+ authorizer: Authorizer.AnyServiceClass,
27
+ ) =>
28
+ Layer.effect(
29
+ middleware,
30
+ Effect.gen(function* () {
31
+ const service = yield* authorizer
32
+ const services = yield* Effect.context<never>()
33
+ return Effect.fnUntraced(function* (
34
+ httpEffect: Effect.Effect<unknown, unknown, unknown>,
35
+ options: {
36
+ readonly endpoint: {
37
+ readonly name: string
38
+ readonly method: string
39
+ readonly annotations: Context.Context<never>
40
+ }
41
+ readonly group: {
42
+ readonly identifier: string
43
+ readonly annotations: Context.Context<never>
44
+ }
45
+ },
46
+ ) {
47
+ const requirements = Option.orElse(
48
+ Context.getOption(options.endpoint.annotations, Required),
49
+ () =>
50
+ Option.map(
51
+ Context.getOption(options.group.annotations, GroupRequired),
52
+ (rules) =>
53
+ options.endpoint.method === "GET" ? rules.read : rules.write,
54
+ ),
55
+ )
56
+ if (Option.isNone(requirements)) {
57
+ return yield* Effect.die(
58
+ new Error(
59
+ `The endpoint ${options.group.identifier}.${options.endpoint.name} does not say what it needs. Give it the HttpApi.Required annotation.`,
60
+ ),
61
+ )
62
+ }
63
+ for (const requirement of requirements.value) {
64
+ if (requirement.load === undefined) {
65
+ yield* service.check({
66
+ action: requirement.action,
67
+ kind: requirement.kind,
68
+ } as never)
69
+ } else {
70
+ const params = yield* HttpRouter.params
71
+ const value = yield* Effect.provideContext(
72
+ requirement.load(params),
73
+ services,
74
+ )
75
+ yield* service.check({
76
+ action: requirement.action,
77
+ resource: value,
78
+ } as never)
79
+ }
80
+ }
81
+ return yield* httpEffect
82
+ })
83
+ }),
84
+ )