add eslint; add some compt for controller
This commit is contained in:
parent
59dc2009a5
commit
12a2c7a41c
1
.eslintignore
Normal file
1
.eslintignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
dist/*.js
|
14
.eslintrc.js
Normal file
14
.eslintrc.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/** @format */
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
parser: '@typescript-eslint/parser', //定义ESLint的解析器
|
||||||
|
extends: [
|
||||||
|
'plugin:prettier/recommended', // 使用prettier中的样式规范,且如果使得ESLint会检测prettier的格式问题,同样将格式问题以error的形式抛出
|
||||||
|
],
|
||||||
|
parserOptions: {ecmaVersion: 2019, sourceType: 'module'},
|
||||||
|
env: {
|
||||||
|
//指定代码的运行环境
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
}
|
13
.prettierrc.js
Normal file
13
.prettierrc.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
module.exports = {
|
||||||
|
"printWidth": 120,
|
||||||
|
"semi": false, // 在语句末尾添加分号
|
||||||
|
"singleQuote": true, // 使用单引号而非双引号
|
||||||
|
"trailingComma": "all", // 在任何可能的多行中输入尾逗号
|
||||||
|
"bracketSpacing": true, // 在对象字面量声明所使用的的花括号前后({})输出空格
|
||||||
|
"jsxBracketSameLine": true, // 在多行JSX元素最后一行的末尾添加 > 而使 > 单独一行(不适用于自闭和元素)
|
||||||
|
"arrowParens": "avoid", // 为单行箭头函数的参数添加圆括号。
|
||||||
|
"requirePragma": false, // Prettier可以严格按照按照文件顶部的一些特殊的注释格式化代码
|
||||||
|
"insertPragma": false, // 顶部插入一个 @format
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
};
|
34
dist/common/base.controller.cjs
vendored
Normal file
34
dist/common/base.controller.cjs
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
var __defProp = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
|
var __export = (target, all) => {
|
||||||
|
for (var name in all)
|
||||||
|
__defProp(target, name, { get: all[name], enumerable: true });
|
||||||
|
};
|
||||||
|
var __copyProps = (to, from, except, desc) => {
|
||||||
|
if (from && typeof from === "object" || typeof from === "function") {
|
||||||
|
for (let key of __getOwnPropNames(from))
|
||||||
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||||
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||||
|
}
|
||||||
|
return to;
|
||||||
|
};
|
||||||
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||||
|
|
||||||
|
// src/common/base.controller.ts
|
||||||
|
var base_controller_exports = {};
|
||||||
|
__export(base_controller_exports, {
|
||||||
|
ROLE_ANON: () => ROLE_ANON,
|
||||||
|
default: () => base_controller_default
|
||||||
|
});
|
||||||
|
module.exports = __toCommonJS(base_controller_exports);
|
||||||
|
var ROLE_ANON = "anon";
|
||||||
|
var BaseController = class {
|
||||||
|
};
|
||||||
|
var base_controller_default = BaseController;
|
||||||
|
// Annotate the CommonJS export names for ESM import in node:
|
||||||
|
0 && (module.exports = {
|
||||||
|
ROLE_ANON
|
||||||
|
});
|
||||||
|
//# sourceMappingURL=base.controller.cjs.map
|
1
dist/common/base.controller.cjs.map
vendored
Normal file
1
dist/common/base.controller.cjs.map
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,IAAM,YAAY;AACzB,IAAM,iBAAN,MAAqB;AAErB;AACA,IAAO,0BAAQ;","names":[]}
|
5
dist/common/base.controller.d.cts
vendored
Normal file
5
dist/common/base.controller.d.cts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
declare const ROLE_ANON = "anon";
|
||||||
|
declare class BaseController {
|
||||||
|
}
|
||||||
|
|
||||||
|
export { ROLE_ANON, BaseController as default };
|
5
dist/common/base.controller.d.ts
vendored
Normal file
5
dist/common/base.controller.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
declare const ROLE_ANON = "anon";
|
||||||
|
declare class BaseController {
|
||||||
|
}
|
||||||
|
|
||||||
|
export { ROLE_ANON, BaseController as default };
|
10
dist/common/base.controller.js
vendored
Normal file
10
dist/common/base.controller.js
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// src/common/base.controller.ts
|
||||||
|
var ROLE_ANON = "anon";
|
||||||
|
var BaseController = class {
|
||||||
|
};
|
||||||
|
var base_controller_default = BaseController;
|
||||||
|
export {
|
||||||
|
ROLE_ANON,
|
||||||
|
base_controller_default as default
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=base.controller.js.map
|
1
dist/common/base.controller.js.map
vendored
Normal file
1
dist/common/base.controller.js.map
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nclass BaseController {\n \n}\nexport default BaseController\n"],"mappings":";AACO,IAAM,YAAY;AACzB,IAAM,iBAAN,MAAqB;AAErB;AACA,IAAO,0BAAQ;","names":[]}
|
125
dist/index.cjs
vendored
125
dist/index.cjs
vendored
@ -28,12 +28,19 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|||||||
// src/index.ts
|
// src/index.ts
|
||||||
var src_exports = {};
|
var src_exports = {};
|
||||||
__export(src_exports, {
|
__export(src_exports, {
|
||||||
|
ROLE_ANON: () => ROLE_ANON,
|
||||||
|
RouterData: () => RouterData,
|
||||||
|
RouterMap: () => RouterMap,
|
||||||
SINGLETON_KEY: () => SINGLETON_KEY,
|
SINGLETON_KEY: () => SINGLETON_KEY,
|
||||||
SyncLocker: () => SyncLocker,
|
SyncLocker: () => SyncLocker,
|
||||||
ZError: () => ZError,
|
ZError: () => ZError,
|
||||||
ZRedisClient: () => ZRedisClient,
|
ZRedisClient: () => ZRedisClient,
|
||||||
createAsyncQueue: () => createAsyncQueue,
|
createAsyncQueue: () => createAsyncQueue,
|
||||||
createAsyncQueues: () => createAsyncQueues,
|
createAsyncQueues: () => createAsyncQueues,
|
||||||
|
dept: () => dept,
|
||||||
|
permission: () => permission,
|
||||||
|
role: () => role,
|
||||||
|
router: () => router,
|
||||||
singleton: () => singleton
|
singleton: () => singleton
|
||||||
});
|
});
|
||||||
module.exports = __toCommonJS(src_exports);
|
module.exports = __toCommonJS(src_exports);
|
||||||
@ -94,6 +101,9 @@ SyncLocker = __decorateClass([
|
|||||||
singleton
|
singleton
|
||||||
], SyncLocker);
|
], SyncLocker);
|
||||||
|
|
||||||
|
// src/common/base.controller.ts
|
||||||
|
var ROLE_ANON = "anon";
|
||||||
|
|
||||||
// src/common/AsyncQueue.ts
|
// src/common/AsyncQueue.ts
|
||||||
function createAsyncQueue(opts = { dedupeConcurrent: false }) {
|
function createAsyncQueue(opts = { dedupeConcurrent: false }) {
|
||||||
const { dedupeConcurrent } = opts;
|
const { dedupeConcurrent } = opts;
|
||||||
@ -410,14 +420,129 @@ var ZRedisClient = class {
|
|||||||
ZRedisClient = __decorateClass([
|
ZRedisClient = __decorateClass([
|
||||||
singleton
|
singleton
|
||||||
], ZRedisClient);
|
], ZRedisClient);
|
||||||
|
|
||||||
|
// src/decorators/router.ts
|
||||||
|
var RouterData = class {
|
||||||
|
};
|
||||||
|
var RouterMap = class {
|
||||||
|
};
|
||||||
|
RouterMap.decoratedRouters = /* @__PURE__ */ new Map();
|
||||||
|
function router(route) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
if (!route) {
|
||||||
|
const controller = target.constructor.name;
|
||||||
|
const controllerName = controller.toLowerCase().replace(".controller", "");
|
||||||
|
route = "all " + ["", controllerName, name].join("/");
|
||||||
|
}
|
||||||
|
const split = route.split(" ");
|
||||||
|
if (split.length > 2) {
|
||||||
|
throw new Error("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C");
|
||||||
|
}
|
||||||
|
const [method, path] = split;
|
||||||
|
const key = target[name];
|
||||||
|
let routerData = new RouterData();
|
||||||
|
routerData.target = target;
|
||||||
|
routerData.method = method;
|
||||||
|
routerData.path = path;
|
||||||
|
routerData.fun = target[name];
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
if (!objCurrent.data) {
|
||||||
|
objCurrent.data = [routerData];
|
||||||
|
} else {
|
||||||
|
objCurrent.data.push(routerData);
|
||||||
|
}
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
let routerObj = {
|
||||||
|
data: [routerData]
|
||||||
|
};
|
||||||
|
RouterMap.decoratedRouters.set(target[name], routerObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function role(roles) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let roleList = [];
|
||||||
|
if (roles) {
|
||||||
|
if (Array.isArray(roles)) {
|
||||||
|
roleList = roles;
|
||||||
|
} else {
|
||||||
|
roleList = [roles];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let roleObj = { roles: roleList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, roleObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], roleObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function permission(permissions) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let permissionList = [[]];
|
||||||
|
if (permissions) {
|
||||||
|
if (Array.isArray(permissions)) {
|
||||||
|
let arr = [];
|
||||||
|
for (let sub of permissions) {
|
||||||
|
arr.push(sub.split(":"));
|
||||||
|
}
|
||||||
|
permissionList = arr;
|
||||||
|
} else {
|
||||||
|
permissionList = [permissions.split(":")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let permissionObj = { permissions: permissionList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, permissionObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], permissionObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function dept(depts) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let deptList = [];
|
||||||
|
if (depts) {
|
||||||
|
if (Array.isArray(depts)) {
|
||||||
|
deptList = depts;
|
||||||
|
} else {
|
||||||
|
deptList = [depts];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let deptObj = { depts: deptList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, deptObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], deptObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
// Annotate the CommonJS export names for ESM import in node:
|
// Annotate the CommonJS export names for ESM import in node:
|
||||||
0 && (module.exports = {
|
0 && (module.exports = {
|
||||||
|
ROLE_ANON,
|
||||||
|
RouterData,
|
||||||
|
RouterMap,
|
||||||
SINGLETON_KEY,
|
SINGLETON_KEY,
|
||||||
SyncLocker,
|
SyncLocker,
|
||||||
ZError,
|
ZError,
|
||||||
ZRedisClient,
|
ZRedisClient,
|
||||||
createAsyncQueue,
|
createAsyncQueue,
|
||||||
createAsyncQueues,
|
createAsyncQueues,
|
||||||
|
dept,
|
||||||
|
permission,
|
||||||
|
role,
|
||||||
|
router,
|
||||||
singleton
|
singleton
|
||||||
});
|
});
|
||||||
//# sourceMappingURL=index.cjs.map
|
//# sourceMappingURL=index.cjs.map
|
2
dist/index.cjs.map
vendored
2
dist/index.cjs.map
vendored
File diff suppressed because one or more lines are too long
58
dist/index.d.cts
vendored
58
dist/index.d.cts
vendored
@ -1,24 +1,10 @@
|
|||||||
export { ZError } from './common/ZError.cjs';
|
export { ZError } from './common/ZError.cjs';
|
||||||
export { SyncLocker } from './common/SyncLocker.cjs';
|
export { SyncLocker } from './common/SyncLocker.cjs';
|
||||||
|
import BaseController from './common/base.controller.cjs';
|
||||||
|
export { ROLE_ANON } from './common/base.controller.cjs';
|
||||||
export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.cjs';
|
export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.cjs';
|
||||||
import { RedisClient, ClientOpts } from 'redis';
|
import { RedisClient, ClientOpts } from 'redis';
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例化一个class
|
|
||||||
* 使用方法:
|
|
||||||
* @singleton
|
|
||||||
* class Test {}
|
|
||||||
* new Test() === new Test() // returns `true`
|
|
||||||
* 也可以不使用 decorator
|
|
||||||
* const TestSingleton = singleton(Test)
|
|
||||||
* new TestSingleton() === new TestSingleton() //returns 'true'
|
|
||||||
*/
|
|
||||||
declare const SINGLETON_KEY: unique symbol;
|
|
||||||
type Singleton<T extends new (...args: any[]) => any> = T & {
|
|
||||||
[SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never;
|
|
||||||
};
|
|
||||||
declare const singleton: <T extends new (...args: any[]) => any>(classTarget: T) => T;
|
|
||||||
|
|
||||||
type Callback = (...args: any[]) => void;
|
type Callback = (...args: any[]) => void;
|
||||||
declare class ZRedisClient {
|
declare class ZRedisClient {
|
||||||
pub: RedisClient;
|
pub: RedisClient;
|
||||||
@ -74,4 +60,42 @@ declare class ZRedisClient {
|
|||||||
protected handleSubscription: (channel: string, message: string) => void;
|
protected handleSubscription: (channel: string, message: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { SINGLETON_KEY, type Singleton, ZRedisClient, singleton };
|
declare class RouterData {
|
||||||
|
target?: any;
|
||||||
|
method?: string;
|
||||||
|
path?: string;
|
||||||
|
fun?: Function;
|
||||||
|
}
|
||||||
|
declare class RouterMap {
|
||||||
|
static decoratedRouters: Map<Function, {
|
||||||
|
roles?: string[];
|
||||||
|
permissions?: string[][];
|
||||||
|
data?: RouterData[];
|
||||||
|
depts?: string[];
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
/**
|
||||||
|
* 有dept修饰器的, 需要验证部门id是否存在
|
||||||
|
*/
|
||||||
|
declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单例化一个class
|
||||||
|
* 使用方法:
|
||||||
|
* @singleton
|
||||||
|
* class Test {}
|
||||||
|
* new Test() === new Test() // returns `true`
|
||||||
|
* 也可以不使用 decorator
|
||||||
|
* const TestSingleton = singleton(Test)
|
||||||
|
* new TestSingleton() === new TestSingleton() //returns 'true'
|
||||||
|
*/
|
||||||
|
declare const SINGLETON_KEY: unique symbol;
|
||||||
|
type Singleton<T extends new (...args: any[]) => any> = T & {
|
||||||
|
[SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never;
|
||||||
|
};
|
||||||
|
declare const singleton: <T extends new (...args: any[]) => any>(classTarget: T) => T;
|
||||||
|
|
||||||
|
export { RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton };
|
||||||
|
58
dist/index.d.ts
vendored
58
dist/index.d.ts
vendored
@ -1,24 +1,10 @@
|
|||||||
export { ZError } from './common/ZError.js';
|
export { ZError } from './common/ZError.js';
|
||||||
export { SyncLocker } from './common/SyncLocker.js';
|
export { SyncLocker } from './common/SyncLocker.js';
|
||||||
|
import BaseController from './common/base.controller.js';
|
||||||
|
export { ROLE_ANON } from './common/base.controller.js';
|
||||||
export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.js';
|
export { AsyncQueue, createAsyncQueue, createAsyncQueues } from './common/AsyncQueue.js';
|
||||||
import { RedisClient, ClientOpts } from 'redis';
|
import { RedisClient, ClientOpts } from 'redis';
|
||||||
|
|
||||||
/**
|
|
||||||
* 单例化一个class
|
|
||||||
* 使用方法:
|
|
||||||
* @singleton
|
|
||||||
* class Test {}
|
|
||||||
* new Test() === new Test() // returns `true`
|
|
||||||
* 也可以不使用 decorator
|
|
||||||
* const TestSingleton = singleton(Test)
|
|
||||||
* new TestSingleton() === new TestSingleton() //returns 'true'
|
|
||||||
*/
|
|
||||||
declare const SINGLETON_KEY: unique symbol;
|
|
||||||
type Singleton<T extends new (...args: any[]) => any> = T & {
|
|
||||||
[SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never;
|
|
||||||
};
|
|
||||||
declare const singleton: <T extends new (...args: any[]) => any>(classTarget: T) => T;
|
|
||||||
|
|
||||||
type Callback = (...args: any[]) => void;
|
type Callback = (...args: any[]) => void;
|
||||||
declare class ZRedisClient {
|
declare class ZRedisClient {
|
||||||
pub: RedisClient;
|
pub: RedisClient;
|
||||||
@ -74,4 +60,42 @@ declare class ZRedisClient {
|
|||||||
protected handleSubscription: (channel: string, message: string) => void;
|
protected handleSubscription: (channel: string, message: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { SINGLETON_KEY, type Singleton, ZRedisClient, singleton };
|
declare class RouterData {
|
||||||
|
target?: any;
|
||||||
|
method?: string;
|
||||||
|
path?: string;
|
||||||
|
fun?: Function;
|
||||||
|
}
|
||||||
|
declare class RouterMap {
|
||||||
|
static decoratedRouters: Map<Function, {
|
||||||
|
roles?: string[];
|
||||||
|
permissions?: string[][];
|
||||||
|
data?: RouterData[];
|
||||||
|
depts?: string[];
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
/**
|
||||||
|
* 有dept修饰器的, 需要验证部门id是否存在
|
||||||
|
*/
|
||||||
|
declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单例化一个class
|
||||||
|
* 使用方法:
|
||||||
|
* @singleton
|
||||||
|
* class Test {}
|
||||||
|
* new Test() === new Test() // returns `true`
|
||||||
|
* 也可以不使用 decorator
|
||||||
|
* const TestSingleton = singleton(Test)
|
||||||
|
* new TestSingleton() === new TestSingleton() //returns 'true'
|
||||||
|
*/
|
||||||
|
declare const SINGLETON_KEY: unique symbol;
|
||||||
|
type Singleton<T extends new (...args: any[]) => any> = T & {
|
||||||
|
[SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never;
|
||||||
|
};
|
||||||
|
declare const singleton: <T extends new (...args: any[]) => any>(classTarget: T) => T;
|
||||||
|
|
||||||
|
export { RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton };
|
||||||
|
118
dist/index.js
vendored
118
dist/index.js
vendored
@ -66,6 +66,9 @@ SyncLocker = __decorateClass([
|
|||||||
singleton
|
singleton
|
||||||
], SyncLocker);
|
], SyncLocker);
|
||||||
|
|
||||||
|
// src/common/base.controller.ts
|
||||||
|
var ROLE_ANON = "anon";
|
||||||
|
|
||||||
// src/common/AsyncQueue.ts
|
// src/common/AsyncQueue.ts
|
||||||
function createAsyncQueue(opts = { dedupeConcurrent: false }) {
|
function createAsyncQueue(opts = { dedupeConcurrent: false }) {
|
||||||
const { dedupeConcurrent } = opts;
|
const { dedupeConcurrent } = opts;
|
||||||
@ -382,13 +385,128 @@ var ZRedisClient = class {
|
|||||||
ZRedisClient = __decorateClass([
|
ZRedisClient = __decorateClass([
|
||||||
singleton
|
singleton
|
||||||
], ZRedisClient);
|
], ZRedisClient);
|
||||||
|
|
||||||
|
// src/decorators/router.ts
|
||||||
|
var RouterData = class {
|
||||||
|
};
|
||||||
|
var RouterMap = class {
|
||||||
|
};
|
||||||
|
RouterMap.decoratedRouters = /* @__PURE__ */ new Map();
|
||||||
|
function router(route) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
if (!route) {
|
||||||
|
const controller = target.constructor.name;
|
||||||
|
const controllerName = controller.toLowerCase().replace(".controller", "");
|
||||||
|
route = "all " + ["", controllerName, name].join("/");
|
||||||
|
}
|
||||||
|
const split = route.split(" ");
|
||||||
|
if (split.length > 2) {
|
||||||
|
throw new Error("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C");
|
||||||
|
}
|
||||||
|
const [method, path] = split;
|
||||||
|
const key = target[name];
|
||||||
|
let routerData = new RouterData();
|
||||||
|
routerData.target = target;
|
||||||
|
routerData.method = method;
|
||||||
|
routerData.path = path;
|
||||||
|
routerData.fun = target[name];
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
if (!objCurrent.data) {
|
||||||
|
objCurrent.data = [routerData];
|
||||||
|
} else {
|
||||||
|
objCurrent.data.push(routerData);
|
||||||
|
}
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
let routerObj = {
|
||||||
|
data: [routerData]
|
||||||
|
};
|
||||||
|
RouterMap.decoratedRouters.set(target[name], routerObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function role(roles) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let roleList = [];
|
||||||
|
if (roles) {
|
||||||
|
if (Array.isArray(roles)) {
|
||||||
|
roleList = roles;
|
||||||
|
} else {
|
||||||
|
roleList = [roles];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let roleObj = { roles: roleList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, roleObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], roleObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function permission(permissions) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let permissionList = [[]];
|
||||||
|
if (permissions) {
|
||||||
|
if (Array.isArray(permissions)) {
|
||||||
|
let arr = [];
|
||||||
|
for (let sub of permissions) {
|
||||||
|
arr.push(sub.split(":"));
|
||||||
|
}
|
||||||
|
permissionList = arr;
|
||||||
|
} else {
|
||||||
|
permissionList = [permissions.split(":")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let permissionObj = { permissions: permissionList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, permissionObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], permissionObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function dept(depts) {
|
||||||
|
return (target, name, value) => {
|
||||||
|
let deptList = [];
|
||||||
|
if (depts) {
|
||||||
|
if (Array.isArray(depts)) {
|
||||||
|
deptList = depts;
|
||||||
|
} else {
|
||||||
|
deptList = [depts];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const key = target[name];
|
||||||
|
let deptObj = { depts: deptList };
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key);
|
||||||
|
Object.assign(objCurrent, deptObj);
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent);
|
||||||
|
} else {
|
||||||
|
RouterMap.decoratedRouters.set(target[name], deptObj);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
export {
|
export {
|
||||||
|
ROLE_ANON,
|
||||||
|
RouterData,
|
||||||
|
RouterMap,
|
||||||
SINGLETON_KEY,
|
SINGLETON_KEY,
|
||||||
SyncLocker,
|
SyncLocker,
|
||||||
ZError,
|
ZError,
|
||||||
ZRedisClient,
|
ZRedisClient,
|
||||||
createAsyncQueue,
|
createAsyncQueue,
|
||||||
createAsyncQueues,
|
createAsyncQueues,
|
||||||
|
dept,
|
||||||
|
permission,
|
||||||
|
role,
|
||||||
|
router,
|
||||||
singleton
|
singleton
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
2
dist/index.js.map
vendored
2
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
@ -25,7 +25,8 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsup",
|
"build": "tsup",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"lint": "eslint --ext .ts src/**",
|
||||||
|
"format": "eslint --ext .ts src/** --fix"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
@ -38,6 +39,12 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/redis": "^2.8.28",
|
"@types/redis": "^2.8.28",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
||||||
|
"@typescript-eslint/parser": "^4.25.0",
|
||||||
|
"eslint": "^7.27.0",
|
||||||
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
|
"prettier": "^2.3.0",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tsup": "^8.0.1",
|
"tsup": "^8.0.1",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
|
6
src/common/base.controller.ts
Normal file
6
src/common/base.controller.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
export const ROLE_ANON = 'anon'
|
||||||
|
class BaseController {
|
||||||
|
|
||||||
|
}
|
||||||
|
export default BaseController
|
142
src/decorators/router.ts
Normal file
142
src/decorators/router.ts
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
import BaseController from '../common/base.controller'
|
||||||
|
|
||||||
|
export class RouterData {
|
||||||
|
target?: any
|
||||||
|
method?: string
|
||||||
|
path?: string
|
||||||
|
fun?: Function
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RouterMap {
|
||||||
|
static decoratedRouters: Map<
|
||||||
|
Function,
|
||||||
|
{
|
||||||
|
roles?: string[]
|
||||||
|
permissions?: string[][]
|
||||||
|
data?: RouterData[]
|
||||||
|
depts?: string[]
|
||||||
|
}
|
||||||
|
> = new Map()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function router(route?: string) {
|
||||||
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
||||||
|
if (!route) {
|
||||||
|
const controller = target.constructor.name
|
||||||
|
const controllerName = controller.toLowerCase().replace('.controller', '')
|
||||||
|
route = 'all ' + ['', controllerName, name].join('/')
|
||||||
|
}
|
||||||
|
const split = route.split(' ')
|
||||||
|
if (split.length > 2) {
|
||||||
|
throw new Error('路由中只允许一个空格')
|
||||||
|
}
|
||||||
|
const [method, path] = split
|
||||||
|
// @ts-ignore
|
||||||
|
const key = target[name]
|
||||||
|
let routerData = new RouterData()
|
||||||
|
routerData.target = target
|
||||||
|
routerData.method = method
|
||||||
|
routerData.path = path
|
||||||
|
// @ts-ignore
|
||||||
|
routerData.fun = target[name]
|
||||||
|
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
||||||
|
if (!objCurrent.data) {
|
||||||
|
objCurrent.data = [routerData]
|
||||||
|
} else {
|
||||||
|
objCurrent.data.push(routerData)
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
||||||
|
} else {
|
||||||
|
let routerObj = {
|
||||||
|
data: [routerData],
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], routerObj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function role(roles?: string | string[]) {
|
||||||
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
||||||
|
let roleList: string[] = []
|
||||||
|
if (roles) {
|
||||||
|
if (Array.isArray(roles)) {
|
||||||
|
roleList = roles
|
||||||
|
} else {
|
||||||
|
roleList = [roles]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
const key = target[name]
|
||||||
|
let roleObj = { roles: roleList }
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
||||||
|
Object.assign(objCurrent, roleObj)
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], roleObj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function permission(permissions?: string | string[]) {
|
||||||
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
||||||
|
let permissionList: string[][] = [[]]
|
||||||
|
if (permissions) {
|
||||||
|
if (Array.isArray(permissions)) {
|
||||||
|
let arr = []
|
||||||
|
for (let sub of permissions) {
|
||||||
|
arr.push(sub.split(':'))
|
||||||
|
}
|
||||||
|
permissionList = arr
|
||||||
|
} else {
|
||||||
|
permissionList = [permissions.split(':')]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
const key = target[name]
|
||||||
|
let permissionObj = { permissions: permissionList }
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
||||||
|
Object.assign(objCurrent, permissionObj)
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], permissionObj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有dept修饰器的, 需要验证部门id是否存在
|
||||||
|
*/
|
||||||
|
export function dept(depts?: string | string[]) {
|
||||||
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
||||||
|
let deptList: string[] = []
|
||||||
|
if (depts) {
|
||||||
|
if (Array.isArray(depts)) {
|
||||||
|
deptList = depts
|
||||||
|
} else {
|
||||||
|
deptList = [depts]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
const key = target[name]
|
||||||
|
let deptObj = { depts: deptList }
|
||||||
|
if (RouterMap.decoratedRouters.has(key)) {
|
||||||
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
||||||
|
Object.assign(objCurrent, deptObj)
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
RouterMap.decoratedRouters.set(target[name], deptObj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
src/index.ts
12
src/index.ts
@ -1,5 +1,9 @@
|
|||||||
export { ZError } from './common/ZError'
|
export * from './common/ZError'
|
||||||
export { SyncLocker } from './common/SyncLocker'
|
export * from './common/SyncLocker'
|
||||||
export * from './decorators/singleton'
|
export * from './common/base.controller'
|
||||||
export * from './common/AsyncQueue'
|
export * from './common/AsyncQueue'
|
||||||
export { ZRedisClient } from './redis/ZRedisClient'
|
|
||||||
|
export * from './redis/ZRedisClient'
|
||||||
|
|
||||||
|
export * from './decorators/router'
|
||||||
|
export * from './decorators/singleton'
|
@ -1,6 +1,6 @@
|
|||||||
import { singleton } from 'decorators/singleton'
|
import { singleton } from 'decorators/singleton'
|
||||||
import { ClientOpts, RedisClient, createClient } from 'redis'
|
import { ClientOpts, RedisClient, createClient } from 'redis'
|
||||||
import { promisify } from 'util'
|
import { promisify } from "util";
|
||||||
|
|
||||||
|
|
||||||
type Callback = (...args: any[]) => void
|
type Callback = (...args: any[]) => void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user