elit 3.1.0 → 3.1.2

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/build.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { B as BuildOptions, a as BuildResult } from './server-BgWmjg9q.mjs';
1
+ import { B as BuildOptions, a as BuildResult } from './server-XT4I28Cr.mjs';
2
2
  import './http.mjs';
3
3
  import 'node:events';
4
4
  import './ws.mjs';
package/dist/cli.js CHANGED
@@ -1412,7 +1412,7 @@ var require_package = __commonJS({
1412
1412
  "package.json"(exports2, module2) {
1413
1413
  module2.exports = {
1414
1414
  name: "elit",
1415
- version: "3.1.0",
1415
+ version: "3.1.2",
1416
1416
  description: "Optimized lightweight library for creating DOM elements with reactive state",
1417
1417
  main: "dist/index.js",
1418
1418
  module: "dist/index.mjs",
package/dist/index.js CHANGED
@@ -2195,6 +2195,7 @@ function createRouter(options) {
2195
2195
  }
2196
2196
  return {
2197
2197
  currentRoute,
2198
+ navigate,
2198
2199
  push: (path) => navigate(path, false),
2199
2200
  replace: (path) => navigate(path, true),
2200
2201
  back: () => window.history.back(),
package/dist/index.mjs CHANGED
@@ -1917,6 +1917,7 @@ function createRouter(options) {
1917
1917
  }
1918
1918
  return {
1919
1919
  currentRoute,
1920
+ navigate,
1920
1921
  push: (path) => navigate(path, false),
1921
1922
  replace: (path) => navigate(path, true),
1922
1923
  back: () => window.history.back(),
package/dist/router.d.mts CHANGED
@@ -30,6 +30,7 @@ interface RouterOptions {
30
30
  }
31
31
  interface Router {
32
32
  currentRoute: State<RouteLocation>;
33
+ navigate: (path: string, replace?: boolean) => void;
33
34
  push: (path: string) => void;
34
35
  replace: (path: string) => void;
35
36
  back: () => void;
package/dist/router.d.ts CHANGED
@@ -24,6 +24,7 @@ export interface RouterOptions {
24
24
  }
25
25
  export interface Router {
26
26
  currentRoute: State<RouteLocation>;
27
+ navigate: (path: string, replace?: boolean) => void;
27
28
  push: (path: string) => void;
28
29
  replace: (path: string) => void;
29
30
  back: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAG1D,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,KAAK,GAAG,KAAK,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5F;AAED,MAAM,WAAW,WAAW;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,KAAK,GAAG,KAAK,CAAC;CACrD;AAED,MAAM,WAAW,MAAM;IACnB,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxG,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AA6DD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAgG3D;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,KAAK,CAoBpF;AAGD,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,OAAO,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,UAAU,KAAK,EAAE,KAAG,KAahG,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAG1D,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,KAAK,GAAG,KAAK,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5F;AAED,MAAM,WAAW,WAAW;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,KAAK,GAAG,KAAK,CAAC;CACrD;AAED,MAAM,WAAW,MAAM;IACnB,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxG,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AA6DD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAiG3D;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,KAAK,CAoBpF;AAGD,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,OAAO,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,UAAU,KAAK,EAAE,KAAG,KAahG,CAAC"}
package/dist/router.js CHANGED
@@ -775,6 +775,7 @@ function createRouter(options) {
775
775
  }
776
776
  return {
777
777
  currentRoute,
778
+ navigate,
778
779
  push: (path) => navigate(path, false),
779
780
  replace: (path) => navigate(path, true),
780
781
  back: () => window.history.back(),
package/dist/router.mjs CHANGED
@@ -747,6 +747,7 @@ function createRouter(options) {
747
747
  }
748
748
  return {
749
749
  currentRoute,
750
+ navigate,
750
751
  push: (path) => navigate(path, false),
751
752
  replace: (path) => navigate(path, true),
752
753
  back: () => window.history.back(),
@@ -188,6 +188,7 @@ interface ServerRouteContext {
188
188
  query: Record<string, string>;
189
189
  body: any;
190
190
  headers: Record<string, string | string[] | undefined>;
191
+ user?: any;
191
192
  }
192
193
  type ServerRouteHandler = (ctx: ServerRouteContext) => void | Promise<void>;
193
194
  type Middleware = (ctx: ServerRouteContext, next: () => Promise<void>) => void | Promise<void>;
@@ -195,12 +196,12 @@ declare class ServerRouter {
195
196
  private routes;
196
197
  private middlewares;
197
198
  use(middleware: Middleware): this;
198
- get: (path: string, handler: ServerRouteHandler) => this;
199
- post: (path: string, handler: ServerRouteHandler) => this;
200
- put: (path: string, handler: ServerRouteHandler) => this;
201
- delete: (path: string, handler: ServerRouteHandler) => this;
202
- patch: (path: string, handler: ServerRouteHandler) => this;
203
- options: (path: string, handler: ServerRouteHandler) => this;
199
+ get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
200
+ post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
201
+ put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
202
+ delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
203
+ patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
204
+ options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
204
205
  private addRoute;
205
206
  private pathToRegex;
206
207
  private parseQuery;
@@ -188,6 +188,7 @@ interface ServerRouteContext {
188
188
  query: Record<string, string>;
189
189
  body: any;
190
190
  headers: Record<string, string | string[] | undefined>;
191
+ user?: any;
191
192
  }
192
193
  type ServerRouteHandler = (ctx: ServerRouteContext) => void | Promise<void>;
193
194
  type Middleware = (ctx: ServerRouteContext, next: () => Promise<void>) => void | Promise<void>;
@@ -195,12 +196,12 @@ declare class ServerRouter {
195
196
  private routes;
196
197
  private middlewares;
197
198
  use(middleware: Middleware): this;
198
- get: (path: string, handler: ServerRouteHandler) => this;
199
- post: (path: string, handler: ServerRouteHandler) => this;
200
- put: (path: string, handler: ServerRouteHandler) => this;
201
- delete: (path: string, handler: ServerRouteHandler) => this;
202
- patch: (path: string, handler: ServerRouteHandler) => this;
203
- options: (path: string, handler: ServerRouteHandler) => this;
199
+ get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
200
+ post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
201
+ put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
202
+ delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
203
+ patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
204
+ options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
204
205
  private addRoute;
205
206
  private pathToRegex;
206
207
  private parseQuery;
package/dist/server.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import './http.mjs';
2
2
  import './ws.mjs';
3
- export { H as HttpMethod, M as Middleware, S as ServerRouteContext, b as ServerRouteHandler, c as ServerRouter, q as SharedState, p as SharedStateOptions, o as StateChangeHandler, u as StateManager, g as bodyLimit, i as cacheControl, d as clearImportMapCache, k as compress, e as cors, v as createDevServer, n as createProxyHandler, f as errorHandler, h as html, j as json, l as logger, r as rateLimit, m as security, s as status, t as text } from './server-BgWmjg9q.mjs';
3
+ export { H as HttpMethod, M as Middleware, S as ServerRouteContext, b as ServerRouteHandler, c as ServerRouter, q as SharedState, p as SharedStateOptions, o as StateChangeHandler, u as StateManager, g as bodyLimit, i as cacheControl, d as clearImportMapCache, k as compress, e as cors, v as createDevServer, n as createProxyHandler, f as errorHandler, h as html, j as json, l as logger, r as rateLimit, m as security, s as status, t as text } from './server-XT4I28Cr.mjs';
4
4
  import 'node:events';
5
5
  import 'events';
6
6
  import 'http';
package/dist/server.d.ts CHANGED
@@ -16,6 +16,7 @@ export interface ServerRouteContext {
16
16
  query: Record<string, string>;
17
17
  body: any;
18
18
  headers: Record<string, string | string[] | undefined>;
19
+ user?: any;
19
20
  }
20
21
  export type ServerRouteHandler = (ctx: ServerRouteContext) => void | Promise<void>;
21
22
  export type Middleware = (ctx: ServerRouteContext, next: () => Promise<void>) => void | Promise<void>;
@@ -23,12 +24,12 @@ export declare class ServerRouter {
23
24
  private routes;
24
25
  private middlewares;
25
26
  use(middleware: Middleware): this;
26
- get: (path: string, handler: ServerRouteHandler) => this;
27
- post: (path: string, handler: ServerRouteHandler) => this;
28
- put: (path: string, handler: ServerRouteHandler) => this;
29
- delete: (path: string, handler: ServerRouteHandler) => this;
30
- patch: (path: string, handler: ServerRouteHandler) => this;
31
- options: (path: string, handler: ServerRouteHandler) => this;
27
+ get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
28
+ post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
29
+ put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
30
+ delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
31
+ patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
32
+ options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
32
33
  private addRoute;
33
34
  private pathToRegex;
34
35
  private parseQuery;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -2662,20 +2662,24 @@ var ServerRouter = class {
2662
2662
  constructor() {
2663
2663
  this.routes = [];
2664
2664
  this.middlewares = [];
2665
- this.get = (path, handler) => this.addRoute("GET", path, handler);
2666
- this.post = (path, handler) => this.addRoute("POST", path, handler);
2667
- this.put = (path, handler) => this.addRoute("PUT", path, handler);
2668
- this.delete = (path, handler) => this.addRoute("DELETE", path, handler);
2669
- this.patch = (path, handler) => this.addRoute("PATCH", path, handler);
2670
- this.options = (path, handler) => this.addRoute("OPTIONS", path, handler);
2665
+ // Support per-route middleware: accept middleware(s) before the final handler
2666
+ this.get = (path, ...handlers) => this.addRoute("GET", path, handlers);
2667
+ this.post = (path, ...handlers) => this.addRoute("POST", path, handlers);
2668
+ this.put = (path, ...handlers) => this.addRoute("PUT", path, handlers);
2669
+ this.delete = (path, ...handlers) => this.addRoute("DELETE", path, handlers);
2670
+ this.patch = (path, ...handlers) => this.addRoute("PATCH", path, handlers);
2671
+ this.options = (path, ...handlers) => this.addRoute("OPTIONS", path, handlers);
2671
2672
  }
2672
2673
  use(middleware) {
2673
2674
  this.middlewares.push(middleware);
2674
2675
  return this;
2675
2676
  }
2676
- addRoute(method, path, handler) {
2677
+ addRoute(method, path, handlers) {
2677
2678
  const { pattern, paramNames } = this.pathToRegex(path);
2678
- this.routes.push({ method, pattern, paramNames, handler });
2679
+ if (!handlers || handlers.length === 0) throw new Error("Route must include a handler");
2680
+ const last = handlers[handlers.length - 1];
2681
+ const middlewares = handlers.slice(0, handlers.length - 1).map((h) => h);
2682
+ this.routes.push({ method, pattern, paramNames, handler: last, middlewares });
2679
2683
  return this;
2680
2684
  }
2681
2685
  pathToRegex(path) {
@@ -2754,11 +2758,18 @@ var ServerRouter = class {
2754
2758
  }
2755
2759
  }
2756
2760
  const ctx = { req, res, params, query: this.parseQuery(url), body, headers: req.headers };
2761
+ const routeMiddlewares = route.middlewares || [];
2762
+ const chain = [...this.middlewares, ...routeMiddlewares, async (c, _next) => {
2763
+ await route.handler(c);
2764
+ }];
2757
2765
  let i = 0;
2758
- const next = async () => i < this.middlewares.length && await this.middlewares[i++](ctx, next);
2766
+ const next = async () => {
2767
+ if (i >= chain.length) return;
2768
+ const mw = chain[i++];
2769
+ await mw(ctx, next);
2770
+ };
2759
2771
  try {
2760
2772
  await next();
2761
- await route.handler(ctx);
2762
2773
  } catch (e) {
2763
2774
  console.error("[ServerRouter] Route error:", e);
2764
2775
  !res.headersSent && (res.writeHead(500, { "Content-Type": "application/json" }), res.end(JSON.stringify({ error: "Internal Server Error", message: e instanceof Error ? e.message : "Unknown" })));
package/dist/server.mjs CHANGED
@@ -2636,20 +2636,24 @@ var ServerRouter = class {
2636
2636
  constructor() {
2637
2637
  this.routes = [];
2638
2638
  this.middlewares = [];
2639
- this.get = (path, handler) => this.addRoute("GET", path, handler);
2640
- this.post = (path, handler) => this.addRoute("POST", path, handler);
2641
- this.put = (path, handler) => this.addRoute("PUT", path, handler);
2642
- this.delete = (path, handler) => this.addRoute("DELETE", path, handler);
2643
- this.patch = (path, handler) => this.addRoute("PATCH", path, handler);
2644
- this.options = (path, handler) => this.addRoute("OPTIONS", path, handler);
2639
+ // Support per-route middleware: accept middleware(s) before the final handler
2640
+ this.get = (path, ...handlers) => this.addRoute("GET", path, handlers);
2641
+ this.post = (path, ...handlers) => this.addRoute("POST", path, handlers);
2642
+ this.put = (path, ...handlers) => this.addRoute("PUT", path, handlers);
2643
+ this.delete = (path, ...handlers) => this.addRoute("DELETE", path, handlers);
2644
+ this.patch = (path, ...handlers) => this.addRoute("PATCH", path, handlers);
2645
+ this.options = (path, ...handlers) => this.addRoute("OPTIONS", path, handlers);
2645
2646
  }
2646
2647
  use(middleware) {
2647
2648
  this.middlewares.push(middleware);
2648
2649
  return this;
2649
2650
  }
2650
- addRoute(method, path, handler) {
2651
+ addRoute(method, path, handlers) {
2651
2652
  const { pattern, paramNames } = this.pathToRegex(path);
2652
- this.routes.push({ method, pattern, paramNames, handler });
2653
+ if (!handlers || handlers.length === 0) throw new Error("Route must include a handler");
2654
+ const last = handlers[handlers.length - 1];
2655
+ const middlewares = handlers.slice(0, handlers.length - 1).map((h) => h);
2656
+ this.routes.push({ method, pattern, paramNames, handler: last, middlewares });
2653
2657
  return this;
2654
2658
  }
2655
2659
  pathToRegex(path) {
@@ -2728,11 +2732,18 @@ var ServerRouter = class {
2728
2732
  }
2729
2733
  }
2730
2734
  const ctx = { req, res, params, query: this.parseQuery(url), body, headers: req.headers };
2735
+ const routeMiddlewares = route.middlewares || [];
2736
+ const chain = [...this.middlewares, ...routeMiddlewares, async (c, _next) => {
2737
+ await route.handler(c);
2738
+ }];
2731
2739
  let i = 0;
2732
- const next = async () => i < this.middlewares.length && await this.middlewares[i++](ctx, next);
2740
+ const next = async () => {
2741
+ if (i >= chain.length) return;
2742
+ const mw = chain[i++];
2743
+ await mw(ctx, next);
2744
+ };
2733
2745
  try {
2734
2746
  await next();
2735
- await route.handler(ctx);
2736
2747
  } catch (e) {
2737
2748
  console.error("[ServerRouter] Route error:", e);
2738
2749
  !res.headersSent && (res.writeHead(500, { "Content-Type": "application/json" }), res.end(JSON.stringify({ error: "Internal Server Error", message: e instanceof Error ? e.message : "Unknown" })));
package/dist/types.d.mts CHANGED
@@ -155,6 +155,7 @@ interface ServerRouteContext {
155
155
  query: Record<string, string>;
156
156
  body: any;
157
157
  headers: Record<string, string | string[] | undefined>;
158
+ user?: any;
158
159
  }
159
160
  type ServerRouteHandler = (ctx: ServerRouteContext) => void | Promise<void>;
160
161
  type Middleware = (ctx: ServerRouteContext, next: () => Promise<void>) => void | Promise<void>;
@@ -162,12 +163,12 @@ declare class ServerRouter {
162
163
  private routes;
163
164
  private middlewares;
164
165
  use(middleware: Middleware): this;
165
- get: (path: string, handler: ServerRouteHandler) => this;
166
- post: (path: string, handler: ServerRouteHandler) => this;
167
- put: (path: string, handler: ServerRouteHandler) => this;
168
- delete: (path: string, handler: ServerRouteHandler) => this;
169
- patch: (path: string, handler: ServerRouteHandler) => this;
170
- options: (path: string, handler: ServerRouteHandler) => this;
166
+ get: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
167
+ post: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
168
+ put: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
169
+ delete: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
170
+ patch: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
171
+ options: (path: string, ...handlers: Array<Middleware | ServerRouteHandler>) => this;
171
172
  private addRoute;
172
173
  private pathToRegex;
173
174
  private parseQuery;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elit",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
4
4
  "description": "Optimized lightweight library for creating DOM elements with reactive state",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/router.ts CHANGED
@@ -31,6 +31,7 @@ export interface RouterOptions {
31
31
 
32
32
  export interface Router {
33
33
  currentRoute: State<RouteLocation>;
34
+ navigate: (path: string, replace?: boolean) => void;
34
35
  push: (path: string) => void;
35
36
  replace: (path: string) => void;
36
37
  back: () => void;
@@ -182,6 +183,7 @@ export function createRouter(options: RouterOptions): Router {
182
183
 
183
184
  return {
184
185
  currentRoute,
186
+ navigate,
185
187
  push: (path: string) => navigate(path, false),
186
188
  replace: (path: string) => navigate(path, true),
187
189
  back: () => window.history.back(),
package/src/server.ts CHANGED
@@ -28,6 +28,7 @@ export interface ServerRouteContext {
28
28
  query: Record<string, string>;
29
29
  body: any;
30
30
  headers: Record<string, string | string[] | undefined>;
31
+ user?: any;
31
32
  }
32
33
 
33
34
  export type ServerRouteHandler = (ctx: ServerRouteContext) => void | Promise<void>;
@@ -38,6 +39,7 @@ interface ServerRoute {
38
39
  pattern: RegExp;
39
40
  paramNames: string[];
40
41
  handler: ServerRouteHandler;
42
+ middlewares: Middleware[];
41
43
  }
42
44
 
43
45
  export class ServerRouter {
@@ -49,16 +51,21 @@ export class ServerRouter {
49
51
  return this;
50
52
  }
51
53
 
52
- get = (path: string, handler: ServerRouteHandler): this => this.addRoute('GET', path, handler);
53
- post = (path: string, handler: ServerRouteHandler): this => this.addRoute('POST', path, handler);
54
- put = (path: string, handler: ServerRouteHandler): this => this.addRoute('PUT', path, handler);
55
- delete = (path: string, handler: ServerRouteHandler): this => this.addRoute('DELETE', path, handler);
56
- patch = (path: string, handler: ServerRouteHandler): this => this.addRoute('PATCH', path, handler);
57
- options = (path: string, handler: ServerRouteHandler): this => this.addRoute('OPTIONS', path, handler);
54
+ // Support per-route middleware: accept middleware(s) before the final handler
55
+ get = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('GET', path, handlers as any);
56
+ post = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('POST', path, handlers as any);
57
+ put = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('PUT', path, handlers as any);
58
+ delete = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('DELETE', path, handlers as any);
59
+ patch = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('PATCH', path, handlers as any);
60
+ options = (path: string, ...handlers: Array<Middleware | ServerRouteHandler>): this => this.addRoute('OPTIONS', path, handlers as any);
58
61
 
59
- private addRoute(method: HttpMethod, path: string, handler: ServerRouteHandler): this {
62
+ private addRoute(method: HttpMethod, path: string, handlers: Array<Middleware | ServerRouteHandler>): this {
60
63
  const { pattern, paramNames } = this.pathToRegex(path);
61
- this.routes.push({ method, pattern, paramNames, handler });
64
+ // Last item is the actual route handler, preceding items are middlewares
65
+ if (!handlers || handlers.length === 0) throw new Error('Route must include a handler');
66
+ const last = handlers[handlers.length - 1] as ServerRouteHandler;
67
+ const middlewares = handlers.slice(0, handlers.length - 1).map(h => h as Middleware);
68
+ this.routes.push({ method, pattern, paramNames, handler: last, middlewares });
62
69
  return this;
63
70
  }
64
71
 
@@ -157,12 +164,20 @@ export class ServerRouter {
157
164
  }
158
165
 
159
166
  const ctx: ServerRouteContext = { req, res, params, query: this.parseQuery(url), body, headers: req.headers as any };
167
+
168
+ // Build middleware chain: global middlewares -> route middlewares -> final handler
169
+ const routeMiddlewares = route.middlewares || [];
170
+ const chain: Middleware[] = [ ...this.middlewares, ...routeMiddlewares, async (c, _next) => { await route.handler(c); } ];
171
+
160
172
  let i = 0;
161
- const next = async () => i < this.middlewares.length && await this.middlewares[i++](ctx, next);
173
+ const next = async () => {
174
+ if (i >= chain.length) return;
175
+ const mw = chain[i++];
176
+ await mw(ctx, next);
177
+ };
162
178
 
163
179
  try {
164
180
  await next();
165
- await route.handler(ctx);
166
181
  }
167
182
  catch (e) {
168
183
  console.error('[ServerRouter] Route error:', e);