ctx-router 1.0.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/ctx/ctx.err.d.ts +28 -0
  4. package/dist/ctx/ctx.err.d.ts.map +1 -0
  5. package/dist/ctx/ctx.err.js +43 -0
  6. package/dist/ctx/ctx.err.js.map +1 -0
  7. package/dist/ctx/ctx.router.d.ts +9 -0
  8. package/dist/ctx/ctx.router.d.ts.map +1 -0
  9. package/dist/ctx/ctx.router.js +45 -0
  10. package/dist/ctx/ctx.router.js.map +1 -0
  11. package/dist/ctx/ctx.types.d.ts +96 -0
  12. package/dist/ctx/ctx.types.d.ts.map +1 -0
  13. package/dist/ctx/ctx.types.js +10 -0
  14. package/dist/ctx/ctx.types.js.map +1 -0
  15. package/dist/ctx.types.d.ts +96 -0
  16. package/dist/ctx.types.d.ts.map +1 -0
  17. package/dist/ctx.types.js +10 -0
  18. package/dist/ctx.types.js.map +1 -0
  19. package/dist/ctxErr.d.ts +28 -0
  20. package/dist/ctxErr.d.ts.map +1 -0
  21. package/dist/ctxErr.js +43 -0
  22. package/dist/ctxErr.js.map +1 -0
  23. package/dist/example/api/health/healthPing.api.d.ts +14 -0
  24. package/dist/example/api/health/healthPing.api.d.ts.map +1 -0
  25. package/dist/example/api/health/healthPing.api.js +30 -0
  26. package/dist/example/api/health/healthPing.api.js.map +1 -0
  27. package/dist/example/api/health/index.d.ts +3 -0
  28. package/dist/example/api/health/index.d.ts.map +1 -0
  29. package/dist/example/api/health/index.js +43 -0
  30. package/dist/example/api/health/index.js.map +1 -0
  31. package/dist/example/api/index.d.ts +3 -0
  32. package/dist/example/api/index.d.ts.map +1 -0
  33. package/dist/example/api/index.js +39 -0
  34. package/dist/example/api/index.js.map +1 -0
  35. package/dist/example/api/user/index.d.ts +4 -0
  36. package/dist/example/api/user/index.d.ts.map +1 -0
  37. package/dist/example/api/user/index.js +50 -0
  38. package/dist/example/api/user/index.js.map +1 -0
  39. package/dist/example/api/user/userDetail.api.d.ts +15 -0
  40. package/dist/example/api/user/userDetail.api.d.ts.map +1 -0
  41. package/dist/example/api/user/userDetail.api.js +29 -0
  42. package/dist/example/api/user/userDetail.api.js.map +1 -0
  43. package/dist/example/api/user/userUpdate.api.d.ts +14 -0
  44. package/dist/example/api/user/userUpdate.api.d.ts.map +1 -0
  45. package/dist/example/api/user/userUpdate.api.js +27 -0
  46. package/dist/example/api/user/userUpdate.api.js.map +1 -0
  47. package/dist/example/express.d.ts +2 -0
  48. package/dist/example/express.d.ts.map +1 -0
  49. package/dist/example/express.js +25 -0
  50. package/dist/example/express.js.map +1 -0
  51. package/dist/example/router.d.ts +4 -0
  52. package/dist/example/router.d.ts.map +1 -0
  53. package/dist/example/router.js +51 -0
  54. package/dist/example/router.js.map +1 -0
  55. package/dist/index.d.ts +9 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +13 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/producer/express.d.ts +4 -0
  60. package/dist/producer/express.d.ts.map +1 -0
  61. package/dist/producer/express.js +22 -0
  62. package/dist/producer/express.js.map +1 -0
  63. package/dist/router.d.ts +9 -0
  64. package/dist/router.d.ts.map +1 -0
  65. package/dist/router.js +45 -0
  66. package/dist/router.js.map +1 -0
  67. package/dist/transform.d.ts +91 -0
  68. package/dist/transform.d.ts.map +1 -0
  69. package/dist/transform.js +121 -0
  70. package/dist/transform.js.map +1 -0
  71. package/dist/transformer/express.d.ts +4 -0
  72. package/dist/transformer/express.d.ts.map +1 -0
  73. package/dist/transformer/express.js +22 -0
  74. package/dist/transformer/express.js.map +1 -0
  75. package/dist/transformer/index.d.ts +91 -0
  76. package/dist/transformer/index.d.ts.map +1 -0
  77. package/dist/transformer/index.js +121 -0
  78. package/dist/transformer/index.js.map +1 -0
  79. package/package.json +63 -0
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildCtx = buildCtx;
7
+ exports.doneCtx = doneCtx;
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const ctx_types_1 = require("./ctx/ctx.types");
10
+ const INSTANCE = {
11
+ ID: crypto_1.default.randomBytes(5).toString("hex"),
12
+ TRACE_ID: crypto_1.default.randomBytes(5).toString("hex"),
13
+ CREATED_AT: new Date(),
14
+ SERVICE_NAME: process.env.SERVICE_NAME || "fantasy-service",
15
+ SEQ: 0,
16
+ INFLIGHT: 0,
17
+ LAST_HEARTBEAT: new Date(),
18
+ PORT: parseInt(process.env.SERVICE_PORT || "3000", 10),
19
+ };
20
+ function buildCtx(ctxRaw) {
21
+ const meta = buildMeta(ctxRaw);
22
+ const req = buildReq(ctxRaw);
23
+ const user = buildUser(ctxRaw);
24
+ const res = buildRes();
25
+ const id = meta.monitor.traceId;
26
+ return { id, meta, req, user, res };
27
+ }
28
+ async function doneCtx(ctx) {
29
+ ctx.meta.ts.out = new Date();
30
+ ctx.meta.ts.execTime = ctx.meta.ts.out.getTime() - ctx.meta.ts.in.getTime();
31
+ // Log context using ctxLogger
32
+ // await logCtx(ctx);
33
+ setResMeta(ctx);
34
+ // decrease the number of request inflight when response of this request goes out
35
+ INSTANCE.INFLIGHT--;
36
+ }
37
+ function buildMeta(ctxRaw) {
38
+ const inTime = new Date();
39
+ ++INSTANCE.SEQ;
40
+ ++INSTANCE.INFLIGHT;
41
+ // Extract clientIn from header and validate if it's a valid date using IIFE
42
+ const clientIn = (() => {
43
+ const dtStr = ctxRaw.header["x-ctx-ts"];
44
+ if (typeof dtStr !== "string")
45
+ return inTime;
46
+ const dt = new Date(dtStr);
47
+ if (isNaN(dt.getTime()))
48
+ return inTime;
49
+ return dt;
50
+ })();
51
+ return {
52
+ serviceName: INSTANCE.SERVICE_NAME,
53
+ instance: {
54
+ id: INSTANCE.ID,
55
+ createdAt: INSTANCE.CREATED_AT,
56
+ seq: INSTANCE.SEQ,
57
+ inflight: INSTANCE.INFLIGHT,
58
+ },
59
+ ts: {
60
+ in: inTime,
61
+ clientIn: clientIn,
62
+ owd: inTime.getTime() - clientIn.getTime(),
63
+ },
64
+ monitor: {
65
+ traceId: `${INSTANCE.ID}-${INSTANCE.SEQ}`,
66
+ spanId: `${INSTANCE.ID}-${INSTANCE.SEQ}`,
67
+ stdout: [],
68
+ dbLog: [],
69
+ },
70
+ };
71
+ }
72
+ function buildReq(data) {
73
+ return {
74
+ method: data.method,
75
+ path: data.path,
76
+ header: data.header,
77
+ data: data.data,
78
+ ip: data.ip,
79
+ ips: data.ips,
80
+ };
81
+ }
82
+ function buildUser(ctxRaw) {
83
+ const header = ctxRaw.header;
84
+ const clientSeq = Number(header["x-ctx-seq"]);
85
+ return {
86
+ id: "none",
87
+ role: ctx_types_1.USER_ROLE.none,
88
+ seq: isNaN(clientSeq) ? 0 : clientSeq,
89
+ sessionId: String(header["x-ctx-session-id"] || "none"),
90
+ deviceId: String(header["x-ctx-device-id"] || "none"),
91
+ deviceName: String(header["x-ctx-device-name"] || "none"),
92
+ appVersion: String(header["x-ctx-app-version"] || "none"),
93
+ os: String(header["x-ctx-os"] || "none"),
94
+ apiVersion: String(header["x-ctx-api-version"] || "none"),
95
+ auth: {
96
+ token: String(header["authorization"] || header["Authorization"] || "none"),
97
+ refresh: String(header["x-ctx-refresh-token"] || "none"),
98
+ },
99
+ };
100
+ }
101
+ function buildRes() {
102
+ return {
103
+ code: "OK",
104
+ msg: "OK",
105
+ data: {},
106
+ };
107
+ }
108
+ function setResMeta(ctx) {
109
+ const meta = ctx.meta;
110
+ ctx.res.meta = {
111
+ ctxId: ctx.id,
112
+ seq: ctx.user.seq,
113
+ traceId: meta.monitor.traceId,
114
+ spanId: meta.monitor.spanId,
115
+ inTime: meta.ts.in,
116
+ outTime: meta.ts.out,
117
+ execTime: meta.ts.execTime,
118
+ owd: meta.ts.owd,
119
+ };
120
+ }
121
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Request } from "express";
2
+ import { TCtx } from "../ctx/ctx.types";
3
+ export declare function expressTransformer(req: Request): TCtx;
4
+ //# sourceMappingURL=express.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/transformer/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AASxC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAUrD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expressTransformer = expressTransformer;
4
+ const _1 = require(".");
5
+ function getPath(url) {
6
+ const queryParamPos = url.indexOf("?");
7
+ if (queryParamPos === -1)
8
+ return url;
9
+ return url.substring(0, queryParamPos);
10
+ }
11
+ function expressTransformer(req) {
12
+ const ctx = (0, _1.buildCtx)({
13
+ method: req.method,
14
+ path: getPath(req.url),
15
+ header: req.headers,
16
+ data: req.method === "POST" ? req.body || {} : req.query || {},
17
+ ip: req.ip || "",
18
+ ips: req.ips || [],
19
+ });
20
+ return ctx;
21
+ }
22
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/transformer/express.ts"],"names":[],"mappings":";;AAUA,gDAUC;AAlBD,wBAA6B;AAE7B,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,aAAa,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAY;IAC7C,MAAM,GAAG,GAAG,IAAA,WAAQ,EAAC;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QACtB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;QAC9D,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;KACnB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { TCtx, USER_ROLE } from "../ctx/ctx.types";
2
+ type TCtxBuild = {
3
+ method: string;
4
+ path: string;
5
+ header: Record<string, string | string[] | undefined>;
6
+ data: Record<string, unknown>;
7
+ ip: string;
8
+ ips: string[];
9
+ };
10
+ export declare function buildCtx(ctxRaw: TCtxBuild): {
11
+ id: string;
12
+ meta: {
13
+ serviceName: string;
14
+ instance: {
15
+ id: string;
16
+ createdAt: Date;
17
+ seq: number;
18
+ inflight: number;
19
+ };
20
+ ts: {
21
+ in: Date;
22
+ clientIn: Date;
23
+ owd: number;
24
+ out?: Date;
25
+ execTime?: number;
26
+ };
27
+ monitor: {
28
+ traceId: string;
29
+ spanId: string;
30
+ stdout: string[];
31
+ dbLog: string[];
32
+ };
33
+ };
34
+ req: {
35
+ header: {
36
+ authorization?: string;
37
+ "x-ctx-device-name"?: string;
38
+ "x-ctx-device-id"?: string;
39
+ "x-ctx-os"?: string;
40
+ "x-ctx-app-version"?: string;
41
+ "x-ctx-api-version"?: string;
42
+ "x-ctx-session-id"?: string;
43
+ "x-ctx-seq"?: string;
44
+ "x-ctx-refresh-token"?: string;
45
+ [key: string]: string | string[] | undefined;
46
+ };
47
+ method: string;
48
+ path: string;
49
+ data: {
50
+ userId?: string;
51
+ [key: string]: unknown;
52
+ };
53
+ ip: string;
54
+ ips: string[];
55
+ };
56
+ user: {
57
+ id: string;
58
+ role: keyof typeof USER_ROLE;
59
+ deviceName: string;
60
+ deviceId: string;
61
+ os: string;
62
+ appVersion: string;
63
+ sessionId: string;
64
+ seq: number;
65
+ apiVersion: string;
66
+ auth: {
67
+ token: string;
68
+ refresh: string;
69
+ };
70
+ };
71
+ res: {
72
+ code: string;
73
+ msg: string;
74
+ data: {
75
+ [key: string]: unknown;
76
+ };
77
+ meta?: {
78
+ ctxId: string;
79
+ seq: number;
80
+ traceId: string;
81
+ spanId: string;
82
+ inTime: Date;
83
+ outTime: Date;
84
+ execTime: number;
85
+ owd: number;
86
+ };
87
+ };
88
+ };
89
+ export declare function doneCtx(ctx: TCtx): Promise<void>;
90
+ export {};
91
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAanD,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,CAAC;AAEF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS;;;;;;;;;;;;;;eAgBR,CAAC;oBAAoB,CAAC;;;;;;;;;;;yBAlC/C,CAAC;+BAAiC,CAAC;6BACpB,CAAC;sBACF,CAAC;+BAAiC,CAAC;+BAGvD,CAAC;8BACE,CAAC;uBAAyB,CAAC;iCAG3B,CAAC;;;;;;kBAIK,CAAC;;;;;;;;oBA4BH,gBAEP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlBF;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAStD"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildCtx = buildCtx;
7
+ exports.doneCtx = doneCtx;
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const ctx_types_1 = require("../ctx/ctx.types");
10
+ const INSTANCE = {
11
+ ID: crypto_1.default.randomBytes(5).toString("hex"),
12
+ TRACE_ID: crypto_1.default.randomBytes(5).toString("hex"),
13
+ CREATED_AT: new Date(),
14
+ SERVICE_NAME: process.env.SERVICE_NAME || "fantasy-service",
15
+ SEQ: 0,
16
+ INFLIGHT: 0,
17
+ LAST_HEARTBEAT: new Date(),
18
+ PORT: parseInt(process.env.SERVICE_PORT || "3000", 10),
19
+ };
20
+ function buildCtx(ctxRaw) {
21
+ const meta = buildMeta(ctxRaw);
22
+ const req = buildReq(ctxRaw);
23
+ const user = buildUser(ctxRaw);
24
+ const res = buildRes();
25
+ const id = meta.monitor.traceId;
26
+ return { id, meta, req, user, res };
27
+ }
28
+ async function doneCtx(ctx) {
29
+ ctx.meta.ts.out = new Date();
30
+ ctx.meta.ts.execTime = ctx.meta.ts.out.getTime() - ctx.meta.ts.in.getTime();
31
+ // Log context using ctxLogger
32
+ // await logCtx(ctx);
33
+ setResMeta(ctx);
34
+ // decrease the number of request inflight when response of this request goes out
35
+ INSTANCE.INFLIGHT--;
36
+ }
37
+ function buildMeta(ctxRaw) {
38
+ const inTime = new Date();
39
+ ++INSTANCE.SEQ;
40
+ ++INSTANCE.INFLIGHT;
41
+ // Extract clientIn from header and validate if it's a valid date using IIFE
42
+ const clientIn = (() => {
43
+ const dtStr = ctxRaw.header["x-ctx-ts"];
44
+ if (typeof dtStr !== "string")
45
+ return inTime;
46
+ const dt = new Date(dtStr);
47
+ if (isNaN(dt.getTime()))
48
+ return inTime;
49
+ return dt;
50
+ })();
51
+ return {
52
+ serviceName: INSTANCE.SERVICE_NAME,
53
+ instance: {
54
+ id: INSTANCE.ID,
55
+ createdAt: INSTANCE.CREATED_AT,
56
+ seq: INSTANCE.SEQ,
57
+ inflight: INSTANCE.INFLIGHT,
58
+ },
59
+ ts: {
60
+ in: inTime,
61
+ clientIn: clientIn,
62
+ owd: inTime.getTime() - clientIn.getTime(),
63
+ },
64
+ monitor: {
65
+ traceId: `${INSTANCE.ID}-${INSTANCE.SEQ}`,
66
+ spanId: `${INSTANCE.ID}-${INSTANCE.SEQ}`,
67
+ stdout: [],
68
+ dbLog: [],
69
+ },
70
+ };
71
+ }
72
+ function buildReq(data) {
73
+ return {
74
+ method: data.method,
75
+ path: data.path,
76
+ header: data.header,
77
+ data: data.data,
78
+ ip: data.ip,
79
+ ips: data.ips,
80
+ };
81
+ }
82
+ function buildUser(ctxRaw) {
83
+ const header = ctxRaw.header;
84
+ const clientSeq = Number(header["x-ctx-seq"]);
85
+ return {
86
+ id: "none",
87
+ role: ctx_types_1.USER_ROLE.none,
88
+ seq: isNaN(clientSeq) ? 0 : clientSeq,
89
+ sessionId: String(header["x-ctx-session-id"] || "none"),
90
+ deviceId: String(header["x-ctx-device-id"] || "none"),
91
+ deviceName: String(header["x-ctx-device-name"] || "none"),
92
+ appVersion: String(header["x-ctx-app-version"] || "none"),
93
+ os: String(header["x-ctx-os"] || "none"),
94
+ apiVersion: String(header["x-ctx-api-version"] || "none"),
95
+ auth: {
96
+ token: String(header["authorization"] || header["Authorization"] || "none"),
97
+ refresh: String(header["x-ctx-refresh-token"] || "none"),
98
+ },
99
+ };
100
+ }
101
+ function buildRes() {
102
+ return {
103
+ code: "OK",
104
+ msg: "OK",
105
+ data: {},
106
+ };
107
+ }
108
+ function setResMeta(ctx) {
109
+ const meta = ctx.meta;
110
+ ctx.res.meta = {
111
+ ctxId: ctx.id,
112
+ seq: ctx.user.seq,
113
+ traceId: meta.monitor.traceId,
114
+ spanId: meta.monitor.spanId,
115
+ inTime: meta.ts.in,
116
+ outTime: meta.ts.out,
117
+ execTime: meta.ts.execTime,
118
+ owd: meta.ts.owd,
119
+ };
120
+ }
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "ctx-router",
3
+ "version": "1.0.0",
4
+ "description": "Context Router",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "ts-node src/example/express.ts",
20
+ "format": "prettier --write src",
21
+ "format:staged": "lint-staged --config .lintstagedrc.json --allow-empty",
22
+ "lint": "eslint --fix src",
23
+ "lint:staged": "lint-staged --config .lintstagedrc.json --allow-empty",
24
+ "lint-staged": "lint-staged --allow-empty",
25
+ "prepare": "husky",
26
+ "test": "echo \"Error: no test specified\" && exit 1"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/hyugorix/ctx-router.git"
31
+ },
32
+ "keywords": [
33
+ "ctx",
34
+ "router",
35
+ "context"
36
+ ],
37
+ "author": "Kaushik R Bangera",
38
+ "license": "MIT",
39
+ "bugs": {
40
+ "url": "https://github.com/hyugorix/ctx-router/issues"
41
+ },
42
+ "homepage": "https://github.com/hyugorix/ctx-router#readme",
43
+ "devDependencies": {
44
+ "@eslint/eslintrc": "^3.3.1",
45
+ "@eslint/js": "^9.33.0",
46
+ "@types/express": "^5.0.3",
47
+ "@types/node": "^24.3.0",
48
+ "@typescript-eslint/eslint-plugin": "^8.39.1",
49
+ "@typescript-eslint/parser": "^8.39.1",
50
+ "eslint": "^9.33.0",
51
+ "eslint-config-prettier": "^10.1.8",
52
+ "eslint-plugin-prettier": "^5.5.4",
53
+ "express": "^5.1.0",
54
+ "husky": "^9.1.7",
55
+ "lint-staged": "^16.1.5",
56
+ "prettier": "^3.6.2",
57
+ "ts-node": "^10.9.2",
58
+ "typescript": "^5.9.2"
59
+ },
60
+ "dependencies": {
61
+ "tslib": "^2.8.1"
62
+ }
63
+ }