@avleon/core 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/README.md +3 -0
- package/dist/authentication.d.ts +9 -0
- package/dist/authentication.js +11 -0
- package/dist/collection.d.ts +52 -0
- package/dist/collection.js +282 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/container.d.ts +4 -5
- package/dist/container.js +9 -13
- package/dist/decorators.d.ts +2 -1
- package/dist/decorators.js +12 -2
- package/dist/environment-variables.d.ts +3 -0
- package/dist/environment-variables.js +33 -0
- package/dist/exceptions/http-exceptions.d.ts +24 -1
- package/dist/exceptions/http-exceptions.js +33 -2
- package/dist/helpers.d.ts +8 -1
- package/dist/helpers.js +55 -27
- package/dist/icore.d.ts +60 -16
- package/dist/icore.js +354 -134
- package/dist/index.d.ts +10 -6
- package/dist/index.js +6 -1
- package/dist/map-types.js +1 -2
- package/dist/middleware.d.ts +10 -0
- package/dist/middleware.js +37 -0
- package/dist/params.d.ts +1 -0
- package/dist/params.js +13 -9
- package/dist/queue.d.ts +30 -0
- package/dist/queue.js +96 -0
- package/dist/render.d.ts +1 -0
- package/dist/render.js +8 -0
- package/dist/response.d.ts +3 -2
- package/dist/response.js +9 -15
- package/dist/types/app-builder.interface.d.ts +9 -0
- package/dist/types/app-builder.interface.js +2 -0
- package/dist/types/application.interface.d.ts +2 -0
- package/dist/types/application.interface.js +2 -0
- package/dist/validator-extend.js +2 -2
- package/package.json +45 -39
- package/dist/repository.d.ts +0 -0
- package/dist/repository.js +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppMiddleware = void 0;
|
|
4
|
+
exports.Middleware = Middleware;
|
|
5
|
+
exports.UseMiddleware = UseMiddleware;
|
|
6
|
+
const typedi_1 = require("typedi");
|
|
7
|
+
class AppMiddleware {
|
|
8
|
+
}
|
|
9
|
+
exports.AppMiddleware = AppMiddleware;
|
|
10
|
+
// export function CurrentUser(): ParameterDecorator {
|
|
11
|
+
// return (target, propertyKey, parameterIndex) => {
|
|
12
|
+
// const existingMetadata =
|
|
13
|
+
// Reflect.getMetadata("currentUser:params", target, propertyKey!) || [];
|
|
14
|
+
// existingMetadata.push(parameterIndex);
|
|
15
|
+
// Reflect.defineMetadata("currentUser:params", existingMetadata, target, propertyKey!);
|
|
16
|
+
// };
|
|
17
|
+
// }
|
|
18
|
+
function Middleware(target) {
|
|
19
|
+
if (typeof target.prototype.invoke !== "function") {
|
|
20
|
+
throw new Error(`Class "${target.name}" must implement an "invoke" method.`);
|
|
21
|
+
}
|
|
22
|
+
(0, typedi_1.Service)()(target);
|
|
23
|
+
}
|
|
24
|
+
function UseMiddleware(options) {
|
|
25
|
+
return function (target, propertyKey, descriptor) {
|
|
26
|
+
const normalizeMiddleware = (middleware) => typeof middleware === "function" ? new middleware() : middleware;
|
|
27
|
+
const middlewareList = (Array.isArray(options) ? options : [options]).map(normalizeMiddleware);
|
|
28
|
+
if (typeof target === "function" && !propertyKey) {
|
|
29
|
+
const existingMiddlewares = Reflect.getMetadata("controller:middleware", target) || [];
|
|
30
|
+
Reflect.defineMetadata("controller:middleware", [...existingMiddlewares, ...middlewareList], target);
|
|
31
|
+
}
|
|
32
|
+
else if (descriptor) {
|
|
33
|
+
const existingMiddlewares = Reflect.getMetadata("route:middleware", target, propertyKey) || [];
|
|
34
|
+
Reflect.defineMetadata("route:middleware", [...existingMiddlewares, ...middlewareList], target, propertyKey);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
package/dist/params.d.ts
CHANGED
|
@@ -13,4 +13,5 @@ export declare const Param: (key?: string | ParameterOptions, options?: Paramete
|
|
|
13
13
|
export declare const Query: (key?: string | ParameterOptions, options?: ParameterOptions) => ParameterDecorator;
|
|
14
14
|
export declare const Body: (key?: string | ParameterOptions, options?: ParameterOptions) => ParameterDecorator;
|
|
15
15
|
export declare const Header: (key?: string | ParameterOptions, options?: ParameterOptions) => ParameterDecorator;
|
|
16
|
+
export declare const AuthUser: (key?: string | ParameterOptions, options?: ParameterOptions) => ParameterDecorator;
|
|
16
17
|
export {};
|
package/dist/params.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Header = exports.Body = exports.Query = exports.Param = void 0;
|
|
3
|
+
exports.AuthUser = exports.Header = exports.Body = exports.Query = exports.Param = void 0;
|
|
4
4
|
const container_1 = require("./container");
|
|
5
5
|
const helpers_1 = require("./helpers");
|
|
6
6
|
function createParamDecorator(type) {
|
|
@@ -10,29 +10,33 @@ function createParamDecorator(type) {
|
|
|
10
10
|
const existingParams = Reflect.getMetadata(type, target, propertyKey) || [];
|
|
11
11
|
const parameterTypes = Reflect.getMetadata("design:paramtypes", target, propertyKey) || [];
|
|
12
12
|
const functionSource = target[propertyKey].toString();
|
|
13
|
-
const paramNames = (_a = functionSource
|
|
13
|
+
const paramNames = (_a = functionSource
|
|
14
|
+
.match(/\(([^)]*)\)/)) === null || _a === void 0 ? void 0 : _a[1].split(",").map((name) => name.trim());
|
|
14
15
|
const paramDataType = parameterTypes[parameterIndex];
|
|
15
16
|
existingParams.push({
|
|
16
17
|
index: parameterIndex,
|
|
17
|
-
key: key ? key :
|
|
18
|
+
key: key ? key : "all",
|
|
18
19
|
name: paramNames[parameterIndex],
|
|
19
20
|
required: options.required || false,
|
|
20
21
|
validate: options.validate || true,
|
|
21
22
|
dataType: (0, helpers_1.getDataType)(paramDataType),
|
|
22
23
|
validatorClass: (0, helpers_1.isClassValidatorClass)(paramDataType),
|
|
23
|
-
type
|
|
24
|
+
type,
|
|
24
25
|
});
|
|
25
26
|
switch (type) {
|
|
26
|
-
case
|
|
27
|
+
case "route:param":
|
|
27
28
|
Reflect.defineMetadata(container_1.PARAM_META_KEY, existingParams, target, propertyKey);
|
|
28
29
|
break;
|
|
29
|
-
case
|
|
30
|
+
case "route:query":
|
|
30
31
|
Reflect.defineMetadata(container_1.QUERY_META_KEY, existingParams, target, propertyKey);
|
|
31
32
|
break;
|
|
32
|
-
case
|
|
33
|
+
case "route:body":
|
|
33
34
|
Reflect.defineMetadata(container_1.REQUEST_BODY_META_KEY, existingParams, target, propertyKey);
|
|
34
35
|
break;
|
|
35
|
-
case
|
|
36
|
+
case "route:user":
|
|
37
|
+
Reflect.defineMetadata(container_1.REQUEST_USER_META_KEY, existingParams, target, propertyKey);
|
|
38
|
+
break;
|
|
39
|
+
case "route:header":
|
|
36
40
|
Reflect.defineMetadata(container_1.REQUEST_HEADER_META_KEY, existingParams, target, propertyKey);
|
|
37
41
|
break;
|
|
38
42
|
default:
|
|
@@ -45,4 +49,4 @@ exports.Param = createParamDecorator("route:param");
|
|
|
45
49
|
exports.Query = createParamDecorator("route:query");
|
|
46
50
|
exports.Body = createParamDecorator("route:body");
|
|
47
51
|
exports.Header = createParamDecorator("route:header");
|
|
48
|
-
|
|
52
|
+
exports.AuthUser = createParamDecorator("route:user");
|
package/dist/queue.d.ts
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface Job {
|
|
2
|
+
id: string;
|
|
3
|
+
data: any;
|
|
4
|
+
}
|
|
5
|
+
interface QueueAdapter {
|
|
6
|
+
loadJobs(): Promise<Job[]>;
|
|
7
|
+
saveJobs(jobs: Job[]): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare class FileQueueAdapter implements QueueAdapter {
|
|
10
|
+
private queueFile;
|
|
11
|
+
constructor(queueName: string);
|
|
12
|
+
loadJobs(): Promise<Job[]>;
|
|
13
|
+
saveJobs(jobs: Job[]): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
declare class SimpleQueue {
|
|
16
|
+
private processing;
|
|
17
|
+
private jobHandler;
|
|
18
|
+
private adapter;
|
|
19
|
+
constructor(adapter: QueueAdapter, jobHandler: (job: Job) => Promise<void>);
|
|
20
|
+
addJob(data: any): Promise<void>;
|
|
21
|
+
private processNext;
|
|
22
|
+
}
|
|
23
|
+
export declare class QueueManager {
|
|
24
|
+
private static instance;
|
|
25
|
+
private adapter;
|
|
26
|
+
private constructor();
|
|
27
|
+
static getInstance(adapter: QueueAdapter): QueueManager;
|
|
28
|
+
createQueue(jobHandler: (job: Job) => Promise<void>): SimpleQueue;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
package/dist/queue.js
CHANGED
|
@@ -1 +1,97 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueueManager = exports.FileQueueAdapter = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
class FileQueueAdapter {
|
|
8
|
+
constructor(queueName) {
|
|
9
|
+
this.queueFile = (0, path_1.join)(__dirname, `${queueName}.json`);
|
|
10
|
+
}
|
|
11
|
+
async loadJobs() {
|
|
12
|
+
try {
|
|
13
|
+
const data = await fs_1.promises.readFile(this.queueFile, "utf-8");
|
|
14
|
+
return JSON.parse(data);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async saveJobs(jobs) {
|
|
21
|
+
await fs_1.promises.writeFile(this.queueFile, JSON.stringify(jobs, null, 2), "utf-8");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.FileQueueAdapter = FileQueueAdapter;
|
|
25
|
+
// class RedisQueueAdapter implements QueueAdapter {
|
|
26
|
+
// private client = createClient();
|
|
27
|
+
// private queueKey: string;
|
|
28
|
+
//
|
|
29
|
+
// constructor(queueName: string) {
|
|
30
|
+
// this.queueKey = `queue:${queueName}`;
|
|
31
|
+
// this.client.connect();
|
|
32
|
+
// }
|
|
33
|
+
//
|
|
34
|
+
// async loadJobs(): Promise<Job[]> {
|
|
35
|
+
// const jobs = await this.client.lRange(this.queueKey, 0, -1);
|
|
36
|
+
// return jobs.map((job) => JSON.parse(job));
|
|
37
|
+
// }
|
|
38
|
+
//
|
|
39
|
+
// async saveJobs(jobs: Job[]) {
|
|
40
|
+
// await this.client.del(this.queueKey);
|
|
41
|
+
// if (jobs.length > 0) {
|
|
42
|
+
// await this.client.rPush(this.queueKey, ...jobs.map(job => JSON.stringify(job)));
|
|
43
|
+
// }
|
|
44
|
+
// }
|
|
45
|
+
// }
|
|
46
|
+
class SimpleQueue {
|
|
47
|
+
constructor(adapter, jobHandler) {
|
|
48
|
+
this.processing = false;
|
|
49
|
+
this.adapter = adapter;
|
|
50
|
+
this.jobHandler = jobHandler;
|
|
51
|
+
}
|
|
52
|
+
async addJob(data) {
|
|
53
|
+
const job = { id: helpers_1.uuid, data };
|
|
54
|
+
const jobs = await this.adapter.loadJobs();
|
|
55
|
+
jobs.push(job);
|
|
56
|
+
await this.adapter.saveJobs(jobs);
|
|
57
|
+
this.processNext();
|
|
58
|
+
}
|
|
59
|
+
async processNext() {
|
|
60
|
+
if (this.processing)
|
|
61
|
+
return;
|
|
62
|
+
this.processing = true;
|
|
63
|
+
const jobs = await this.adapter.loadJobs();
|
|
64
|
+
if (jobs.length === 0) {
|
|
65
|
+
this.processing = false;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const job = jobs.shift();
|
|
69
|
+
if (job) {
|
|
70
|
+
try {
|
|
71
|
+
await this.jobHandler(job);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`Error processing job ${job.id}:`, error);
|
|
75
|
+
jobs.unshift(job);
|
|
76
|
+
}
|
|
77
|
+
await this.adapter.saveJobs(jobs);
|
|
78
|
+
this.processing = false;
|
|
79
|
+
this.processNext();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
class QueueManager {
|
|
84
|
+
constructor(adapter) {
|
|
85
|
+
this.adapter = adapter;
|
|
86
|
+
}
|
|
87
|
+
static getInstance(adapter) {
|
|
88
|
+
if (!QueueManager.instance) {
|
|
89
|
+
QueueManager.instance = new QueueManager(adapter);
|
|
90
|
+
}
|
|
91
|
+
return QueueManager.instance;
|
|
92
|
+
}
|
|
93
|
+
createQueue(jobHandler) {
|
|
94
|
+
return new SimpleQueue(this.adapter, jobHandler);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.QueueManager = QueueManager;
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function render(viewPath: string, data: any): void;
|
package/dist/render.js
ADDED
package/dist/response.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { ClassConstructor } from "class-transformer";
|
|
2
3
|
export interface IHttpResponse<T extends any> {
|
|
3
4
|
message: string;
|
|
4
5
|
data: T | null;
|
|
5
6
|
}
|
|
6
7
|
export declare class HttpResponse {
|
|
7
|
-
static Ok<T
|
|
8
|
+
static Ok<T>(obj: any, s?: ClassConstructor<T>): any;
|
|
8
9
|
static NoContent(): void;
|
|
9
10
|
}
|
package/dist/response.js
CHANGED
|
@@ -7,7 +7,7 @@ function isClassTransformerClass(target) {
|
|
|
7
7
|
const prototype = target.prototype;
|
|
8
8
|
const keys = Reflect.getMetadataKeys(prototype);
|
|
9
9
|
// Check for class-transformer metadata
|
|
10
|
-
return keys.some(key => key.startsWith(
|
|
10
|
+
return keys.some((key) => key.startsWith("class_transformer:"));
|
|
11
11
|
}
|
|
12
12
|
function isClassTransformerType(target) {
|
|
13
13
|
return isClassTransformerClass(target);
|
|
@@ -15,21 +15,15 @@ function isClassTransformerType(target) {
|
|
|
15
15
|
class HttpResponse {
|
|
16
16
|
static Ok(obj, s) {
|
|
17
17
|
if (s) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
return { message: "success", data };
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
return { message: "success", data: obj };
|
|
18
|
+
const isPaginated = obj === null || obj === void 0 ? void 0 : obj.hasOwnProperty("total");
|
|
19
|
+
// Ensure transformation applies only allowed properties
|
|
20
|
+
const transformedData = (0, class_transformer_1.plainToInstance)(s, isPaginated ? obj.data : obj, {
|
|
21
|
+
enableImplicitConversion: true,
|
|
22
|
+
excludeExtraneousValues: true, // Ensures only @Expose() properties are included
|
|
23
|
+
});
|
|
24
|
+
return Object.assign({ message: "success" }, (isPaginated ? Object.assign(Object.assign({}, obj), { data: (0, class_transformer_1.instanceToPlain)(transformedData) }) : { data: (0, class_transformer_1.instanceToPlain)(transformedData) }));
|
|
32
25
|
}
|
|
26
|
+
return { message: "success", data: obj };
|
|
33
27
|
}
|
|
34
28
|
static NoContent() { }
|
|
35
29
|
}
|
package/dist/validator-extend.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IsArrayNotEmpty = IsArrayNotEmpty;
|
|
4
4
|
function IsArrayNotEmpty(validationOptions) {
|
|
5
|
-
const { registerDecorator, ValidationArguments } = require(
|
|
5
|
+
const { registerDecorator, ValidationArguments } = require("class-validator");
|
|
6
6
|
return function (object, propertyName) {
|
|
7
7
|
registerDecorator({
|
|
8
|
-
name:
|
|
8
|
+
name: "isArrayWithAtLeastOneElement",
|
|
9
9
|
target: object.constructor,
|
|
10
10
|
propertyName: propertyName,
|
|
11
11
|
options: validationOptions,
|
package/package.json
CHANGED
|
@@ -1,39 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@avleon/core",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"main": "./dist/index.js",
|
|
5
|
-
"types": "./dist/index.d.ts",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"build": "rimraf dist && tsc",
|
|
8
|
-
"watch": "tsc-watch",
|
|
9
|
-
"test": "jest",
|
|
10
|
-
"test:watch": "jest --watch"
|
|
11
|
-
},
|
|
12
|
-
"keywords": [],
|
|
13
|
-
"author": "Tareq Hossain",
|
|
14
|
-
"license": "ISC",
|
|
15
|
-
"devDependencies": {
|
|
16
|
-
"@types/jest": "^29.5.14",
|
|
17
|
-
"jest": "^29.7.0",
|
|
18
|
-
"nodemon": "^3.1.7",
|
|
19
|
-
"ts-jest": "^29.2.5",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"@fastify/
|
|
26
|
-
"
|
|
27
|
-
"fastify": "^5.1.0",
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@avleon/core",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "rimraf dist && tsc",
|
|
8
|
+
"watch": "tsc-watch",
|
|
9
|
+
"test": "jest",
|
|
10
|
+
"test:watch": "jest --watch"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [],
|
|
13
|
+
"author": "Tareq Hossain",
|
|
14
|
+
"license": "ISC",
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/jest": "^29.5.14",
|
|
17
|
+
"jest": "^29.7.0",
|
|
18
|
+
"nodemon": "^3.1.7",
|
|
19
|
+
"ts-jest": "^29.2.5",
|
|
20
|
+
"ts-node": "^10.9.2",
|
|
21
|
+
"tsc-watch": "^6.2.1",
|
|
22
|
+
"typescript": "^5.7.2"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@fastify/static": "^8.1.1",
|
|
26
|
+
"@fastify/swagger": "^9.4.0",
|
|
27
|
+
"@fastify/swagger-ui": "^5.1.0",
|
|
28
|
+
"@scalar/fastify-api-reference": "^1.25.122",
|
|
29
|
+
"class-transformer": "^0.5.1",
|
|
30
|
+
"class-validator": "^0.14.1",
|
|
31
|
+
"dotenv": "^16.4.7",
|
|
32
|
+
"fastify": "^5.1.0",
|
|
33
|
+
"reflect-metadata": "^0.2.2",
|
|
34
|
+
"typedi": "^0.10.0",
|
|
35
|
+
"typeorm": "^0.3.20"
|
|
36
|
+
},
|
|
37
|
+
"directories": {
|
|
38
|
+
"test": "tests"
|
|
39
|
+
},
|
|
40
|
+
"description": "avleon core",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/xtareq/avleon-core"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/dist/repository.d.ts
DELETED
|
File without changes
|
package/dist/repository.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";
|