princejs 1.8.2 → 1.8.3

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/dist/prince.d.ts CHANGED
@@ -7,6 +7,9 @@ export interface PrinceRequest extends Request {
7
7
  user?: any;
8
8
  params?: Record<string, string>;
9
9
  query?: URLSearchParams;
10
+ session?: any;
11
+ apiKey?: string;
12
+ sseSend?: (data: any, event?: string, id?: string) => void;
10
13
  [key: string]: any;
11
14
  }
12
15
  interface WebSocketHandler {
@@ -37,18 +40,19 @@ export declare class Prince {
37
40
  private openapiData;
38
41
  private router;
39
42
  private staticRoutes;
43
+ private staticMiddlewares;
40
44
  private routeCache;
41
45
  constructor(devMode?: boolean);
42
46
  use(mw: Middleware): this;
43
47
  error(fn: (err: any, req: PrinceRequest) => Response): this;
44
48
  json(data: any, status?: number): Response;
45
49
  response(): ResponseBuilder;
46
- get(path: string, handler: RouteHandler): this;
47
- post(path: string, handler: RouteHandler): this;
48
- put(path: string, handler: RouteHandler): this;
49
- delete(path: string, handler: RouteHandler): this;
50
- patch(path: string, handler: RouteHandler): this;
51
- options(path: string, handler: RouteHandler): this;
50
+ get(path: string, ...args: (RouteHandler | Middleware)[]): this;
51
+ post(path: string, ...args: (RouteHandler | Middleware)[]): this;
52
+ put(path: string, ...args: (RouteHandler | Middleware)[]): this;
53
+ delete(path: string, ...args: (RouteHandler | Middleware)[]): this;
54
+ patch(path: string, ...args: (RouteHandler | Middleware)[]): this;
55
+ options(path: string, ...args: (RouteHandler | Middleware)[]): this;
52
56
  ws(path: string, handlers: WebSocketHandler): this;
53
57
  private add;
54
58
  private buildRouter;
@@ -1 +1 @@
1
- {"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"AAIA,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpC,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC3G,KAAK,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAClD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AAoBnF,cAAM,eAAe;IACnB,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,KAAK,CAAa;IAE1B,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKjC,IAAI,CAAC,IAAI,EAAE,GAAG;IAMd,IAAI,CAAC,IAAI,EAAE,MAAM;IAMjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAMjB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAM;IAMlC,KAAK;CAGN;AAED,qBAAa,MAAM;IAgBL,OAAO,CAAC,OAAO;IAf3B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,YAAY,CAAC,CAA6C;IAClE,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,UAAU,CAKb;gBAEe,OAAO,UAAQ;IAEnC,GAAG,CAAC,EAAE,EAAE,UAAU;IAKlB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,KAAK,QAAQ;IAKpD,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,SAAM;IAO5B,QAAQ;IAKR,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IACxD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IACzD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IACxD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IAC3D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IAC1D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,EAAE;IAC5D,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB;IAK3C,OAAO,CAAC,GAAG;IA6BX,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,WAAW;IA0CnB,OAAO,CAAC,SAAS;IAkEjB,OAAO,CAAC,SAAS;IAyBjB,OAAO,CAAC,UAAU;YA+CJ,SAAS;YAoCT,cAAc;IAmDtB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IA4B5C,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAa5C,MAAM,CAAC,IAAI,SAAO;CA8CnB;AAED,eAAO,MAAM,MAAM,GAAI,aAAW,WAAoB,CAAC"}
package/dist/prince.js CHANGED
@@ -46,6 +46,7 @@ class Prince {
46
46
  openapiData = null;
47
47
  router = null;
48
48
  staticRoutes = new Map;
49
+ staticMiddlewares = new Map;
49
50
  routeCache = new Map;
50
51
  constructor(devMode = false) {
51
52
  this.devMode = devMode;
@@ -67,39 +68,44 @@ class Prince {
67
68
  response() {
68
69
  return new ResponseBuilder;
69
70
  }
70
- get(path, handler) {
71
- return this.add("GET", path, handler);
71
+ get(path, ...args) {
72
+ return this.add("GET", path, args);
72
73
  }
73
- post(path, handler) {
74
- return this.add("POST", path, handler);
74
+ post(path, ...args) {
75
+ return this.add("POST", path, args);
75
76
  }
76
- put(path, handler) {
77
- return this.add("PUT", path, handler);
77
+ put(path, ...args) {
78
+ return this.add("PUT", path, args);
78
79
  }
79
- delete(path, handler) {
80
- return this.add("DELETE", path, handler);
80
+ delete(path, ...args) {
81
+ return this.add("DELETE", path, args);
81
82
  }
82
- patch(path, handler) {
83
- return this.add("PATCH", path, handler);
83
+ patch(path, ...args) {
84
+ return this.add("PATCH", path, args);
84
85
  }
85
- options(path, handler) {
86
- return this.add("OPTIONS", path, handler);
86
+ options(path, ...args) {
87
+ return this.add("OPTIONS", path, args);
87
88
  }
88
89
  ws(path, handlers) {
89
90
  this.wsRoutes[path] = handlers;
90
91
  return this;
91
92
  }
92
- add(method, path, handler) {
93
+ add(method, path, args) {
93
94
  if (!path.startsWith("/"))
94
95
  path = "/" + path;
95
96
  if (path !== "/" && path.endsWith("/"))
96
97
  path = path.slice(0, -1);
97
98
  const parts = path === "/" ? [""] : path.split("/").slice(1);
98
- this.rawRoutes.push({ method, path, parts, handler });
99
+ const handler = args[args.length - 1];
100
+ const middlewares = args.slice(0, -1);
101
+ this.rawRoutes.push({ method, path, parts, handler, middlewares });
99
102
  const isStaticRoute = !parts.some((part) => part.includes(":") || part.includes("*") || part.includes("("));
100
103
  if (isStaticRoute) {
101
104
  const staticKey = `${method}:${path}`;
102
105
  this.staticRoutes.set(staticKey, handler);
106
+ if (middlewares.length > 0) {
107
+ this.staticMiddlewares.set(staticKey, middlewares);
108
+ }
103
109
  }
104
110
  this.routeCache.clear();
105
111
  this.router = null;
@@ -111,6 +117,7 @@ class Prince {
111
117
  const root = {
112
118
  pattern: "",
113
119
  handlers: {},
120
+ middlewares: {},
114
121
  children: []
115
122
  };
116
123
  for (const route of this.rawRoutes) {
@@ -138,6 +145,7 @@ class Prince {
138
145
  const newNode = {
139
146
  pattern: part,
140
147
  handlers: {},
148
+ middlewares: {},
141
149
  children: []
142
150
  };
143
151
  if (part.startsWith(":")) {
@@ -152,6 +160,9 @@ class Prince {
152
160
  }
153
161
  }
154
162
  currentNode.handlers[route.method] = route.handler;
163
+ if (route.middlewares.length > 0) {
164
+ currentNode.middlewares[route.method] = route.middlewares;
165
+ }
155
166
  }
156
167
  findRoute(method, pathname) {
157
168
  const cacheKey = `${method}:${pathname}`;
@@ -161,7 +172,11 @@ class Prince {
161
172
  const staticKey = `${method}:${pathname}`;
162
173
  const staticHandler = this.staticRoutes.get(staticKey);
163
174
  if (staticHandler) {
164
- const result2 = { handler: staticHandler, params: {} };
175
+ const result2 = {
176
+ handler: staticHandler,
177
+ params: {},
178
+ middlewares: this.staticMiddlewares.get(staticKey) || []
179
+ };
165
180
  this.routeCache.set(cacheKey, result2);
166
181
  return result2;
167
182
  }
@@ -187,6 +202,7 @@ class Prince {
187
202
  const methodNotAllowed = {
188
203
  handler: null,
189
204
  params: {},
205
+ middlewares: [],
190
206
  allowedMethods: Array.from(allowedMethods)
191
207
  };
192
208
  this.routeCache.set(cacheKey, methodNotAllowed);
@@ -199,9 +215,8 @@ class Prince {
199
215
  const routeParts = routePath === "/" ? [""] : routePath.split("/").slice(1);
200
216
  const requestParts = requestPath === "/" ? [""] : requestPath.split("/").slice(1);
201
217
  if (routeParts.length !== requestParts.length) {
202
- if (routeParts.includes("**")) {
218
+ if (routeParts.includes("**"))
203
219
  return true;
204
- }
205
220
  return false;
206
221
  }
207
222
  for (let i = 0;i < routeParts.length; i++) {
@@ -219,7 +234,8 @@ class Prince {
219
234
  matchRoute(node, segments, method, params = {}, index = 0) {
220
235
  if (index === segments.length) {
221
236
  const handler = node.handlers[method];
222
- return handler ? { handler, params } : null;
237
+ const middlewares = node.middlewares[method] || [];
238
+ return handler ? { handler, params, middlewares } : null;
223
239
  }
224
240
  const segment = segments[index];
225
241
  for (const child of node.children) {
@@ -250,8 +266,9 @@ class Prince {
250
266
  for (const child of node.children) {
251
267
  if (child.isCatchAll) {
252
268
  const handler = child.handlers[method];
269
+ const middlewares = child.middlewares[method] || [];
253
270
  if (handler) {
254
- return { handler, params };
271
+ return { handler, params, middlewares };
255
272
  }
256
273
  }
257
274
  }
@@ -289,10 +306,10 @@ class Prince {
289
306
  }
290
307
  return null;
291
308
  }
292
- async executeHandler(req, handler, params, query) {
309
+ async executeHandler(req, handler, params, query, routeMiddlewares) {
293
310
  Object.defineProperty(req, "params", { value: params, writable: true, configurable: true });
294
311
  Object.defineProperty(req, "query", { value: query, writable: true, configurable: true });
295
- if (["POST", "PUT", "PATCH"].includes(req.method)) {
312
+ if (["POST", "PUT", "PATCH"].includes(req.method) && !req.parsedBody) {
296
313
  const parsed = await this.parseBody(req);
297
314
  if (parsed) {
298
315
  if (typeof parsed === "object" && "files" in parsed && "fields" in parsed) {
@@ -310,10 +327,11 @@ class Prince {
310
327
  },
311
328
  configurable: true
312
329
  });
330
+ const allMiddlewares = routeMiddlewares.length > 0 ? [...this.middlewares, ...routeMiddlewares] : this.middlewares;
313
331
  let i = 0;
314
332
  const next = async () => {
315
- while (i < this.middlewares.length) {
316
- const result = await this.middlewares[i++](req, next);
333
+ while (i < allMiddlewares.length) {
334
+ const result = await allMiddlewares[i++](req, next);
317
335
  if (result instanceof Response)
318
336
  return result;
319
337
  }
@@ -346,7 +364,7 @@ class Prince {
346
364
  }
347
365
  });
348
366
  }
349
- return this.executeHandler(r, routeMatch.handler, routeMatch.params, url.searchParams);
367
+ return this.executeHandler(r, routeMatch.handler, routeMatch.params, url.searchParams, routeMatch.middlewares);
350
368
  }
351
369
  async fetch(req) {
352
370
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "princejs",
3
- "version": "1.8.2",
3
+ "version": "1.8.3",
4
4
  "description": "An easy and fast backend framework that is among the top three — by a 13yo developer, for developers.",
5
5
  "main": "dist/prince.js",
6
6
  "types": "dist/prince.d.ts",