@avleon/core 0.0.27 → 0.0.29

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 (77) hide show
  1. package/README.md +601 -561
  2. package/dist/application.js +1 -1
  3. package/dist/cache.d.ts +1 -1
  4. package/dist/cache.js +2 -2
  5. package/dist/collection.d.ts +25 -32
  6. package/dist/collection.js +50 -6
  7. package/dist/collection.test.d.ts +1 -0
  8. package/dist/collection.test.js +59 -0
  9. package/dist/config.d.ts +2 -0
  10. package/dist/config.js +30 -5
  11. package/dist/config.test.d.ts +1 -0
  12. package/dist/config.test.js +40 -0
  13. package/dist/controller.js +2 -2
  14. package/dist/environment-variables.js +42 -5
  15. package/dist/event-dispatcher.d.ts +23 -0
  16. package/dist/event-dispatcher.js +102 -0
  17. package/dist/event-subscriber.d.ts +15 -0
  18. package/dist/event-subscriber.js +96 -0
  19. package/dist/exceptions/http-exceptions.js +1 -1
  20. package/dist/exceptions/index.d.ts +1 -1
  21. package/dist/exceptions/system-exception.js +3 -1
  22. package/dist/file-storage.js +1 -1
  23. package/dist/helpers.js +1 -1
  24. package/dist/icore.d.ts +5 -0
  25. package/dist/icore.js +53 -18
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +6 -1
  28. package/dist/utils/index.d.ts +2 -2
  29. package/dist/utils/optional-require.js +2 -2
  30. package/dist/validation.d.ts +1 -1
  31. package/dist/websocket.d.ts +7 -0
  32. package/dist/websocket.js +20 -0
  33. package/dist/websocket.test.d.ts +0 -0
  34. package/dist/websocket.test.js +1 -0
  35. package/package.json +37 -6
  36. package/src/application.ts +104 -125
  37. package/src/authentication.ts +16 -16
  38. package/src/cache.ts +91 -91
  39. package/src/collection.test.ts +71 -0
  40. package/src/collection.ts +344 -254
  41. package/src/config.test.ts +35 -0
  42. package/src/config.ts +85 -42
  43. package/src/constants.ts +1 -1
  44. package/src/container.ts +54 -54
  45. package/src/controller.ts +125 -127
  46. package/src/decorators.ts +27 -27
  47. package/src/environment-variables.ts +53 -46
  48. package/src/event-dispatcher.ts +100 -0
  49. package/src/event-subscriber.ts +79 -0
  50. package/src/exceptions/http-exceptions.ts +86 -86
  51. package/src/exceptions/index.ts +1 -1
  52. package/src/exceptions/system-exception.ts +35 -34
  53. package/src/file-storage.ts +206 -206
  54. package/src/helpers.ts +324 -328
  55. package/src/icore.ts +1106 -1084
  56. package/src/index.ts +32 -30
  57. package/src/interfaces/avleon-application.ts +32 -40
  58. package/src/logger.ts +72 -72
  59. package/src/map-types.ts +159 -159
  60. package/src/middleware.ts +121 -98
  61. package/src/multipart.ts +116 -116
  62. package/src/openapi.ts +372 -372
  63. package/src/params.ts +111 -111
  64. package/src/queue.ts +126 -126
  65. package/src/response.ts +74 -74
  66. package/src/results.ts +30 -30
  67. package/src/route-methods.ts +186 -186
  68. package/src/swagger-schema.ts +213 -213
  69. package/src/testing.ts +220 -220
  70. package/src/types/app-builder.interface.ts +18 -19
  71. package/src/types/application.interface.ts +7 -9
  72. package/src/utils/hash.ts +8 -5
  73. package/src/utils/index.ts +2 -2
  74. package/src/utils/optional-require.ts +50 -50
  75. package/src/validation.ts +160 -156
  76. package/src/validator-extend.ts +25 -25
  77. package/src/websocket.ts +47 -0
package/src/params.ts CHANGED
@@ -1,111 +1,111 @@
1
- /**
2
- * @copyright 2024
3
- * @author Tareq Hossain
4
- * @email xtrinsic96@gmail.com
5
- * @url https://github.com/xtareq
6
- */
7
-
8
- import {
9
- PARAM_META_KEY,
10
- QUERY_META_KEY,
11
- REQUEST_BODY_META_KEY,
12
- REQUEST_HEADER_META_KEY,
13
- REQUEST_USER_META_KEY,
14
- ROUTE_META_KEY,
15
- } from "./container";
16
- import { getDataType, isClassValidatorClass, isValidType } from "./helpers";
17
- import { generateSwaggerSchema } from "./swagger-schema";
18
-
19
- type ParameterOptions = {
20
- required?: boolean;
21
- validate?: boolean;
22
- type?: any;
23
- };
24
-
25
- function createParamDecorator(
26
- type: string | symbol
27
- ): (
28
- key?: string | ParameterOptions,
29
- options?: ParameterOptions
30
- ) => ParameterDecorator {
31
- return function (
32
- key?: string | ParameterOptions,
33
- options: { required?: boolean; validate?: boolean } = {}
34
- ): ParameterDecorator {
35
- return function (target: any, propertyKey: any, parameterIndex: number) {
36
- const existingParams =
37
- Reflect.getMetadata(type, target, propertyKey) || [];
38
- const parameterTypes =
39
- Reflect.getMetadata("design:paramtypes", target, propertyKey) || [];
40
- const functionSource: any = target[propertyKey].toString();
41
- const paramNames = functionSource
42
- .match(/\(([^)]*)\)/)?.[1]
43
- .split(",")
44
- .map((name: any) => name.trim());
45
- const paramDataType = parameterTypes[parameterIndex];
46
- existingParams.push({
47
- index: parameterIndex,
48
- key: key ? key : "all",
49
- name: paramNames[parameterIndex],
50
- required: options.required == undefined ? true : options.required ,
51
- validate: options.validate == undefined ? true: options.validate,
52
- dataType: getDataType(paramDataType),
53
- validatorClass: isClassValidatorClass(paramDataType),
54
- schema: isClassValidatorClass(paramDataType)
55
- ? generateSwaggerSchema(paramDataType)
56
- : null,
57
- type,
58
- });
59
- switch (type) {
60
- case "route:param":
61
- Reflect.defineMetadata(
62
- PARAM_META_KEY,
63
- existingParams,
64
- target,
65
- propertyKey
66
- );
67
- break;
68
- case "route:query":
69
- Reflect.defineMetadata(
70
- QUERY_META_KEY,
71
- existingParams,
72
- target,
73
- propertyKey
74
- );
75
- break;
76
- case "route:body":
77
- Reflect.defineMetadata(
78
- REQUEST_BODY_META_KEY,
79
- existingParams,
80
- target,
81
- propertyKey
82
- );
83
- break;
84
- case "route:user":
85
- Reflect.defineMetadata(
86
- REQUEST_USER_META_KEY,
87
- existingParams,
88
- target,
89
- propertyKey
90
- );
91
- break;
92
- case "route:header":
93
- Reflect.defineMetadata(
94
- REQUEST_HEADER_META_KEY,
95
- existingParams,
96
- target,
97
- propertyKey
98
- );
99
- break;
100
- default:
101
- break;
102
- }
103
- };
104
- };
105
- }
106
-
107
- export const Param = createParamDecorator("route:param");
108
- export const Query = createParamDecorator("route:query");
109
- export const Body = createParamDecorator("route:body");
110
- export const Header = createParamDecorator("route:header");
111
- export const AuthUser = createParamDecorator("route:user");
1
+ /**
2
+ * @copyright 2024
3
+ * @author Tareq Hossain
4
+ * @email xtrinsic96@gmail.com
5
+ * @url https://github.com/xtareq
6
+ */
7
+
8
+ import {
9
+ PARAM_META_KEY,
10
+ QUERY_META_KEY,
11
+ REQUEST_BODY_META_KEY,
12
+ REQUEST_HEADER_META_KEY,
13
+ REQUEST_USER_META_KEY,
14
+ ROUTE_META_KEY,
15
+ } from "./container";
16
+ import { getDataType, isClassValidatorClass, isValidType } from "./helpers";
17
+ import { generateSwaggerSchema } from "./swagger-schema";
18
+
19
+ type ParameterOptions = {
20
+ required?: boolean;
21
+ validate?: boolean;
22
+ type?: any;
23
+ };
24
+
25
+ function createParamDecorator(
26
+ type: string | symbol,
27
+ ): (
28
+ key?: string | ParameterOptions,
29
+ options?: ParameterOptions,
30
+ ) => ParameterDecorator {
31
+ return function (
32
+ key?: string | ParameterOptions,
33
+ options: { required?: boolean; validate?: boolean } = {},
34
+ ): ParameterDecorator {
35
+ return function (target: any, propertyKey: any, parameterIndex: number) {
36
+ const existingParams =
37
+ Reflect.getMetadata(type, target, propertyKey) || [];
38
+ const parameterTypes =
39
+ Reflect.getMetadata("design:paramtypes", target, propertyKey) || [];
40
+ const functionSource: any = target[propertyKey].toString();
41
+ const paramNames = functionSource
42
+ .match(/\(([^)]*)\)/)?.[1]
43
+ .split(",")
44
+ .map((name: any) => name.trim());
45
+ const paramDataType = parameterTypes[parameterIndex];
46
+ existingParams.push({
47
+ index: parameterIndex,
48
+ key: key ? key : "all",
49
+ name: paramNames[parameterIndex],
50
+ required: options.required == undefined ? true : options.required,
51
+ validate: options.validate == undefined ? true : options.validate,
52
+ dataType: getDataType(paramDataType),
53
+ validatorClass: isClassValidatorClass(paramDataType),
54
+ schema: isClassValidatorClass(paramDataType)
55
+ ? generateSwaggerSchema(paramDataType)
56
+ : null,
57
+ type,
58
+ });
59
+ switch (type) {
60
+ case "route:param":
61
+ Reflect.defineMetadata(
62
+ PARAM_META_KEY,
63
+ existingParams,
64
+ target,
65
+ propertyKey,
66
+ );
67
+ break;
68
+ case "route:query":
69
+ Reflect.defineMetadata(
70
+ QUERY_META_KEY,
71
+ existingParams,
72
+ target,
73
+ propertyKey,
74
+ );
75
+ break;
76
+ case "route:body":
77
+ Reflect.defineMetadata(
78
+ REQUEST_BODY_META_KEY,
79
+ existingParams,
80
+ target,
81
+ propertyKey,
82
+ );
83
+ break;
84
+ case "route:user":
85
+ Reflect.defineMetadata(
86
+ REQUEST_USER_META_KEY,
87
+ existingParams,
88
+ target,
89
+ propertyKey,
90
+ );
91
+ break;
92
+ case "route:header":
93
+ Reflect.defineMetadata(
94
+ REQUEST_HEADER_META_KEY,
95
+ existingParams,
96
+ target,
97
+ propertyKey,
98
+ );
99
+ break;
100
+ default:
101
+ break;
102
+ }
103
+ };
104
+ };
105
+ }
106
+
107
+ export const Param = createParamDecorator("route:param");
108
+ export const Query = createParamDecorator("route:query");
109
+ export const Body = createParamDecorator("route:body");
110
+ export const Header = createParamDecorator("route:header");
111
+ export const AuthUser = createParamDecorator("route:user");
package/src/queue.ts CHANGED
@@ -1,126 +1,126 @@
1
- /**
2
- * @copyright 2024
3
- * @author Tareq Hossain
4
- * @email xtrinsic96@gmail.com
5
- * @url https://github.com/xtareq
6
- */
7
-
8
- import { promises as fs } from "fs";
9
- import { join } from "path";
10
- import { uuid } from "./helpers";
11
-
12
- interface Job {
13
- id: string;
14
- data: any;
15
- }
16
-
17
- interface QueueAdapter {
18
- loadJobs(): Promise<Job[]>;
19
- saveJobs(jobs: Job[]): Promise<void>;
20
- }
21
-
22
- export class FileQueueAdapter implements QueueAdapter {
23
- private queueFile: string;
24
-
25
- constructor(queueName: string) {
26
- this.queueFile = join(__dirname, `${queueName}.json`);
27
- }
28
-
29
- async loadJobs(): Promise<Job[]> {
30
- try {
31
- const data = await fs.readFile(this.queueFile, "utf-8");
32
- return JSON.parse(data);
33
- } catch (error) {
34
- return [];
35
- }
36
- }
37
-
38
- async saveJobs(jobs: Job[]) {
39
- await fs.writeFile(this.queueFile, JSON.stringify(jobs, null, 2), "utf-8");
40
- }
41
- }
42
-
43
- // class RedisQueueAdapter implements QueueAdapter {
44
- // private client = createClient();
45
- // private queueKey: string;
46
- //
47
- // constructor(queueName: string) {
48
- // this.queueKey = `queue:${queueName}`;
49
- // this.client.connect();
50
- // }
51
- //
52
- // async loadJobs(): Promise<Job[]> {
53
- // const jobs = await this.client.lRange(this.queueKey, 0, -1);
54
- // return jobs.map((job) => JSON.parse(job));
55
- // }
56
- //
57
- // async saveJobs(jobs: Job[]) {
58
- // await this.client.del(this.queueKey);
59
- // if (jobs.length > 0) {
60
- // await this.client.rPush(this.queueKey, ...jobs.map(job => JSON.stringify(job)));
61
- // }
62
- // }
63
- // }
64
-
65
- class SimpleQueue {
66
- private processing: boolean = false;
67
- private jobHandler: (job: Job) => Promise<void>;
68
- private adapter: QueueAdapter;
69
-
70
- constructor(adapter: QueueAdapter, jobHandler: (job: Job) => Promise<void>) {
71
- this.adapter = adapter;
72
- this.jobHandler = jobHandler;
73
- }
74
-
75
- async addJob(data: any) {
76
- const job: Job = { id: uuid, data };
77
- const jobs = await this.adapter.loadJobs();
78
- jobs.push(job);
79
- await this.adapter.saveJobs(jobs);
80
- this.processNext();
81
- }
82
-
83
- private async processNext() {
84
- if (this.processing) return;
85
- this.processing = true;
86
-
87
- const jobs = await this.adapter.loadJobs();
88
- if (jobs.length === 0) {
89
- this.processing = false;
90
- return;
91
- }
92
-
93
- const job = jobs.shift();
94
- if (job) {
95
- try {
96
- await this.jobHandler(job);
97
- } catch (error) {
98
- console.error(`Error processing job ${job.id}:`, error);
99
- jobs.unshift(job);
100
- }
101
- await this.adapter.saveJobs(jobs);
102
- this.processing = false;
103
- this.processNext();
104
- }
105
- }
106
- }
107
-
108
- export class QueueManager {
109
- private static instance: QueueManager;
110
- private adapter: QueueAdapter;
111
-
112
- private constructor(adapter: QueueAdapter) {
113
- this.adapter = adapter;
114
- }
115
-
116
- static getInstance(adapter: QueueAdapter): QueueManager {
117
- if (!QueueManager.instance) {
118
- QueueManager.instance = new QueueManager(adapter);
119
- }
120
- return QueueManager.instance;
121
- }
122
-
123
- createQueue(jobHandler: (job: Job) => Promise<void>): SimpleQueue {
124
- return new SimpleQueue(this.adapter, jobHandler);
125
- }
126
- }
1
+ /**
2
+ * @copyright 2024
3
+ * @author Tareq Hossain
4
+ * @email xtrinsic96@gmail.com
5
+ * @url https://github.com/xtareq
6
+ */
7
+
8
+ import { promises as fs } from "fs";
9
+ import { join } from "path";
10
+ import { uuid } from "./helpers";
11
+
12
+ interface Job {
13
+ id: string;
14
+ data: any;
15
+ }
16
+
17
+ interface QueueAdapter {
18
+ loadJobs(): Promise<Job[]>;
19
+ saveJobs(jobs: Job[]): Promise<void>;
20
+ }
21
+
22
+ export class FileQueueAdapter implements QueueAdapter {
23
+ private queueFile: string;
24
+
25
+ constructor(queueName: string) {
26
+ this.queueFile = join(__dirname, `${queueName}.json`);
27
+ }
28
+
29
+ async loadJobs(): Promise<Job[]> {
30
+ try {
31
+ const data = await fs.readFile(this.queueFile, "utf-8");
32
+ return JSON.parse(data);
33
+ } catch (error) {
34
+ return [];
35
+ }
36
+ }
37
+
38
+ async saveJobs(jobs: Job[]) {
39
+ await fs.writeFile(this.queueFile, JSON.stringify(jobs, null, 2), "utf-8");
40
+ }
41
+ }
42
+
43
+ // class RedisQueueAdapter implements QueueAdapter {
44
+ // private client = createClient();
45
+ // private queueKey: string;
46
+ //
47
+ // constructor(queueName: string) {
48
+ // this.queueKey = `queue:${queueName}`;
49
+ // this.client.connect();
50
+ // }
51
+ //
52
+ // async loadJobs(): Promise<Job[]> {
53
+ // const jobs = await this.client.lRange(this.queueKey, 0, -1);
54
+ // return jobs.map((job) => JSON.parse(job));
55
+ // }
56
+ //
57
+ // async saveJobs(jobs: Job[]) {
58
+ // await this.client.del(this.queueKey);
59
+ // if (jobs.length > 0) {
60
+ // await this.client.rPush(this.queueKey, ...jobs.map(job => JSON.stringify(job)));
61
+ // }
62
+ // }
63
+ // }
64
+
65
+ class SimpleQueue {
66
+ private processing: boolean = false;
67
+ private jobHandler: (job: Job) => Promise<void>;
68
+ private adapter: QueueAdapter;
69
+
70
+ constructor(adapter: QueueAdapter, jobHandler: (job: Job) => Promise<void>) {
71
+ this.adapter = adapter;
72
+ this.jobHandler = jobHandler;
73
+ }
74
+
75
+ async addJob(data: any) {
76
+ const job: Job = { id: uuid, data };
77
+ const jobs = await this.adapter.loadJobs();
78
+ jobs.push(job);
79
+ await this.adapter.saveJobs(jobs);
80
+ this.processNext();
81
+ }
82
+
83
+ private async processNext() {
84
+ if (this.processing) return;
85
+ this.processing = true;
86
+
87
+ const jobs = await this.adapter.loadJobs();
88
+ if (jobs.length === 0) {
89
+ this.processing = false;
90
+ return;
91
+ }
92
+
93
+ const job = jobs.shift();
94
+ if (job) {
95
+ try {
96
+ await this.jobHandler(job);
97
+ } catch (error) {
98
+ console.error(`Error processing job ${job.id}:`, error);
99
+ jobs.unshift(job);
100
+ }
101
+ await this.adapter.saveJobs(jobs);
102
+ this.processing = false;
103
+ this.processNext();
104
+ }
105
+ }
106
+ }
107
+
108
+ export class QueueManager {
109
+ private static instance: QueueManager;
110
+ private adapter: QueueAdapter;
111
+
112
+ private constructor(adapter: QueueAdapter) {
113
+ this.adapter = adapter;
114
+ }
115
+
116
+ static getInstance(adapter: QueueAdapter): QueueManager {
117
+ if (!QueueManager.instance) {
118
+ QueueManager.instance = new QueueManager(adapter);
119
+ }
120
+ return QueueManager.instance;
121
+ }
122
+
123
+ createQueue(jobHandler: (job: Job) => Promise<void>): SimpleQueue {
124
+ return new SimpleQueue(this.adapter, jobHandler);
125
+ }
126
+ }
package/src/response.ts CHANGED
@@ -1,74 +1,74 @@
1
- /**
2
- * @copyright 2024
3
- * @author Tareq Hossain
4
- * @email xtrinsic96@gmail.com
5
- * @url https://github.com/xtareq
6
- */
7
- import {
8
- instanceToPlain,
9
- plainToInstance,
10
- ClassConstructor,
11
- ClassTransformer,
12
- } from "class-transformer";
13
-
14
- export interface IHttpResponse<T extends any> {
15
- message: string;
16
- data: T | null;
17
- }
18
-
19
- function isClassTransformerClass(target: any): boolean {
20
- const prototype = target.prototype;
21
- const keys = Reflect.getMetadataKeys(prototype);
22
-
23
- // Check for class-transformer metadata
24
- return keys.some((key) => key.startsWith("class_transformer:"));
25
- }
26
-
27
- function isClassTransformerType<T>(target: new () => T): boolean {
28
- return isClassTransformerClass(target);
29
- }
30
-
31
- export class HttpResponse {
32
- static Ok<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {
33
- if (s) {
34
- const isPaginated = obj?.hasOwnProperty("total");
35
- const dataToTransform = isPaginated ? obj.data : obj;
36
-
37
- const transformedData = plainToInstance(s, dataToTransform, {
38
- enableImplicitConversion: true,
39
- excludeExtraneousValues: true,
40
- });
41
-
42
- const transformedResult = isPaginated
43
- ? { ...obj, data: instanceToPlain(transformedData) }
44
- : { data: instanceToPlain(transformedData) };
45
-
46
- return {
47
- message: "success",
48
- ...transformedResult,
49
- };
50
- }
51
-
52
- return { message: "success", data: obj };
53
- }
54
-
55
- static Created<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {
56
- if (s) {
57
- const transformedData = plainToInstance(s, obj, {
58
- enableImplicitConversion: true,
59
- excludeExtraneousValues: true,
60
- });
61
-
62
- return {
63
- message: "created",
64
- data: instanceToPlain(transformedData) as T,
65
- };
66
- }
67
-
68
- return { message: "created", data: obj };
69
- }
70
-
71
- static NoContent(): IHttpResponse<null> {
72
- return { message: "no content", data: null };
73
- }
74
- }
1
+ /**
2
+ * @copyright 2024
3
+ * @author Tareq Hossain
4
+ * @email xtrinsic96@gmail.com
5
+ * @url https://github.com/xtareq
6
+ */
7
+ import {
8
+ instanceToPlain,
9
+ plainToInstance,
10
+ ClassConstructor,
11
+ ClassTransformer,
12
+ } from "class-transformer";
13
+
14
+ export interface IHttpResponse<T extends any> {
15
+ message: string;
16
+ data: T | null;
17
+ }
18
+
19
+ function isClassTransformerClass(target: any): boolean {
20
+ const prototype = target.prototype;
21
+ const keys = Reflect.getMetadataKeys(prototype);
22
+
23
+ // Check for class-transformer metadata
24
+ return keys.some((key) => key.startsWith("class_transformer:"));
25
+ }
26
+
27
+ function isClassTransformerType<T>(target: new () => T): boolean {
28
+ return isClassTransformerClass(target);
29
+ }
30
+
31
+ export class HttpResponse {
32
+ static Ok<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {
33
+ if (s) {
34
+ const isPaginated = obj?.hasOwnProperty("total");
35
+ const dataToTransform = isPaginated ? obj.data : obj;
36
+
37
+ const transformedData = plainToInstance(s, dataToTransform, {
38
+ enableImplicitConversion: true,
39
+ excludeExtraneousValues: true,
40
+ });
41
+
42
+ const transformedResult = isPaginated
43
+ ? { ...obj, data: instanceToPlain(transformedData) }
44
+ : { data: instanceToPlain(transformedData) };
45
+
46
+ return {
47
+ message: "success",
48
+ ...transformedResult,
49
+ };
50
+ }
51
+
52
+ return { message: "success", data: obj };
53
+ }
54
+
55
+ static Created<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {
56
+ if (s) {
57
+ const transformedData = plainToInstance(s, obj, {
58
+ enableImplicitConversion: true,
59
+ excludeExtraneousValues: true,
60
+ });
61
+
62
+ return {
63
+ message: "created",
64
+ data: instanceToPlain(transformedData) as T,
65
+ };
66
+ }
67
+
68
+ return { message: "created", data: obj };
69
+ }
70
+
71
+ static NoContent(): IHttpResponse<null> {
72
+ return { message: "no content", data: null };
73
+ }
74
+ }
package/src/results.ts CHANGED
@@ -1,30 +1,30 @@
1
- export type OkOptions = {
2
- streamable: boolean;
3
- };
4
-
5
- export class Results {
6
- static code = 500;
7
- message: string = "Something going wrong";
8
-
9
- static Ok<T>(data: T): Ok<T> {
10
- return new Ok<T>(data);
11
- }
12
- static NoContent() {
13
- this.code = 204;
14
- }
15
- static OkStream() {}
16
- static NotFound<T>(message: T) {
17
- return new NotFound<T>(message);
18
- }
19
- }
20
-
21
- export class Ok<T> {
22
- constructor(public data: T) {}
23
- }
24
-
25
- export class NotFound<T> {
26
- constructor(public message: T) {}
27
- }
28
-
29
- // This type ensures methods must return Results.Ok
30
- export type RouteResult<T = any> = typeof Results.Ok<T>;
1
+ export type OkOptions = {
2
+ streamable: boolean;
3
+ };
4
+
5
+ export class Results {
6
+ static code = 500;
7
+ message: string = "Something going wrong";
8
+
9
+ static Ok<T>(data: T): Ok<T> {
10
+ return new Ok<T>(data);
11
+ }
12
+ static NoContent() {
13
+ this.code = 204;
14
+ }
15
+ static OkStream() {}
16
+ static NotFound<T>(message: T) {
17
+ return new NotFound<T>(message);
18
+ }
19
+ }
20
+
21
+ export class Ok<T> {
22
+ constructor(public data: T) {}
23
+ }
24
+
25
+ export class NotFound<T> {
26
+ constructor(public message: T) {}
27
+ }
28
+
29
+ // This type ensures methods must return Results.Ok
30
+ export type RouteResult<T = any> = typeof Results.Ok<T>;