@noxfly/noxus 2.5.0 → 3.0.0-dev.1

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 (58) hide show
  1. package/README.md +405 -340
  2. package/dist/app-injector-Bz3Upc0y.d.mts +125 -0
  3. package/dist/app-injector-Bz3Upc0y.d.ts +125 -0
  4. package/dist/child.d.mts +157 -23
  5. package/dist/child.d.ts +157 -23
  6. package/dist/child.js +1111 -1341
  7. package/dist/child.mjs +1086 -1294
  8. package/dist/main.d.mts +720 -284
  9. package/dist/main.d.ts +720 -284
  10. package/dist/main.js +1471 -1650
  11. package/dist/main.mjs +1409 -1559
  12. package/dist/preload.d.mts +28 -0
  13. package/dist/preload.d.ts +28 -0
  14. package/dist/preload.js +95 -0
  15. package/dist/preload.mjs +70 -0
  16. package/dist/renderer.d.mts +159 -22
  17. package/dist/renderer.d.ts +159 -22
  18. package/dist/renderer.js +104 -177
  19. package/dist/renderer.mjs +100 -172
  20. package/dist/request-BlTtiHbi.d.ts +112 -0
  21. package/dist/request-qJ9EiDZc.d.mts +112 -0
  22. package/package.json +24 -19
  23. package/src/DI/app-injector.ts +95 -106
  24. package/src/DI/injector-explorer.ts +93 -119
  25. package/src/DI/token.ts +53 -0
  26. package/src/decorators/controller.decorator.ts +38 -27
  27. package/src/decorators/guards.decorator.ts +5 -64
  28. package/src/decorators/injectable.decorator.ts +68 -15
  29. package/src/decorators/method.decorator.ts +40 -81
  30. package/src/decorators/middleware.decorator.ts +5 -72
  31. package/src/index.ts +4 -5
  32. package/src/internal/app.ts +217 -0
  33. package/src/internal/bootstrap.ts +108 -0
  34. package/src/{preload-bridge.ts → internal/preload-bridge.ts} +1 -1
  35. package/src/{renderer-client.ts → internal/renderer-client.ts} +2 -2
  36. package/src/{renderer-events.ts → internal/renderer-events.ts} +1 -1
  37. package/src/{request.ts → internal/request.ts} +3 -3
  38. package/src/internal/router.ts +353 -0
  39. package/src/internal/routes.ts +78 -0
  40. package/src/{socket.ts → internal/socket.ts} +4 -4
  41. package/src/main.ts +10 -14
  42. package/src/non-electron-process.ts +1 -2
  43. package/src/preload.ts +10 -0
  44. package/src/renderer.ts +13 -0
  45. package/src/window/window-manager.ts +255 -0
  46. package/tsconfig.json +5 -10
  47. package/tsup.config.ts +29 -13
  48. package/dist/app-injector-B3MvgV3k.d.mts +0 -95
  49. package/dist/app-injector-B3MvgV3k.d.ts +0 -95
  50. package/dist/request-CdpZ9qZL.d.ts +0 -167
  51. package/dist/request-Dx_5Prte.d.mts +0 -167
  52. package/src/app.ts +0 -244
  53. package/src/bootstrap.ts +0 -84
  54. package/src/decorators/inject.decorator.ts +0 -24
  55. package/src/decorators/injectable.metadata.ts +0 -15
  56. package/src/decorators/module.decorator.ts +0 -75
  57. package/src/router.ts +0 -594
  58. /package/src/{exceptions.ts → internal/exceptions.ts} +0 -0
package/dist/renderer.js CHANGED
@@ -8,7 +8,6 @@ var __defProp = Object.defineProperty;
8
8
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
9
  var __getOwnPropNames = Object.getOwnPropertyNames;
10
10
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
11
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
12
  var __export = (target, all) => {
14
13
  for (var name in all)
@@ -23,83 +22,55 @@ var __copyProps = (to, from, except, desc) => {
23
22
  return to;
24
23
  };
25
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
27
25
 
28
- // src/index.ts
29
- var src_exports = {};
30
- __export(src_exports, {
26
+ // src/renderer.ts
27
+ var renderer_exports = {};
28
+ __export(renderer_exports, {
31
29
  NoxRendererClient: () => NoxRendererClient,
32
30
  RENDERER_EVENT_TYPE: () => RENDERER_EVENT_TYPE,
33
31
  RendererEventRegistry: () => RendererEventRegistry,
34
32
  Request: () => Request,
35
33
  createRendererEventMessage: () => createRendererEventMessage,
36
- exposeNoxusBridge: () => exposeNoxusBridge,
37
34
  isRendererEventMessage: () => isRendererEventMessage
38
35
  });
39
- module.exports = __toCommonJS(src_exports);
40
-
41
- // src/request.ts
42
- var import_reflect_metadata3 = require("reflect-metadata");
43
-
44
- // src/DI/app-injector.ts
45
- var import_reflect_metadata2 = require("reflect-metadata");
46
-
47
- // src/decorators/inject.decorator.ts
48
- var import_reflect_metadata = require("reflect-metadata");
49
- var INJECT_METADATA_KEY = "custom:inject";
50
-
51
- // src/exceptions.ts
52
- var _ResponseException = class _ResponseException extends Error {
53
- constructor(statusOrMessage, message) {
54
- let statusCode;
55
- if (typeof statusOrMessage === "number") {
56
- statusCode = statusOrMessage;
57
- } else if (typeof statusOrMessage === "string") {
58
- message = statusOrMessage;
59
- }
60
- super(message ?? "");
61
- __publicField(this, "status", 0);
62
- if (statusCode !== void 0) {
63
- this.status = statusCode;
64
- }
65
- this.name = this.constructor.name.replace(/([A-Z])/g, " $1");
66
- }
67
- };
68
- __name(_ResponseException, "ResponseException");
69
- var ResponseException = _ResponseException;
70
- var _InternalServerException = class _InternalServerException extends ResponseException {
71
- constructor() {
72
- super(...arguments);
73
- __publicField(this, "status", 500);
74
- }
75
- };
76
- __name(_InternalServerException, "InternalServerException");
77
- var InternalServerException = _InternalServerException;
36
+ module.exports = __toCommonJS(renderer_exports);
78
37
 
79
38
  // src/utils/forward-ref.ts
80
39
  var _ForwardReference = class _ForwardReference {
81
40
  constructor(forwardRefFn) {
82
- __publicField(this, "forwardRefFn");
83
41
  this.forwardRefFn = forwardRefFn;
84
42
  }
85
43
  };
86
44
  __name(_ForwardReference, "ForwardReference");
87
45
  var ForwardReference = _ForwardReference;
88
46
 
47
+ // src/DI/token.ts
48
+ var _Token = class _Token {
49
+ constructor(target) {
50
+ this.target = target;
51
+ this.description = typeof target === "string" ? target : target.name;
52
+ }
53
+ toString() {
54
+ return `Token(${this.description})`;
55
+ }
56
+ };
57
+ __name(_Token, "Token");
58
+ var Token = _Token;
59
+
89
60
  // src/DI/app-injector.ts
61
+ function keyOf(k) {
62
+ return k;
63
+ }
64
+ __name(keyOf, "keyOf");
90
65
  var _AppInjector = class _AppInjector {
91
66
  constructor(name = null) {
92
- __publicField(this, "name");
93
- __publicField(this, "bindings", /* @__PURE__ */ new Map());
94
- __publicField(this, "singletons", /* @__PURE__ */ new Map());
95
- __publicField(this, "scoped", /* @__PURE__ */ new Map());
96
67
  this.name = name;
68
+ this.bindings = /* @__PURE__ */ new Map();
69
+ this.singletons = /* @__PURE__ */ new Map();
70
+ this.scoped = /* @__PURE__ */ new Map();
97
71
  }
98
72
  /**
99
- * Typically used to create a dependency injection scope
100
- * at the "scope" level (i.e., per-request lifetime).
101
- *
102
- * SHOULD NOT BE USED by anything else than the framework itself.
73
+ * Creates a child scope for per-request lifetime resolution.
103
74
  */
104
75
  createScope() {
105
76
  const scope = new _AppInjector();
@@ -108,93 +79,90 @@ var _AppInjector = class _AppInjector {
108
79
  return scope;
109
80
  }
110
81
  /**
111
- * Called when resolving a dependency,
112
- * i.e., retrieving the instance of a given class.
82
+ * Registers a binding explicitly.
83
+ */
84
+ register(key, implementation, lifetime, deps = []) {
85
+ const k = keyOf(key);
86
+ if (!this.bindings.has(k)) {
87
+ this.bindings.set(k, { lifetime, implementation, deps });
88
+ }
89
+ }
90
+ /**
91
+ * Resolves a dependency by token or class reference.
113
92
  */
114
93
  resolve(target) {
115
94
  if (target instanceof ForwardReference) {
116
- return new Proxy({}, {
117
- get: /* @__PURE__ */ __name((obj, prop, receiver) => {
118
- const realType = target.forwardRefFn();
119
- const instance = this.resolve(realType);
120
- const value = Reflect.get(instance, prop, receiver);
121
- return typeof value === "function" ? value.bind(instance) : value;
122
- }, "get"),
123
- set: /* @__PURE__ */ __name((obj, prop, value, receiver) => {
124
- const realType = target.forwardRefFn();
125
- const instance = this.resolve(realType);
126
- return Reflect.set(instance, prop, value, receiver);
127
- }, "set"),
128
- getPrototypeOf: /* @__PURE__ */ __name(() => {
129
- const realType = target.forwardRefFn();
130
- return realType.prototype;
131
- }, "getPrototypeOf")
132
- });
95
+ return this._resolveForwardRef(target);
133
96
  }
134
- const binding = this.bindings.get(target);
97
+ const k = keyOf(target);
98
+ const binding = this.bindings.get(k);
135
99
  if (!binding) {
136
- if (target === void 0) {
137
- throw new InternalServerException("Failed to resolve a dependency injection : Undefined target type.\nThis might be caused by a circular dependency.");
138
- }
139
- const name = target.name || "unknown";
140
- throw new InternalServerException(`Failed to resolve a dependency injection : No binding for type ${name}.
141
- Did you forget to use @Injectable() decorator ?`);
100
+ const name = target instanceof Token ? target.description : target.name ?? "unknown";
101
+ throw new Error(
102
+ `[Noxus DI] No binding found for "${name}".
103
+ Did you forget to declare it in @Injectable({ deps }) or in bootstrapApplication({ singletons })?`
104
+ );
142
105
  }
143
106
  switch (binding.lifetime) {
144
107
  case "transient":
145
- return this.instantiate(binding.implementation);
108
+ return this._instantiate(binding);
146
109
  case "scope": {
147
- if (this.scoped.has(target)) {
148
- return this.scoped.get(target);
149
- }
150
- const instance = this.instantiate(binding.implementation);
151
- this.scoped.set(target, instance);
152
- return instance;
110
+ if (this.scoped.has(k)) return this.scoped.get(k);
111
+ const inst = this._instantiate(binding);
112
+ this.scoped.set(k, inst);
113
+ return inst;
153
114
  }
154
115
  case "singleton": {
155
- if (binding.instance === void 0 && this.name === "root") {
156
- binding.instance = this.instantiate(binding.implementation);
157
- this.singletons.set(target, binding.instance);
116
+ if (this.singletons.has(k)) return this.singletons.get(k);
117
+ const inst = this._instantiate(binding);
118
+ this.singletons.set(k, inst);
119
+ if (binding.instance === void 0) {
120
+ binding.instance = inst;
158
121
  }
159
- return binding.instance;
122
+ return inst;
160
123
  }
161
124
  }
162
125
  }
163
- /**
164
- * Instantiates a class, resolving its dependencies.
165
- */
166
- instantiate(target) {
167
- const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
168
- const injectParams = Reflect.getMetadata(INJECT_METADATA_KEY, target) || [];
169
- const params = paramTypes.map((paramType, index) => {
170
- const overrideToken = injectParams[index];
171
- const actualToken = overrideToken !== void 0 ? overrideToken : paramType;
172
- return this.resolve(actualToken);
126
+ // -------------------------------------------------------------------------
127
+ _resolveForwardRef(ref) {
128
+ return new Proxy({}, {
129
+ get: /* @__PURE__ */ __name((_obj, prop, receiver) => {
130
+ const realType = ref.forwardRefFn();
131
+ const instance = this.resolve(realType);
132
+ const value = Reflect.get(instance, prop, receiver);
133
+ return typeof value === "function" ? value.bind(instance) : value;
134
+ }, "get"),
135
+ set: /* @__PURE__ */ __name((_obj, prop, value, receiver) => {
136
+ const realType = ref.forwardRefFn();
137
+ const instance = this.resolve(realType);
138
+ return Reflect.set(instance, prop, value, receiver);
139
+ }, "set"),
140
+ getPrototypeOf: /* @__PURE__ */ __name(() => {
141
+ const realType = ref.forwardRefFn();
142
+ return realType.prototype;
143
+ }, "getPrototypeOf")
173
144
  });
174
- return new target(...params);
145
+ }
146
+ _instantiate(binding) {
147
+ const resolvedDeps = binding.deps.map((dep) => this.resolve(dep));
148
+ return new binding.implementation(...resolvedDeps);
175
149
  }
176
150
  };
177
151
  __name(_AppInjector, "AppInjector");
178
152
  var AppInjector = _AppInjector;
179
153
  var RootInjector = new AppInjector("root");
180
154
 
181
- // src/request.ts
155
+ // src/internal/request.ts
182
156
  var _Request = class _Request {
183
157
  constructor(event, senderId, id, method, path, body) {
184
- __publicField(this, "event");
185
- __publicField(this, "senderId");
186
- __publicField(this, "id");
187
- __publicField(this, "method");
188
- __publicField(this, "path");
189
- __publicField(this, "body");
190
- __publicField(this, "context", RootInjector.createScope());
191
- __publicField(this, "params", {});
192
158
  this.event = event;
193
159
  this.senderId = senderId;
194
160
  this.id = id;
195
161
  this.method = method;
196
162
  this.path = path;
197
163
  this.body = body;
164
+ this.context = RootInjector.createScope();
165
+ this.params = {};
198
166
  this.path = path.replace(/^\/|\/$/g, "");
199
167
  }
200
168
  };
@@ -218,46 +186,10 @@ function isRendererEventMessage(value) {
218
186
  }
219
187
  __name(isRendererEventMessage, "isRendererEventMessage");
220
188
 
221
- // src/preload-bridge.ts
222
- var import_renderer = require("electron/renderer");
223
- var DEFAULT_EXPOSE_NAME = "noxus";
224
- var DEFAULT_INIT_EVENT = "init-port";
225
- var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
226
- var DEFAULT_RESPONSE_CHANNEL = "port";
227
- function exposeNoxusBridge(options = {}) {
228
- const { exposeAs = DEFAULT_EXPOSE_NAME, initMessageType = DEFAULT_INIT_EVENT, requestChannel = DEFAULT_REQUEST_CHANNEL, responseChannel = DEFAULT_RESPONSE_CHANNEL, targetWindow = window } = options;
229
- const api = {
230
- requestPort: /* @__PURE__ */ __name(() => {
231
- import_renderer.ipcRenderer.send(requestChannel);
232
- import_renderer.ipcRenderer.once(responseChannel, (event, message) => {
233
- const ports = (event.ports ?? []).filter((port) => port !== void 0);
234
- if (ports.length === 0) {
235
- console.error("[Noxus] No MessagePort received from main process.");
236
- return;
237
- }
238
- for (const port of ports) {
239
- try {
240
- port.start();
241
- } catch (error) {
242
- console.error("[Noxus] Failed to start MessagePort.", error);
243
- }
244
- }
245
- targetWindow.postMessage({
246
- type: initMessageType,
247
- senderId: message?.senderId
248
- }, "*", ports);
249
- });
250
- }, "requestPort")
251
- };
252
- import_renderer.contextBridge.exposeInMainWorld(exposeAs, api);
253
- return api;
254
- }
255
- __name(exposeNoxusBridge, "exposeNoxusBridge");
256
-
257
- // src/renderer-events.ts
189
+ // src/internal/renderer-events.ts
258
190
  var _RendererEventRegistry = class _RendererEventRegistry {
259
191
  constructor() {
260
- __publicField(this, "listeners", /* @__PURE__ */ new Map());
192
+ this.listeners = /* @__PURE__ */ new Map();
261
193
  }
262
194
  /**
263
195
  *
@@ -334,12 +266,9 @@ var _RendererEventRegistry = class _RendererEventRegistry {
334
266
  __name(_RendererEventRegistry, "RendererEventRegistry");
335
267
  var RendererEventRegistry = _RendererEventRegistry;
336
268
 
337
- // src/renderer-client.ts
338
- var DEFAULT_INIT_EVENT2 = "init-port";
339
- var DEFAULT_BRIDGE_NAMES = [
340
- "noxus",
341
- "ipcRenderer"
342
- ];
269
+ // src/internal/renderer-client.ts
270
+ var DEFAULT_INIT_EVENT = "init-port";
271
+ var DEFAULT_BRIDGE_NAMES = ["noxus", "ipcRenderer"];
343
272
  function defaultRequestId() {
344
273
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
345
274
  return crypto.randomUUID();
@@ -350,7 +279,8 @@ __name(defaultRequestId, "defaultRequestId");
350
279
  function normalizeBridgeNames(preferred) {
351
280
  const names = [];
352
281
  const add = /* @__PURE__ */ __name((name) => {
353
- if (!name) return;
282
+ if (!name)
283
+ return;
354
284
  if (!names.includes(name)) {
355
285
  names.push(name);
356
286
  }
@@ -385,20 +315,10 @@ function resolveBridgeFromWindow(windowRef, preferred) {
385
315
  __name(resolveBridgeFromWindow, "resolveBridgeFromWindow");
386
316
  var _NoxRendererClient = class _NoxRendererClient {
387
317
  constructor(options = {}) {
388
- __publicField(this, "events", new RendererEventRegistry());
389
- __publicField(this, "pendingRequests", /* @__PURE__ */ new Map());
390
- __publicField(this, "requestPort");
391
- __publicField(this, "socketPort");
392
- __publicField(this, "senderId");
393
- __publicField(this, "bridge");
394
- __publicField(this, "initMessageType");
395
- __publicField(this, "windowRef");
396
- __publicField(this, "generateRequestId");
397
- __publicField(this, "isReady", false);
398
- __publicField(this, "setupPromise");
399
- __publicField(this, "setupResolve");
400
- __publicField(this, "setupReject");
401
- __publicField(this, "onWindowMessage", /* @__PURE__ */ __name((event) => {
318
+ this.events = new RendererEventRegistry();
319
+ this.pendingRequests = /* @__PURE__ */ new Map();
320
+ this.isReady = false;
321
+ this.onWindowMessage = /* @__PURE__ */ __name((event) => {
402
322
  if (event.data?.type !== this.initMessageType) {
403
323
  return;
404
324
  }
@@ -425,14 +345,14 @@ var _NoxRendererClient = class _NoxRendererClient {
425
345
  this.isReady = true;
426
346
  this.setupResolve?.();
427
347
  this.resetSetupState(true);
428
- }, "onWindowMessage"));
429
- __publicField(this, "onSocketMessage", /* @__PURE__ */ __name((event) => {
348
+ }, "onWindowMessage");
349
+ this.onSocketMessage = /* @__PURE__ */ __name((event) => {
430
350
  if (this.events.tryDispatchFromMessageEvent(event)) {
431
351
  return;
432
352
  }
433
353
  console.warn("[Noxus] Received a socket message that is not a renderer event payload.", event.data);
434
- }, "onSocketMessage"));
435
- __publicField(this, "onRequestMessage", /* @__PURE__ */ __name((event) => {
354
+ }, "onSocketMessage");
355
+ this.onRequestMessage = /* @__PURE__ */ __name((event) => {
436
356
  if (this.events.tryDispatchFromMessageEvent(event)) {
437
357
  return;
438
358
  }
@@ -453,11 +373,11 @@ var _NoxRendererClient = class _NoxRendererClient {
453
373
  return;
454
374
  }
455
375
  pending.resolve(response.body);
456
- }, "onRequestMessage"));
376
+ }, "onRequestMessage");
457
377
  this.windowRef = options.windowRef ?? window;
458
378
  const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
459
379
  this.bridge = resolvedBridge ?? null;
460
- this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
380
+ this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT;
461
381
  this.generateRequestId = options.generateRequestId ?? defaultRequestId;
462
382
  }
463
383
  async setup() {
@@ -586,7 +506,6 @@ var NoxRendererClient = _NoxRendererClient;
586
506
  RendererEventRegistry,
587
507
  Request,
588
508
  createRendererEventMessage,
589
- exposeNoxusBridge,
590
509
  isRendererEventMessage
591
510
  });
592
511
  /**
@@ -594,4 +513,12 @@ var NoxRendererClient = _NoxRendererClient;
594
513
  * @license MIT
595
514
  * @author NoxFly
596
515
  */
516
+ /**
517
+ * @copyright 2025 NoxFly
518
+ * @license MIT
519
+ * @author NoxFly
520
+ *
521
+ * Entry point for renderer web consumers (Angular, React, Vue, Vanilla...).
522
+ * No Electron imports — safe to bundle with any web bundler.
523
+ */
597
524
  //# sourceMappingURL=renderer.js.map