@moostjs/arbac 0.5.33 → 0.6.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.
- package/README.md +3 -3
- package/dist/index.cjs +29 -26
- package/dist/index.d.ts +9 -11
- package/dist/index.mjs +25 -22
- package/package.json +30 -28
package/README.md
CHANGED
|
@@ -71,11 +71,11 @@ app.setReplaceRegistry(ArbacReplaceRegistry)
|
|
|
71
71
|
### Protect Routes with `@Authorized()`
|
|
72
72
|
|
|
73
73
|
```typescript
|
|
74
|
-
import {
|
|
74
|
+
import { ArbacAuthorize, ArbacPublic } from '@moostjs/arbac'
|
|
75
75
|
import { Controller, Get } from 'moost'
|
|
76
76
|
|
|
77
77
|
@Controller('/data')
|
|
78
|
-
@
|
|
78
|
+
@ArbacAuthorize()
|
|
79
79
|
export class DataController {
|
|
80
80
|
@Get()
|
|
81
81
|
getProtectedData() {
|
|
@@ -100,7 +100,7 @@ Extends `@prostojs/arbac` and integrates with MoostJS DI.
|
|
|
100
100
|
|
|
101
101
|
Abstract class for defining user-related access control logic.
|
|
102
102
|
|
|
103
|
-
### `@
|
|
103
|
+
### `@ArbacAuthorize()`
|
|
104
104
|
|
|
105
105
|
Method decorator to enforce ARBAC checks.
|
|
106
106
|
|
package/dist/index.cjs
CHANGED
|
@@ -6,11 +6,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
8
|
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
-
key = keys[i];
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
-
get: ((k) => from[k]).bind(null, key),
|
|
13
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key$1; i < n; i++) {
|
|
10
|
+
key$1 = keys[i];
|
|
11
|
+
if (!__hasOwnProp.call(to, key$1) && key$1 !== except) __defProp(to, key$1, {
|
|
12
|
+
get: ((k) => from[k]).bind(null, key$1),
|
|
13
|
+
enumerable: !(desc = __getOwnPropDesc(from, key$1)) || desc.enumerable
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
return to;
|
|
@@ -26,22 +26,22 @@ const __prostojs_arbac = __toESM(require("@prostojs/arbac"));
|
|
|
26
26
|
const __wooksjs_event_http = __toESM(require("@wooksjs/event-http"));
|
|
27
27
|
|
|
28
28
|
//#region packages/arbac/src/moost-arbac.ts
|
|
29
|
-
function _ts_decorate$1(decorators, target, key, desc) {
|
|
30
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
31
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
32
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
33
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
29
|
+
function _ts_decorate$1(decorators, target, key$1, desc) {
|
|
30
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
|
|
31
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
|
|
32
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
|
|
33
|
+
return c > 3 && r && Object.defineProperty(target, key$1, r), r;
|
|
34
34
|
}
|
|
35
35
|
var MoostArbac = class extends __prostojs_arbac.Arbac {};
|
|
36
36
|
MoostArbac = _ts_decorate$1([(0, moost.Injectable)()], MoostArbac);
|
|
37
37
|
|
|
38
38
|
//#endregion
|
|
39
39
|
//#region packages/arbac/src/user.provider.ts
|
|
40
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
41
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
42
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
43
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
44
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
40
|
+
function _ts_decorate(decorators, target, key$1, desc) {
|
|
41
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
|
|
43
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
|
|
44
|
+
return c > 3 && r && Object.defineProperty(target, key$1, r), r;
|
|
45
45
|
}
|
|
46
46
|
var ArbacUserProvider = class {
|
|
47
47
|
/**
|
|
@@ -79,11 +79,12 @@ ArbacUserProvider = _ts_decorate([(0, moost.Injectable)()], ArbacUserProvider);
|
|
|
79
79
|
* Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
|
|
80
80
|
*
|
|
81
81
|
* @template TScope - Type representing the scope of access control.
|
|
82
|
-
*/
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
const
|
|
82
|
+
*/ const arbacScopesKey = (0, moost.key)("arbac.scopes");
|
|
83
|
+
function useArbac(ctx) {
|
|
84
|
+
const _ctx = ctx || (0, moost.current)();
|
|
85
|
+
const cc = (0, moost.useControllerContext)(_ctx);
|
|
86
|
+
const getScopes = () => _ctx.has(arbacScopesKey) ? _ctx.get(arbacScopesKey) : void 0;
|
|
87
|
+
const setScopes = (scope) => _ctx.set(arbacScopesKey, scope);
|
|
87
88
|
const evaluate = async (opts) => {
|
|
88
89
|
const user = await cc.instantiate(ArbacUserProvider);
|
|
89
90
|
const userId = await user.getUserId();
|
|
@@ -113,20 +114,22 @@ ArbacUserProvider = _ts_decorate([(0, moost.Injectable)()], ArbacUserProvider);
|
|
|
113
114
|
|
|
114
115
|
//#endregion
|
|
115
116
|
//#region packages/arbac/src/arbac.mate.ts
|
|
116
|
-
function getArbacMate() {
|
|
117
|
+
/** Returns the shared `Mate` instance extended with ARBAC metadata fields. */ function getArbacMate() {
|
|
117
118
|
return (0, moost.getMoostMate)();
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
//#endregion
|
|
121
122
|
//#region packages/arbac/src/arbac.decorator.ts
|
|
122
123
|
/**
|
|
123
|
-
* Interceptor
|
|
124
|
+
* Interceptor that enforces authorization checks based on ARBAC rules.
|
|
124
125
|
* It evaluates the user's permissions against the requested resource and action.
|
|
125
126
|
*
|
|
126
127
|
* @constant
|
|
127
|
-
*/ const arbackAuthorizeInterceptor = (0, moost.
|
|
128
|
-
const
|
|
129
|
-
const
|
|
128
|
+
*/ const arbackAuthorizeInterceptor = (0, moost.defineBeforeInterceptor)(async () => {
|
|
129
|
+
const ctx = (0, moost.current)();
|
|
130
|
+
const l = (0, moost.useLogger)(ctx);
|
|
131
|
+
const logger = typeof l.topic === "function" ? l.topic("arbac") : l;
|
|
132
|
+
const { setScopes, evaluate, resource, action, isPublic } = useArbac(ctx);
|
|
130
133
|
if (!action || !resource || isPublic) return;
|
|
131
134
|
try {
|
|
132
135
|
const { allowed, scopes, userId } = await evaluate({
|
|
@@ -138,7 +141,7 @@ function getArbacMate() {
|
|
|
138
141
|
setScopes(scopes);
|
|
139
142
|
} catch (error) {
|
|
140
143
|
if (error instanceof __wooksjs_event_http.HttpError) throw error;
|
|
141
|
-
logger.warn(error);
|
|
144
|
+
logger.warn(String(error));
|
|
142
145
|
throw new __wooksjs_event_http.HttpError(401, `Authorization error`);
|
|
143
146
|
}
|
|
144
147
|
}, moost.TInterceptorPriority.GUARD);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import * as _prostojs_arbac from '@prostojs/arbac';
|
|
2
2
|
import { Arbac } from '@prostojs/arbac';
|
|
3
|
+
import { EventContext } from '@wooksjs/event-core';
|
|
3
4
|
import * as moost from 'moost';
|
|
4
5
|
import { Mate, TMoostMetadata, TMateParamMeta } from 'moost';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
* Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
|
|
8
|
-
*
|
|
9
|
-
* @template TScope - Type representing the scope of access control.
|
|
10
|
-
*/
|
|
11
|
-
declare function useArbac<TScope extends object>(): {
|
|
7
|
+
declare function useArbac<TScope extends object>(ctx?: EventContext): {
|
|
12
8
|
/**
|
|
13
9
|
* Get evaluated scopes
|
|
14
10
|
*/
|
|
@@ -16,7 +12,7 @@ declare function useArbac<TScope extends object>(): {
|
|
|
16
12
|
/**
|
|
17
13
|
* Set evaluated scopes
|
|
18
14
|
*/
|
|
19
|
-
setScopes: (scope: TScope[] | undefined) =>
|
|
15
|
+
setScopes: (scope: TScope[] | undefined) => void;
|
|
20
16
|
/**
|
|
21
17
|
* Evaluate access control for the given resource and action.
|
|
22
18
|
*/
|
|
@@ -41,12 +37,12 @@ declare function useArbac<TScope extends object>(): {
|
|
|
41
37
|
};
|
|
42
38
|
|
|
43
39
|
/**
|
|
44
|
-
* Interceptor
|
|
40
|
+
* Interceptor that enforces authorization checks based on ARBAC rules.
|
|
45
41
|
* It evaluates the user's permissions against the requested resource and action.
|
|
46
42
|
*
|
|
47
43
|
* @constant
|
|
48
44
|
*/
|
|
49
|
-
declare const arbackAuthorizeInterceptor: moost.
|
|
45
|
+
declare const arbackAuthorizeInterceptor: moost.TInterceptorDef;
|
|
50
46
|
/**
|
|
51
47
|
* Decorator that applies the `arbackAuthorizeInterceptor` to enforce authorization.
|
|
52
48
|
*
|
|
@@ -80,15 +76,17 @@ declare const ArbacAction: (name: string) => MethodDecorator & ClassDecorator &
|
|
|
80
76
|
*/
|
|
81
77
|
declare const ArbacPublic: () => MethodDecorator & ClassDecorator & ParameterDecorator & PropertyDecorator;
|
|
82
78
|
|
|
79
|
+
/** ARBAC metadata fields attached to classes and methods by ARBAC decorators. */
|
|
83
80
|
interface TArbacMeta {
|
|
84
81
|
arbacResourceId?: string;
|
|
85
82
|
arbacActionId?: string;
|
|
86
83
|
arbacPublic?: boolean;
|
|
87
84
|
}
|
|
85
|
+
/** Returns the shared `Mate` instance extended with ARBAC metadata fields. */
|
|
88
86
|
declare function getArbacMate(): Mate<TMoostMetadata & TArbacMeta & {
|
|
89
|
-
params:
|
|
87
|
+
params: TMateParamMeta[];
|
|
90
88
|
}, TMoostMetadata & TArbacMeta & {
|
|
91
|
-
params:
|
|
89
|
+
params: TMateParamMeta[];
|
|
92
90
|
}>;
|
|
93
91
|
|
|
94
92
|
/**
|
package/dist/index.mjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { Injectable, Intercept, Resolve, TInterceptorPriority,
|
|
1
|
+
import { Injectable, Intercept, Resolve, TInterceptorPriority, current, defineBeforeInterceptor, getConstructor, getMoostMate, key, useControllerContext, useLogger } from "moost";
|
|
2
2
|
import { Arbac } from "@prostojs/arbac";
|
|
3
3
|
import { HttpError } from "@wooksjs/event-http";
|
|
4
4
|
|
|
5
5
|
//#region packages/arbac/src/moost-arbac.ts
|
|
6
|
-
function _ts_decorate$1(decorators, target, key, desc) {
|
|
7
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
9
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
10
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
function _ts_decorate$1(decorators, target, key$1, desc) {
|
|
7
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
|
|
9
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
|
|
10
|
+
return c > 3 && r && Object.defineProperty(target, key$1, r), r;
|
|
11
11
|
}
|
|
12
12
|
var MoostArbac = class extends Arbac {};
|
|
13
13
|
MoostArbac = _ts_decorate$1([Injectable()], MoostArbac);
|
|
14
14
|
|
|
15
15
|
//#endregion
|
|
16
16
|
//#region packages/arbac/src/user.provider.ts
|
|
17
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
18
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
19
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
20
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
21
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
17
|
+
function _ts_decorate(decorators, target, key$1, desc) {
|
|
18
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key$1) : desc, d;
|
|
19
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key$1, desc);
|
|
20
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key$1, r) : d(target, key$1)) || r;
|
|
21
|
+
return c > 3 && r && Object.defineProperty(target, key$1, r), r;
|
|
22
22
|
}
|
|
23
23
|
var ArbacUserProvider = class {
|
|
24
24
|
/**
|
|
@@ -56,11 +56,12 @@ ArbacUserProvider = _ts_decorate([Injectable()], ArbacUserProvider);
|
|
|
56
56
|
* Composable for ARBAC (Advanced Role-Based Access Control) utilities within MoostJS.
|
|
57
57
|
*
|
|
58
58
|
* @template TScope - Type representing the scope of access control.
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
const
|
|
59
|
+
*/ const arbacScopesKey = key("arbac.scopes");
|
|
60
|
+
function useArbac(ctx) {
|
|
61
|
+
const _ctx = ctx || current();
|
|
62
|
+
const cc = useControllerContext(_ctx);
|
|
63
|
+
const getScopes = () => _ctx.has(arbacScopesKey) ? _ctx.get(arbacScopesKey) : void 0;
|
|
64
|
+
const setScopes = (scope) => _ctx.set(arbacScopesKey, scope);
|
|
64
65
|
const evaluate = async (opts) => {
|
|
65
66
|
const user = await cc.instantiate(ArbacUserProvider);
|
|
66
67
|
const userId = await user.getUserId();
|
|
@@ -90,20 +91,22 @@ ArbacUserProvider = _ts_decorate([Injectable()], ArbacUserProvider);
|
|
|
90
91
|
|
|
91
92
|
//#endregion
|
|
92
93
|
//#region packages/arbac/src/arbac.mate.ts
|
|
93
|
-
function getArbacMate() {
|
|
94
|
+
/** Returns the shared `Mate` instance extended with ARBAC metadata fields. */ function getArbacMate() {
|
|
94
95
|
return getMoostMate();
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
//#endregion
|
|
98
99
|
//#region packages/arbac/src/arbac.decorator.ts
|
|
99
100
|
/**
|
|
100
|
-
* Interceptor
|
|
101
|
+
* Interceptor that enforces authorization checks based on ARBAC rules.
|
|
101
102
|
* It evaluates the user's permissions against the requested resource and action.
|
|
102
103
|
*
|
|
103
104
|
* @constant
|
|
104
|
-
*/ const arbackAuthorizeInterceptor =
|
|
105
|
-
const
|
|
106
|
-
const
|
|
105
|
+
*/ const arbackAuthorizeInterceptor = defineBeforeInterceptor(async () => {
|
|
106
|
+
const ctx = current();
|
|
107
|
+
const l = useLogger(ctx);
|
|
108
|
+
const logger = typeof l.topic === "function" ? l.topic("arbac") : l;
|
|
109
|
+
const { setScopes, evaluate, resource, action, isPublic } = useArbac(ctx);
|
|
107
110
|
if (!action || !resource || isPublic) return;
|
|
108
111
|
try {
|
|
109
112
|
const { allowed, scopes, userId } = await evaluate({
|
|
@@ -115,7 +118,7 @@ function getArbacMate() {
|
|
|
115
118
|
setScopes(scopes);
|
|
116
119
|
} catch (error) {
|
|
117
120
|
if (error instanceof HttpError) throw error;
|
|
118
|
-
logger.warn(error);
|
|
121
|
+
logger.warn(String(error));
|
|
119
122
|
throw new HttpError(401, `Authorization error`);
|
|
120
123
|
}
|
|
121
124
|
}, TInterceptorPriority.GUARD);
|
package/package.json
CHANGED
|
@@ -1,11 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moostjs/arbac",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Access Control @prostojs/arbac",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"abac",
|
|
7
|
+
"access control",
|
|
8
|
+
"arbac",
|
|
9
|
+
"moost",
|
|
10
|
+
"moostjs",
|
|
11
|
+
"rbac"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/moostjs/moostjs/tree/main/packages/arbac#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/moostjs/moostjs/issues"
|
|
16
|
+
},
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "Artem Maltsev",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/moostjs/moostjs.git",
|
|
22
|
+
"directory": "packages/arbac"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"type": "module",
|
|
28
|
+
"sideEffects": false,
|
|
5
29
|
"main": "dist/index.cjs",
|
|
6
30
|
"module": "dist/index.mjs",
|
|
7
31
|
"types": "dist/index.d.ts",
|
|
8
|
-
"sideEffects": false,
|
|
9
32
|
"exports": {
|
|
10
33
|
"./package.json": "./package.json",
|
|
11
34
|
".": {
|
|
@@ -14,38 +37,17 @@
|
|
|
14
37
|
"require": "./dist/index.cjs"
|
|
15
38
|
}
|
|
16
39
|
},
|
|
17
|
-
"files": [
|
|
18
|
-
"dist"
|
|
19
|
-
],
|
|
20
|
-
"repository": {
|
|
21
|
-
"type": "git",
|
|
22
|
-
"url": "git+https://github.com/moostjs/moostjs.git",
|
|
23
|
-
"directory": "packages/arbac"
|
|
24
|
-
},
|
|
25
|
-
"keywords": [
|
|
26
|
-
"moost",
|
|
27
|
-
"moostjs",
|
|
28
|
-
"arbac",
|
|
29
|
-
"rbac",
|
|
30
|
-
"abac",
|
|
31
|
-
"access control"
|
|
32
|
-
],
|
|
33
|
-
"author": "Artem Maltsev",
|
|
34
|
-
"license": "MIT",
|
|
35
|
-
"bugs": {
|
|
36
|
-
"url": "https://github.com/moostjs/moostjs/issues"
|
|
37
|
-
},
|
|
38
|
-
"homepage": "https://github.com/moostjs/moostjs/tree/main/packages/arbac#readme",
|
|
39
|
-
"peerDependencies": {
|
|
40
|
-
"@wooksjs/event-http": "^0.6.2",
|
|
41
|
-
"moost": "^0.5.33"
|
|
42
|
-
},
|
|
43
40
|
"dependencies": {
|
|
44
41
|
"@prostojs/arbac": "^0.0.2"
|
|
45
42
|
},
|
|
46
43
|
"devDependencies": {
|
|
47
44
|
"vitest": "3.2.4"
|
|
48
45
|
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@wooksjs/event-core": "^0.7.3",
|
|
48
|
+
"@wooksjs/event-http": "^0.7.3",
|
|
49
|
+
"moost": "^0.6.0"
|
|
50
|
+
},
|
|
49
51
|
"scripts": {
|
|
50
52
|
"pub": "pnpm publish --access public",
|
|
51
53
|
"test": "vitest"
|