clear-router 2.9.1 → 2.9.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.
@@ -1,54 +1,189 @@
1
1
  import { Request } from "./Request.mjs";
2
2
  import { Response } from "./Response.mjs";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
3
4
 
4
5
  //#region src/core/bindings.ts
5
6
  const metadataKey = Symbol.for("clear-router:binding-metadata");
6
7
  const bindings = /* @__PURE__ */ new WeakMap();
7
- var Container = class {
8
- static registry = /* @__PURE__ */ new Map();
9
- static bind(token, value) {
10
- this.registry.set(token, value);
8
+ var InjectionToken = class {
9
+ key;
10
+ constructor(description) {
11
+ this.description = description;
12
+ this.key = Symbol(description);
13
+ }
14
+ toString() {
15
+ return `InjectionToken(${this.description})`;
16
+ }
17
+ };
18
+ var ContainerResolutionError = class extends Error {
19
+ constructor(message, path) {
20
+ super(`${message}\nResolution path: ${path.map(describeToken).join(" -> ")}`);
21
+ this.path = path;
22
+ this.name = "ContainerResolutionError";
23
+ }
24
+ };
25
+ var Container = class Container {
26
+ static activeScope = new AsyncLocalStorage();
27
+ static containers = /* @__PURE__ */ new Set();
28
+ static globalContainer = new Container();
29
+ registry = /* @__PURE__ */ new Map();
30
+ instances = /* @__PURE__ */ new Map();
31
+ pending = /* @__PURE__ */ new Map();
32
+ constructor(parent, context, requestScope = false) {
33
+ this.parent = parent;
34
+ this.context = context;
35
+ this.requestScope = requestScope;
36
+ }
37
+ static get global() {
38
+ return this.globalContainer;
39
+ }
40
+ static current() {
41
+ return this.activeScope.getStore() ?? this.globalContainer;
42
+ }
43
+ static run(container, callback) {
44
+ return this.activeScope.run(container, callback);
45
+ }
46
+ static create(parent = this.globalContainer) {
47
+ const container = new Container(parent);
48
+ this.containers.add(container);
49
+ return container;
50
+ }
51
+ createRequestScope(ctx) {
52
+ return new Container(this, ctx, true);
53
+ }
54
+ static bind(token, value, options) {
55
+ this.globalContainer.bind(token, value, options);
11
56
  }
12
57
  static unbind(token) {
13
- this.registry.delete(token);
58
+ this.globalContainer.unbind(token);
14
59
  }
15
60
  static clear() {
16
- this.registry.clear();
61
+ this.globalContainer.clear();
62
+ for (const container of this.containers) container.clear();
17
63
  }
18
64
  static has(token) {
19
- return this.registry.has(token) || Boolean(this.findEquivalentToken(token));
65
+ return this.current().has(token);
20
66
  }
21
67
  static bindings() {
22
- return Object.fromEntries(this.registry.entries());
68
+ return this.current().bindings();
23
69
  }
24
70
  static async resolve(token, ctx, autoDiscover = false) {
25
- if (token === Request) return ctx.clearRequest;
26
- if (token === Response) return ctx.clearResponse;
27
- const binding = this.getBinding(token);
28
- if (binding) return this.resolveBinding(binding, ctx, autoDiscover);
29
- if (autoDiscover && typeof token === "function") return new token();
30
- }
31
- static getBinding(token) {
32
- if (this.registry.has(token)) return this.registry.get(token);
71
+ return this.current().resolve(token, ctx, autoDiscover);
72
+ }
73
+ bind(token, value, options) {
74
+ this.registry.set(token, normalizeProvider(value, options));
75
+ this.instances.delete(token);
76
+ }
77
+ unbind(token) {
78
+ this.registry.delete(token);
79
+ this.instances.delete(token);
80
+ }
81
+ clear() {
82
+ this.registry.clear();
83
+ this.instances.clear();
84
+ this.pending.clear();
85
+ }
86
+ has(token) {
87
+ return Boolean(this.findProvider(token));
88
+ }
89
+ entries() {
90
+ const entries = /* @__PURE__ */ new Map();
91
+ for (const container of this.lineage().reverse()) for (const [token, provider] of container.registry) entries.set(token, provider);
92
+ return entries;
93
+ }
94
+ bindings() {
95
+ return Object.fromEntries(Array.from(this.entries(), ([token, provider]) => [describeToken(token), provider]));
96
+ }
97
+ async resolve(token, ctx = this.context, autoDiscover = false) {
98
+ return this.resolveToken(token, ctx, {
99
+ autoDiscover,
100
+ stack: []
101
+ });
102
+ }
103
+ async resolveOrFail(token, ctx = this.context, autoDiscover = false) {
104
+ const resolved = await this.resolve(token, ctx, autoDiscover);
105
+ if (typeof resolved === "undefined") throw new ContainerResolutionError(`Cannot resolve ${describeToken(token)}`, [token]);
106
+ return resolved;
107
+ }
108
+ async resolveToken(token, ctx, state) {
109
+ if (token === Request) return ctx?.clearRequest;
110
+ if (token === Response) return ctx?.clearResponse;
111
+ if (state.stack.includes(token)) throw new ContainerResolutionError(`Circular dependency detected while resolving ${describeToken(token)}`, [...state.stack, token]);
112
+ const nextState = {
113
+ ...state,
114
+ stack: [...state.stack, token]
115
+ };
116
+ const found = this.findProvider(token);
117
+ if (found) return this.resolveProvider(found.token, found.provider, found.owner, ctx, nextState);
118
+ if (state.autoDiscover && typeof token === "function") return this.instantiate(token, void 0, ctx, nextState);
119
+ }
120
+ findProvider(token) {
121
+ if (this.registry.has(token)) return {
122
+ token,
123
+ provider: this.registry.get(token),
124
+ owner: this
125
+ };
33
126
  const equivalent = this.findEquivalentToken(token);
34
- return equivalent ? this.registry.get(equivalent) : void 0;
127
+ if (equivalent) return {
128
+ token: equivalent,
129
+ provider: this.registry.get(equivalent),
130
+ owner: this
131
+ };
132
+ return this.parent?.findProvider(token);
133
+ }
134
+ async resolveProvider(token, provider, owner, ctx, state) {
135
+ if ("useExisting" in provider) return this.resolveToken(provider.useExisting, ctx, state);
136
+ const cache = provider.scope === "singleton" ? owner : provider.scope === "request" ? this.findRequestScope() : void 0;
137
+ if (cache?.instances.has(token)) return cache.instances.get(token);
138
+ if (cache?.pending.has(token)) return cache.pending.get(token);
139
+ const create = async () => {
140
+ if ("useValue" in provider) return provider.useValue;
141
+ if ("useClass" in provider) return this.instantiate(provider.useClass, provider.dependencies, ctx, state);
142
+ return provider.useFactory(ctx);
143
+ };
144
+ if (!cache) return create();
145
+ const promise = create();
146
+ cache.pending.set(token, promise);
147
+ try {
148
+ const resolved = await promise;
149
+ if (typeof resolved !== "undefined") cache.instances.set(token, resolved);
150
+ return resolved;
151
+ } finally {
152
+ cache.pending.delete(token);
153
+ }
154
+ }
155
+ async instantiate(Type, dependencies, ctx, state) {
156
+ const tokens = dependencies ?? getInjectTokens(Type);
157
+ const args = [];
158
+ for (const dependency of tokens) {
159
+ const resolved = await this.resolveToken(dependency, ctx, state);
160
+ if (typeof resolved === "undefined") throw new ContainerResolutionError(`Cannot resolve ${describeToken(dependency)} required by ${describeToken(Type)}`, [...state.stack, dependency]);
161
+ args.push(resolved);
162
+ }
163
+ return new Type(...args);
35
164
  }
36
- static findEquivalentToken(token) {
165
+ findRequestScope() {
166
+ if (this.requestScope) return this;
167
+ return this.parent?.findRequestScope();
168
+ }
169
+ lineage() {
170
+ return [this, ...this.parent?.lineage() ?? []];
171
+ }
172
+ findEquivalentToken(token) {
173
+ if (typeof token !== "function") return void 0;
37
174
  const name = token.name;
38
- if (!name) return;
175
+ if (!name) return void 0;
39
176
  const tokenParent = Object.getPrototypeOf(token);
40
177
  const tokenProps = this.getComparableStaticProps(token);
41
178
  for (const registered of this.registry.keys()) {
42
- if (registered === token) continue;
43
- if (registered.name !== name) continue;
179
+ if (typeof registered !== "function" || registered === token || registered.name !== name) continue;
44
180
  const registeredParent = Object.getPrototypeOf(registered);
45
181
  if (tokenParent && registeredParent && tokenParent.name !== registeredParent.name) continue;
46
182
  const registeredProps = this.getComparableStaticProps(registered);
47
- if (!this.staticPropsMatch(token, registered, tokenProps, registeredProps)) continue;
48
- return registered;
183
+ if (this.staticPropsMatch(token, registered, tokenProps, registeredProps)) return registered;
49
184
  }
50
185
  }
51
- static getComparableStaticProps(token) {
186
+ getComparableStaticProps(token) {
52
187
  return Object.getOwnPropertyNames(token).filter((prop) => {
53
188
  return ![
54
189
  "length",
@@ -59,23 +194,38 @@ var Container = class {
59
194
  ].includes(prop);
60
195
  });
61
196
  }
62
- static staticPropsMatch(token, registered, tokenProps, registeredProps) {
197
+ staticPropsMatch(token, registered, tokenProps, registeredProps) {
63
198
  if (tokenProps.length !== registeredProps.length) return false;
64
- for (const prop of tokenProps) {
65
- if (!registeredProps.includes(prop)) return false;
66
- if (Reflect.get(token, prop) !== Reflect.get(registered, prop)) return false;
67
- }
199
+ for (const prop of tokenProps) if (!registeredProps.includes(prop) || Reflect.get(token, prop) !== Reflect.get(registered, prop)) return false;
68
200
  return true;
69
201
  }
70
- static async resolveBinding(binding, ctx, autoDiscover) {
71
- if (!binding) return void 0;
72
- if (typeof binding !== "function") return binding;
73
- if (isClass(binding)) return new binding();
74
- const resolved = await binding(ctx);
75
- if (typeof resolved === "function" && autoDiscover && isClass(resolved)) return new resolved();
76
- return resolved;
77
- }
78
202
  };
203
+ function normalizeProvider(value, options) {
204
+ if (isProvider(value)) return {
205
+ scope: "transient",
206
+ ...value
207
+ };
208
+ if (isClass(value)) return {
209
+ useClass: value,
210
+ scope: options?.scope ?? "transient"
211
+ };
212
+ if (typeof value === "function") return {
213
+ useFactory: value,
214
+ scope: options?.scope ?? "transient"
215
+ };
216
+ return { useValue: value };
217
+ }
218
+ function isProvider(value) {
219
+ return Boolean(value && typeof value === "object" && ("useValue" in value || "useClass" in value || "useFactory" in value || "useExisting" in value));
220
+ }
221
+ function getInjectTokens(Type) {
222
+ return Type.inject ?? getDesignParamTypes(Type);
223
+ }
224
+ function describeToken(token) {
225
+ if (token instanceof InjectionToken) return token.toString();
226
+ if (typeof token === "symbol") return token.description ?? token.toString();
227
+ return token.name || "<anonymous class>";
228
+ }
79
229
  function Bind(...tokens) {
80
230
  return ((target, propertyKeyOrContext) => {
81
231
  if (isStandardClassContext(propertyKeyOrContext)) {
@@ -103,6 +253,9 @@ function Bind(...tokens) {
103
253
  });
104
254
  });
105
255
  }
256
+ function getMetadataKey() {
257
+ return metadataKey;
258
+ }
106
259
  function getStandardMetadata(metadata, propertyKey) {
107
260
  const store = metadata && metadata[metadataKey];
108
261
  if (!store) return void 0;
@@ -151,4 +304,4 @@ function isClass(value) {
151
304
  }
152
305
 
153
306
  //#endregion
154
- export { Bind, Container, getBindingMetadataFromTargets, getDesignParamTypes, getStandardMetadata, isClass };
307
+ export { Bind, Container, ContainerResolutionError, InjectionToken, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata };
@@ -3,16 +3,29 @@ const require_helpers = require('./helpers.cjs');
3
3
  const require_RouteGroup = require('../RouteGroup.cjs');
4
4
  const require_Request = require('./Request.cjs');
5
5
  const require_Response = require('./Response.cjs');
6
+ const require_bindings = require('./bindings.cjs');
6
7
  const require_plugins = require('./plugins.cjs');
7
8
  const require_middleware = require('../decorators/middleware.cjs');
8
9
  const require_CoreRouter = require('./CoreRouter.cjs');
9
10
 
11
+ exports.Bind = require_bindings.Bind;
12
+ exports.Container = require_bindings.Container;
13
+ exports.ContainerResolutionError = require_bindings.ContainerResolutionError;
10
14
  exports.CoreRouter = require_CoreRouter.CoreRouter;
15
+ exports.InjectionToken = require_bindings.InjectionToken;
11
16
  exports.Request = require_Request.Request;
12
17
  exports.Response = require_Response.Response;
13
18
  exports.RouteGroup = require_RouteGroup.RouteGroup;
14
19
  exports.definePlugin = require_plugins.definePlugin;
20
+ exports.getBindingMetadata = require_bindings.getBindingMetadata;
21
+ exports.getBindingMetadataFromTargets = require_bindings.getBindingMetadataFromTargets;
15
22
  exports.getControllerMiddlewares = require_middleware.getControllerMiddlewares;
23
+ exports.getDesignParamTypes = require_bindings.getDesignParamTypes;
24
+ exports.getMetadataKey = require_bindings.getMetadataKey;
25
+ exports.getStandardMetadata = require_bindings.getStandardMetadata;
16
26
  exports.importFile = require_helpers.importFile;
27
+ exports.isClass = require_bindings.isClass;
17
28
  exports.middleware = require_middleware.middleware;
29
+ exports.setBindingMetadata = require_bindings.setBindingMetadata;
30
+ exports.setStandardMetadata = require_bindings.setStandardMetadata;
18
31
  exports.wrap = require_helpers.wrap;
@@ -1,8 +1,9 @@
1
1
  import { Response } from "./Response.cjs";
2
2
  import { Request } from "./Request.cjs";
3
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./bindings.cjs";
3
4
  import { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, definePlugin } from "./plugins.cjs";
4
5
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "../decorators/middleware.cjs";
5
6
  import { RouteGroup } from "../RouteGroup.cjs";
6
7
  import { CoreRouter } from "./CoreRouter.cjs";
7
8
  import { importFile, wrap } from "./helpers.cjs";
8
- export { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, CoreRouter, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, RouteGroup, definePlugin, getControllerMiddlewares, importFile, middleware, wrap };
9
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Container, ContainerResolutionError, CoreRouter, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, RouteGroup, ValueProvider, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, setBindingMetadata, setStandardMetadata, wrap };
@@ -1,8 +1,9 @@
1
1
  import { Response } from "./Response.mjs";
2
2
  import { Request } from "./Request.mjs";
3
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./bindings.mjs";
3
4
  import { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, definePlugin } from "./plugins.mjs";
4
5
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "../decorators/middleware.mjs";
5
6
  import { RouteGroup } from "../RouteGroup.mjs";
6
7
  import { CoreRouter } from "./CoreRouter.mjs";
7
8
  import { importFile, wrap } from "./helpers.mjs";
8
- export { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, CoreRouter, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, RouteGroup, definePlugin, getControllerMiddlewares, importFile, middleware, wrap };
9
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Container, ContainerResolutionError, CoreRouter, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, RouteGroup, ValueProvider, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, setBindingMetadata, setStandardMetadata, wrap };
@@ -2,8 +2,9 @@ import { importFile, wrap } from "./helpers.mjs";
2
2
  import { RouteGroup } from "../RouteGroup.mjs";
3
3
  import { Request } from "./Request.mjs";
4
4
  import { Response } from "./Response.mjs";
5
+ import { Bind, Container, ContainerResolutionError, InjectionToken, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./bindings.mjs";
5
6
  import { definePlugin } from "./plugins.mjs";
6
7
  import { getControllerMiddlewares, middleware } from "../decorators/middleware.mjs";
7
8
  import { CoreRouter } from "./CoreRouter.mjs";
8
9
 
9
- export { CoreRouter, Request, Response, RouteGroup, definePlugin, getControllerMiddlewares, importFile, middleware, wrap };
10
+ export { Bind, Container, ContainerResolutionError, CoreRouter, InjectionToken, Request, Response, RouteGroup, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, setBindingMetadata, setStandardMetadata, wrap };
@@ -1,7 +1,7 @@
1
1
  import { Response } from "./Response.cjs";
2
2
  import { RouterConfig } from "../types/basic.cjs";
3
3
  import { Request } from "./Request.cjs";
4
- import { BindToken, BindValue, Container } from "./bindings.cjs";
4
+ import { BindToken, BindValue, BindingOptions, Container } from "./bindings.cjs";
5
5
 
6
6
  //#region src/core/plugins.d.ts
7
7
  type PluginSetupResult = void | Promise<void>;
@@ -22,13 +22,13 @@ interface ClearRouterPluginArgumentsContext<X = any> extends ClearRouterPluginRe
22
22
  }
23
23
  type PluginBindFactory<T = any, X = any> = (ctx: ClearRouterPluginRequestContext<X>) => T | Promise<T>;
24
24
  type PluginBindValue<T = any, X = any> = BindValue<T> | PluginBindFactory<T, X>;
25
- type PluginBind<X = any> = <T>(token: BindToken<T>, value: PluginBindValue<T, X>) => void;
25
+ type PluginBind<X = any> = <T>(token: BindToken<T>, value: PluginBindValue<T, X>, options?: BindingOptions) => void;
26
26
  type PluginArgumentsResolver<HttpContext = any> = (ctx: ClearRouterPluginArgumentsContext<HttpContext>) => any[] | undefined | Promise<any[] | undefined>;
27
27
  interface ClearRouterPluginContext<Options = any, HttpContext = any> {
28
28
  /**
29
29
  * The service container
30
30
  */
31
- container: typeof Container;
31
+ container: Container;
32
32
  /**
33
33
  * Register service container bindings
34
34
  */
@@ -97,7 +97,7 @@ interface ClearRouterPlugin<Options = any, HttpContext = any> {
97
97
  */
98
98
  setup: (ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult;
99
99
  }
100
- type ClearRouterPluginInput<Options = any, HttpContext = any> = ClearRouterPlugin<Options> | ((ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult);
100
+ type ClearRouterPluginInput<Options = any, HttpContext = any> = ClearRouterPlugin<Options, HttpContext> | ((ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult);
101
101
  /**
102
102
  * Creates a new plugin
103
103
  *
@@ -1,7 +1,7 @@
1
1
  import { Response } from "./Response.mjs";
2
2
  import { RouterConfig } from "../types/basic.mjs";
3
3
  import { Request } from "./Request.mjs";
4
- import { BindToken, BindValue, Container } from "./bindings.mjs";
4
+ import { BindToken, BindValue, BindingOptions, Container } from "./bindings.mjs";
5
5
 
6
6
  //#region src/core/plugins.d.ts
7
7
  type PluginSetupResult = void | Promise<void>;
@@ -22,13 +22,13 @@ interface ClearRouterPluginArgumentsContext<X = any> extends ClearRouterPluginRe
22
22
  }
23
23
  type PluginBindFactory<T = any, X = any> = (ctx: ClearRouterPluginRequestContext<X>) => T | Promise<T>;
24
24
  type PluginBindValue<T = any, X = any> = BindValue<T> | PluginBindFactory<T, X>;
25
- type PluginBind<X = any> = <T>(token: BindToken<T>, value: PluginBindValue<T, X>) => void;
25
+ type PluginBind<X = any> = <T>(token: BindToken<T>, value: PluginBindValue<T, X>, options?: BindingOptions) => void;
26
26
  type PluginArgumentsResolver<HttpContext = any> = (ctx: ClearRouterPluginArgumentsContext<HttpContext>) => any[] | undefined | Promise<any[] | undefined>;
27
27
  interface ClearRouterPluginContext<Options = any, HttpContext = any> {
28
28
  /**
29
29
  * The service container
30
30
  */
31
- container: typeof Container;
31
+ container: Container;
32
32
  /**
33
33
  * Register service container bindings
34
34
  */
@@ -97,7 +97,7 @@ interface ClearRouterPlugin<Options = any, HttpContext = any> {
97
97
  */
98
98
  setup: (ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult;
99
99
  }
100
- type ClearRouterPluginInput<Options = any, HttpContext = any> = ClearRouterPlugin<Options> | ((ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult);
100
+ type ClearRouterPluginInput<Options = any, HttpContext = any> = ClearRouterPlugin<Options, HttpContext> | ((ctx: ClearRouterPluginContext<Options, HttpContext>) => PluginSetupResult);
101
101
  /**
102
102
  * Creates a new plugin
103
103
  *
@@ -1,8 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_middleware = require('./middleware.cjs');
3
2
  const require_bindings = require('../core/bindings.cjs');
3
+ const require_middleware = require('./middleware.cjs');
4
4
 
5
5
  exports.Bind = require_bindings.Bind;
6
6
  exports.Container = require_bindings.Container;
7
+ exports.ContainerResolutionError = require_bindings.ContainerResolutionError;
8
+ exports.InjectionToken = require_bindings.InjectionToken;
7
9
  exports.getControllerMiddlewares = require_middleware.getControllerMiddlewares;
8
10
  exports.middleware = require_middleware.middleware;
@@ -1,3 +1,3 @@
1
- import { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container } from "../core/bindings.cjs";
1
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider } from "../core/bindings.cjs";
2
2
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./middleware.cjs";
3
- export { Bind, type BindDecorator, type BindFactory, type BindToken, type BindValue, Container, type MiddlewareDecorator, type MiddlewareInput, getControllerMiddlewares, middleware };
3
+ export { Bind, type BindClass, type BindDecorator, type BindFactory, type BindProvider, type BindToken, type BindValue, type BindingOptions, type BindingScope, type ClassProvider, Container, ContainerResolutionError, type ExistingProvider, type FactoryProvider, InjectionToken, type MiddlewareDecorator, type MiddlewareInput, type ValueProvider, getControllerMiddlewares, middleware };
@@ -1,3 +1,3 @@
1
- import { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container } from "../core/bindings.mjs";
1
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider } from "../core/bindings.mjs";
2
2
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./middleware.mjs";
3
- export { Bind, type BindDecorator, type BindFactory, type BindToken, type BindValue, Container, type MiddlewareDecorator, type MiddlewareInput, getControllerMiddlewares, middleware };
3
+ export { Bind, type BindClass, type BindDecorator, type BindFactory, type BindProvider, type BindToken, type BindValue, type BindingOptions, type BindingScope, type ClassProvider, Container, ContainerResolutionError, type ExistingProvider, type FactoryProvider, InjectionToken, type MiddlewareDecorator, type MiddlewareInput, type ValueProvider, getControllerMiddlewares, middleware };
@@ -1,4 +1,4 @@
1
+ import { Bind, Container, ContainerResolutionError, InjectionToken } from "../core/bindings.mjs";
1
2
  import { getControllerMiddlewares, middleware } from "./middleware.mjs";
2
- import { Bind, Container } from "../core/bindings.mjs";
3
3
 
4
- export { Bind, Container, getControllerMiddlewares, middleware };
4
+ export { Bind, Container, ContainerResolutionError, InjectionToken, getControllerMiddlewares, middleware };
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_middleware = require('./middleware.cjs');
3
2
  const require_bindings = require('../core/bindings.cjs');
3
+ const require_middleware = require('./middleware.cjs');
4
4
  const require_CoreRouter = require('../core/CoreRouter.cjs');
5
5
  require('./index.cjs');
6
6
  require("reflect-metadata");
@@ -14,5 +14,7 @@ require_CoreRouter.CoreRouter.configureDefaults({ container: {
14
14
  //#endregion
15
15
  exports.Bind = require_bindings.Bind;
16
16
  exports.Container = require_bindings.Container;
17
+ exports.ContainerResolutionError = require_bindings.ContainerResolutionError;
18
+ exports.InjectionToken = require_bindings.InjectionToken;
17
19
  exports.getControllerMiddlewares = require_middleware.getControllerMiddlewares;
18
20
  exports.middleware = require_middleware.middleware;
@@ -1,3 +1,3 @@
1
- import { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container } from "../core/bindings.cjs";
1
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider } from "../core/bindings.cjs";
2
2
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./middleware.cjs";
3
- export { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container, MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware };
3
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, ValueProvider, getControllerMiddlewares, middleware };
@@ -1,3 +1,3 @@
1
- import { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container } from "../core/bindings.mjs";
1
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider } from "../core/bindings.mjs";
2
2
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./middleware.mjs";
3
- export { Bind, BindDecorator, BindFactory, BindToken, BindValue, Container, MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware };
3
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, ValueProvider, getControllerMiddlewares, middleware };
@@ -1,5 +1,5 @@
1
+ import { Bind, Container, ContainerResolutionError, InjectionToken } from "../core/bindings.mjs";
1
2
  import { getControllerMiddlewares, middleware } from "./middleware.mjs";
2
- import { Bind, Container } from "../core/bindings.mjs";
3
3
  import { CoreRouter } from "../core/CoreRouter.mjs";
4
4
  import "./index.mjs";
5
5
  import "reflect-metadata";
@@ -11,4 +11,4 @@ CoreRouter.configureDefaults({ container: {
11
11
  } });
12
12
 
13
13
  //#endregion
14
- export { Bind, Container, getControllerMiddlewares, middleware };
14
+ export { Bind, Container, ContainerResolutionError, InjectionToken, getControllerMiddlewares, middleware };
package/dist/index.cjs CHANGED
@@ -7,22 +7,35 @@ const require_RouteGroup = require('./RouteGroup.cjs');
7
7
  const require_RouteRegistrar = require('./RouteRegistrar.cjs');
8
8
  const require_Request = require('./core/Request.cjs');
9
9
  const require_Response = require('./core/Response.cjs');
10
+ const require_bindings = require('./core/bindings.cjs');
10
11
  const require_plugins = require('./core/plugins.cjs');
11
12
  const require_middleware = require('./decorators/middleware.cjs');
12
13
  const require_CoreRouter = require('./core/CoreRouter.cjs');
13
14
  require('./core/index.cjs');
14
15
 
16
+ exports.Bind = require_bindings.Bind;
15
17
  exports.ClearRequest = require_ClearRequest.ClearRequest;
18
+ exports.Container = require_bindings.Container;
19
+ exports.ContainerResolutionError = require_bindings.ContainerResolutionError;
16
20
  exports.Controller = require_Controller.Controller;
17
21
  exports.CoreRouter = require_CoreRouter.CoreRouter;
22
+ exports.InjectionToken = require_bindings.InjectionToken;
18
23
  exports.Request = require_Request.Request;
19
24
  exports.Response = require_Response.Response;
20
25
  exports.Route = require_Route.Route;
21
26
  exports.RouteGroup = require_RouteGroup.RouteGroup;
22
27
  exports.RouteRegistrar = require_RouteRegistrar.RouteRegistrar;
23
28
  exports.definePlugin = require_plugins.definePlugin;
29
+ exports.getBindingMetadata = require_bindings.getBindingMetadata;
30
+ exports.getBindingMetadataFromTargets = require_bindings.getBindingMetadataFromTargets;
24
31
  exports.getControllerMiddlewares = require_middleware.getControllerMiddlewares;
32
+ exports.getDesignParamTypes = require_bindings.getDesignParamTypes;
33
+ exports.getMetadataKey = require_bindings.getMetadataKey;
34
+ exports.getStandardMetadata = require_bindings.getStandardMetadata;
25
35
  exports.importFile = require_helpers.importFile;
36
+ exports.isClass = require_bindings.isClass;
26
37
  exports.middleware = require_middleware.middleware;
27
38
  exports.parseDomainParameters = require_Route.parseDomainParameters;
39
+ exports.setBindingMetadata = require_bindings.setBindingMetadata;
40
+ exports.setStandardMetadata = require_bindings.setStandardMetadata;
28
41
  exports.wrap = require_helpers.wrap;
package/dist/index.d.cts CHANGED
@@ -3,6 +3,7 @@ import { Response } from "./core/Response.cjs";
3
3
  import { ClearRequest } from "./ClearRequest.cjs";
4
4
  import { Route, parseDomainParameters } from "./Route.cjs";
5
5
  import { Request } from "./core/Request.cjs";
6
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./core/bindings.cjs";
6
7
  import { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, definePlugin } from "./core/plugins.cjs";
7
8
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./decorators/middleware.cjs";
8
9
  import { Controller } from "./Controller.cjs";
@@ -10,4 +11,4 @@ import { RouteGroup } from "./RouteGroup.cjs";
10
11
  import { RouteRegistrar, RouteRegistrarGroupFactory } from "./RouteRegistrar.cjs";
11
12
  import { CoreRouter } from "./core/CoreRouter.cjs";
12
13
  import { importFile, wrap } from "./core/helpers.cjs";
13
- export { ClearHttpContext, ClearRequest, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Controller, CoreRouter, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, Route, RouteGroup, RouteParameter, RouteRegistrar, RouteRegistrarGroupFactory, definePlugin, getControllerMiddlewares, importFile, middleware, parseDomainParameters, wrap };
14
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, ClearHttpContext, ClearRequest, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Container, ContainerResolutionError, Controller, CoreRouter, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, Route, RouteGroup, RouteParameter, RouteRegistrar, RouteRegistrarGroupFactory, ValueProvider, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, parseDomainParameters, setBindingMetadata, setStandardMetadata, wrap };
package/dist/index.d.mts CHANGED
@@ -3,6 +3,7 @@ import { Response } from "./core/Response.mjs";
3
3
  import { ClearRequest } from "./ClearRequest.mjs";
4
4
  import { Route, parseDomainParameters } from "./Route.mjs";
5
5
  import { Request } from "./core/Request.mjs";
6
+ import { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, Container, ContainerResolutionError, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./core/bindings.mjs";
6
7
  import { ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, definePlugin } from "./core/plugins.mjs";
7
8
  import { MiddlewareDecorator, MiddlewareInput, getControllerMiddlewares, middleware } from "./decorators/middleware.mjs";
8
9
  import { Controller } from "./Controller.mjs";
@@ -10,4 +11,4 @@ import { RouteGroup } from "./RouteGroup.mjs";
10
11
  import { RouteRegistrar, RouteRegistrarGroupFactory } from "./RouteRegistrar.mjs";
11
12
  import { CoreRouter } from "./core/CoreRouter.mjs";
12
13
  import { importFile, wrap } from "./core/helpers.mjs";
13
- export { ClearHttpContext, ClearRequest, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Controller, CoreRouter, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, Route, RouteGroup, RouteParameter, RouteRegistrar, RouteRegistrarGroupFactory, definePlugin, getControllerMiddlewares, importFile, middleware, parseDomainParameters, wrap };
14
+ export { Bind, BindClass, BindDecorator, BindFactory, BindProvider, BindToken, BindValue, BindingOptions, BindingScope, ClassProvider, ClearHttpContext, ClearRequest, ClearRouterPlugin, ClearRouterPluginArgumentsContext, ClearRouterPluginContext, ClearRouterPluginInput, ClearRouterPluginRequestContext, Container, ContainerResolutionError, Controller, CoreRouter, ExistingProvider, FactoryProvider, InjectionToken, MiddlewareDecorator, MiddlewareInput, PluginArgumentsResolver, PluginBind, PluginBindFactory, PluginBindValue, PluginSetupResult, Request, Response, Route, RouteGroup, RouteParameter, RouteRegistrar, RouteRegistrarGroupFactory, ValueProvider, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, parseDomainParameters, setBindingMetadata, setStandardMetadata, wrap };
package/dist/index.mjs CHANGED
@@ -6,9 +6,10 @@ import { RouteGroup } from "./RouteGroup.mjs";
6
6
  import { RouteRegistrar } from "./RouteRegistrar.mjs";
7
7
  import { Request } from "./core/Request.mjs";
8
8
  import { Response } from "./core/Response.mjs";
9
+ import { Bind, Container, ContainerResolutionError, InjectionToken, getBindingMetadata, getBindingMetadataFromTargets, getDesignParamTypes, getMetadataKey, getStandardMetadata, isClass, setBindingMetadata, setStandardMetadata } from "./core/bindings.mjs";
9
10
  import { definePlugin } from "./core/plugins.mjs";
10
11
  import { getControllerMiddlewares, middleware } from "./decorators/middleware.mjs";
11
12
  import { CoreRouter } from "./core/CoreRouter.mjs";
12
13
  import "./core/index.mjs";
13
14
 
14
- export { ClearRequest, Controller, CoreRouter, Request, Response, Route, RouteGroup, RouteRegistrar, definePlugin, getControllerMiddlewares, importFile, middleware, parseDomainParameters, wrap };
15
+ export { Bind, ClearRequest, Container, ContainerResolutionError, Controller, CoreRouter, InjectionToken, Request, Response, Route, RouteGroup, RouteRegistrar, definePlugin, getBindingMetadata, getBindingMetadataFromTargets, getControllerMiddlewares, getDesignParamTypes, getMetadataKey, getStandardMetadata, importFile, isClass, middleware, parseDomainParameters, setBindingMetadata, setStandardMetadata, wrap };
@@ -56,6 +56,11 @@ interface RouterConfig {
56
56
  container?: {
57
57
  /** Whether decorated handler parameter binding is enabled */enabled?: boolean; /** Whether unknown constructor tokens should be instantiated automatically */
58
58
  autoDiscover?: boolean;
59
+ /**
60
+ * Whether unresolved decorated arguments should throw instead of using
61
+ * the default handler signature
62
+ */
63
+ strict?: boolean;
59
64
  };
60
65
  }
61
66
  type ResourceRouteDefinition = {
@@ -56,6 +56,11 @@ interface RouterConfig {
56
56
  container?: {
57
57
  /** Whether decorated handler parameter binding is enabled */enabled?: boolean; /** Whether unknown constructor tokens should be instantiated automatically */
58
58
  autoDiscover?: boolean;
59
+ /**
60
+ * Whether unresolved decorated arguments should throw instead of using
61
+ * the default handler signature
62
+ */
63
+ strict?: boolean;
59
64
  };
60
65
  }
61
66
  type ResourceRouteDefinition = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clear-router",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "Laravel-style routing for Node.js with support for Express, H3, Fastify, Hono, and Koa, including CommonJS, ESM, and TypeScript support.",
5
5
  "keywords": [
6
6
  "h3",