@lara-node/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +248 -0
- package/dist/index.d.cts +91 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +220 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
13
|
+
get: ((k) => from[k]).bind(null, key),
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
20
|
+
value: mod,
|
|
21
|
+
enumerable: true
|
|
22
|
+
}) : target, mod));
|
|
23
|
+
//#endregion
|
|
24
|
+
require("reflect-metadata");
|
|
25
|
+
let express = require("express");
|
|
26
|
+
express = __toESM(express, 1);
|
|
27
|
+
let http = require("http");
|
|
28
|
+
let cors = require("cors");
|
|
29
|
+
cors = __toESM(cors, 1);
|
|
30
|
+
//#region src/Container.ts
|
|
31
|
+
var Container = class Container {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.bindings = /* @__PURE__ */ new Map();
|
|
34
|
+
this.instances = /* @__PURE__ */ new Map();
|
|
35
|
+
this.aliases = /* @__PURE__ */ new Map();
|
|
36
|
+
this.resolvingCallbacks = [];
|
|
37
|
+
}
|
|
38
|
+
static getInstance() {
|
|
39
|
+
if (!Container.instance) Container.instance = new Container();
|
|
40
|
+
return Container.instance;
|
|
41
|
+
}
|
|
42
|
+
bind(abstract, concrete = abstract, singleton = false) {
|
|
43
|
+
this.bindings.set(abstract, {
|
|
44
|
+
concrete,
|
|
45
|
+
singleton
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
bindIf(abstract, concrete = abstract) {
|
|
49
|
+
if (!this.bound(abstract)) this.bind(abstract, concrete);
|
|
50
|
+
}
|
|
51
|
+
singleton(abstract, concrete = abstract) {
|
|
52
|
+
this.bind(abstract, concrete, true);
|
|
53
|
+
}
|
|
54
|
+
singletonIf(abstract, concrete = abstract) {
|
|
55
|
+
if (!this.bound(abstract)) this.singleton(abstract, concrete);
|
|
56
|
+
}
|
|
57
|
+
instance(abstract, instance) {
|
|
58
|
+
this.instances.set(abstract, instance);
|
|
59
|
+
}
|
|
60
|
+
alias(abstract, alias) {
|
|
61
|
+
this.aliases.set(alias, abstract);
|
|
62
|
+
}
|
|
63
|
+
bound(abstract) {
|
|
64
|
+
return this.bindings.has(abstract) || this.instances.has(abstract);
|
|
65
|
+
}
|
|
66
|
+
make(abstract) {
|
|
67
|
+
abstract = this.getAlias(abstract);
|
|
68
|
+
if (this.instances.has(abstract)) return this.instances.get(abstract);
|
|
69
|
+
const binding = this.bindings.get(abstract);
|
|
70
|
+
const concrete = binding?.concrete ?? abstract;
|
|
71
|
+
const object = this.build(concrete);
|
|
72
|
+
if (binding?.singleton) this.instances.set(abstract, object);
|
|
73
|
+
this.fireResolving(object);
|
|
74
|
+
return object;
|
|
75
|
+
}
|
|
76
|
+
build(concrete) {
|
|
77
|
+
if (typeof concrete === "function") return new concrete(...(Reflect.getMetadata("design:paramtypes", concrete) ?? []).map((param) => this.make(param)));
|
|
78
|
+
return concrete;
|
|
79
|
+
}
|
|
80
|
+
resolving(callback) {
|
|
81
|
+
this.resolvingCallbacks.push(callback);
|
|
82
|
+
}
|
|
83
|
+
fireResolving(object) {
|
|
84
|
+
for (const cb of this.resolvingCallbacks) cb(object, this);
|
|
85
|
+
}
|
|
86
|
+
getAlias(abstract) {
|
|
87
|
+
return this.aliases.get(abstract) ?? abstract;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const container = Container.getInstance();
|
|
91
|
+
function app(abstract) {
|
|
92
|
+
if (!abstract) return container;
|
|
93
|
+
return container.make(abstract);
|
|
94
|
+
}
|
|
95
|
+
function Injectable() {
|
|
96
|
+
return (target) => target;
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/Application.ts
|
|
100
|
+
var Application = class {
|
|
101
|
+
constructor(container) {
|
|
102
|
+
this.container = container;
|
|
103
|
+
this.providers = [];
|
|
104
|
+
this.loadedProviders = /* @__PURE__ */ new Map();
|
|
105
|
+
this.deferredServices = /* @__PURE__ */ new Map();
|
|
106
|
+
this.booted = false;
|
|
107
|
+
this.httpServer = null;
|
|
108
|
+
this.expressApp = (0, express.default)();
|
|
109
|
+
}
|
|
110
|
+
register(provider, force = false) {
|
|
111
|
+
const name = provider.name;
|
|
112
|
+
if (!force && this.loadedProviders.has(name)) return this.loadedProviders.get(name);
|
|
113
|
+
const instance = new provider(this);
|
|
114
|
+
this.markAsRegistered(instance);
|
|
115
|
+
if (this.booted) this.bootProvider(instance);
|
|
116
|
+
return instance;
|
|
117
|
+
}
|
|
118
|
+
markAsRegistered(provider) {
|
|
119
|
+
this.providers.push(provider);
|
|
120
|
+
this.loadedProviders.set(provider.constructor.name, provider);
|
|
121
|
+
provider.register();
|
|
122
|
+
}
|
|
123
|
+
registerDeferredProvider(provider) {
|
|
124
|
+
const instance = new provider(this);
|
|
125
|
+
for (const service of instance.provides()) this.deferredServices.set(service, provider);
|
|
126
|
+
}
|
|
127
|
+
loadDeferredProvider(service) {
|
|
128
|
+
if (!this.deferredServices.has(service)) return;
|
|
129
|
+
const provider = this.deferredServices.get(service);
|
|
130
|
+
this.deferredServices.delete(service);
|
|
131
|
+
this.register(provider);
|
|
132
|
+
}
|
|
133
|
+
make(abstract) {
|
|
134
|
+
const key = typeof abstract === "string" ? abstract : abstract.name;
|
|
135
|
+
if (this.deferredServices.has(key)) this.loadDeferredProvider(key);
|
|
136
|
+
return this.container.make(abstract);
|
|
137
|
+
}
|
|
138
|
+
async boot() {
|
|
139
|
+
if (this.booted) return;
|
|
140
|
+
for (const provider of this.providers) await provider.callBootingCallbacks();
|
|
141
|
+
for (const provider of this.providers) await this.bootProvider(provider);
|
|
142
|
+
for (const provider of this.providers) await provider.callBootedCallbacks();
|
|
143
|
+
this.booted = true;
|
|
144
|
+
}
|
|
145
|
+
async bootProvider(provider) {
|
|
146
|
+
await provider.boot();
|
|
147
|
+
}
|
|
148
|
+
getProviders() {
|
|
149
|
+
return this.providers;
|
|
150
|
+
}
|
|
151
|
+
getProvider(cls) {
|
|
152
|
+
return this.loadedProviders.get(cls.name);
|
|
153
|
+
}
|
|
154
|
+
isBooted() {
|
|
155
|
+
return this.booted;
|
|
156
|
+
}
|
|
157
|
+
getDeferredServices() {
|
|
158
|
+
return this.deferredServices;
|
|
159
|
+
}
|
|
160
|
+
getExpressApp() {
|
|
161
|
+
return this.expressApp;
|
|
162
|
+
}
|
|
163
|
+
useMiddleware(middleware) {
|
|
164
|
+
this.expressApp.use(middleware);
|
|
165
|
+
}
|
|
166
|
+
useMiddlewares(middlewares) {
|
|
167
|
+
for (const mw of middlewares) this.expressApp.use(mw);
|
|
168
|
+
}
|
|
169
|
+
mountRoutes(prefix, router) {
|
|
170
|
+
this.expressApp.use(prefix, router);
|
|
171
|
+
}
|
|
172
|
+
configureBaseMiddleware() {
|
|
173
|
+
this.expressApp.use((0, cors.default)());
|
|
174
|
+
this.expressApp.use(express.default.json());
|
|
175
|
+
this.expressApp.use(express.default.urlencoded({ extended: true }));
|
|
176
|
+
}
|
|
177
|
+
configure404Handler() {
|
|
178
|
+
this.expressApp.use((req, res) => {
|
|
179
|
+
res.status(404).json({
|
|
180
|
+
success: false,
|
|
181
|
+
message: `Cannot ${req.method} ${req.originalUrl}`
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
configureErrorHandler(handler) {
|
|
186
|
+
this.expressApp.use(handler);
|
|
187
|
+
}
|
|
188
|
+
getHttpServer() {
|
|
189
|
+
return this.httpServer;
|
|
190
|
+
}
|
|
191
|
+
createHttpServer() {
|
|
192
|
+
if (!this.httpServer) this.httpServer = (0, http.createServer)(this.expressApp);
|
|
193
|
+
return this.httpServer;
|
|
194
|
+
}
|
|
195
|
+
listen(port, callback) {
|
|
196
|
+
this.createHttpServer().listen(port, callback);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
//#endregion
|
|
200
|
+
//#region src/ServiceProvider.ts
|
|
201
|
+
var ServiceProvider = class {
|
|
202
|
+
constructor(app) {
|
|
203
|
+
this.app = app;
|
|
204
|
+
this.bootingCallbacks = [];
|
|
205
|
+
this.bootedCallbacks = [];
|
|
206
|
+
}
|
|
207
|
+
get container() {
|
|
208
|
+
return this.app.container;
|
|
209
|
+
}
|
|
210
|
+
singleton(abstract, concrete = abstract) {
|
|
211
|
+
this.container.singleton(abstract, concrete);
|
|
212
|
+
}
|
|
213
|
+
boot() {}
|
|
214
|
+
registerProvider(provider) {
|
|
215
|
+
return this.app.register(provider);
|
|
216
|
+
}
|
|
217
|
+
registerProviders(providers) {
|
|
218
|
+
for (const p of providers) this.registerProvider(p);
|
|
219
|
+
}
|
|
220
|
+
booting(callback) {
|
|
221
|
+
this.bootingCallbacks.push(callback);
|
|
222
|
+
}
|
|
223
|
+
booted(callback) {
|
|
224
|
+
this.bootedCallbacks.push(callback);
|
|
225
|
+
}
|
|
226
|
+
async callBootingCallbacks() {
|
|
227
|
+
for (const cb of this.bootingCallbacks) await cb();
|
|
228
|
+
}
|
|
229
|
+
async callBootedCallbacks() {
|
|
230
|
+
for (const cb of this.bootedCallbacks) await cb();
|
|
231
|
+
}
|
|
232
|
+
provides() {
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
when() {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
isDeferred() {
|
|
239
|
+
return this.provides().length > 0;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
//#endregion
|
|
243
|
+
exports.Application = Application;
|
|
244
|
+
exports.Container = Container;
|
|
245
|
+
exports.Injectable = Injectable;
|
|
246
|
+
exports.ServiceProvider = ServiceProvider;
|
|
247
|
+
exports.app = app;
|
|
248
|
+
exports.container = container;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Application as Application$1, RequestHandler } from "express";
|
|
2
|
+
import { Server } from "http";
|
|
3
|
+
|
|
4
|
+
//#region src/Container.d.ts
|
|
5
|
+
type Constructor<T = any> = new (...args: any[]) => T;
|
|
6
|
+
type Abstract<T = any> = Constructor<T> | string | symbol;
|
|
7
|
+
declare class Container {
|
|
8
|
+
private static instance;
|
|
9
|
+
private bindings;
|
|
10
|
+
private instances;
|
|
11
|
+
private aliases;
|
|
12
|
+
private resolvingCallbacks;
|
|
13
|
+
static getInstance(): Container;
|
|
14
|
+
bind<T>(abstract: Abstract<T>, concrete?: any, singleton?: boolean): void;
|
|
15
|
+
bindIf<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
16
|
+
singleton<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
17
|
+
singletonIf<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
18
|
+
instance<T>(abstract: Abstract<T>, instance: T): void;
|
|
19
|
+
alias(abstract: Abstract, alias: Abstract): void;
|
|
20
|
+
bound(abstract: Abstract): boolean;
|
|
21
|
+
make<T>(abstract: Abstract<T>): T;
|
|
22
|
+
private build;
|
|
23
|
+
resolving(callback: Function): void;
|
|
24
|
+
private fireResolving;
|
|
25
|
+
private getAlias;
|
|
26
|
+
}
|
|
27
|
+
declare const container: Container;
|
|
28
|
+
declare function app<T>(abstract?: Abstract<T>): T | Container;
|
|
29
|
+
declare function Injectable(): ClassDecorator;
|
|
30
|
+
//# sourceMappingURL=Container.d.ts.map
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/ServiceProvider.d.ts
|
|
33
|
+
type ServiceProviderClass = new (app: Application) => ServiceProvider;
|
|
34
|
+
declare abstract class ServiceProvider {
|
|
35
|
+
protected app: Application;
|
|
36
|
+
protected bootingCallbacks: Array<() => void | Promise<void>>;
|
|
37
|
+
protected bootedCallbacks: Array<() => void | Promise<void>>;
|
|
38
|
+
constructor(app: Application);
|
|
39
|
+
protected get container(): Container;
|
|
40
|
+
abstract register(): void;
|
|
41
|
+
singleton<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
42
|
+
boot(): void | Promise<void>;
|
|
43
|
+
protected registerProvider(provider: ServiceProviderClass): ServiceProvider;
|
|
44
|
+
protected registerProviders(providers: ServiceProviderClass[]): void;
|
|
45
|
+
booting(callback: () => void | Promise<void>): void;
|
|
46
|
+
booted(callback: () => void | Promise<void>): void;
|
|
47
|
+
callBootingCallbacks(): Promise<void>;
|
|
48
|
+
callBootedCallbacks(): Promise<void>;
|
|
49
|
+
provides(): string[];
|
|
50
|
+
when(): string[];
|
|
51
|
+
isDeferred(): boolean;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ServiceProvider.d.ts.map
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/Application.d.ts
|
|
56
|
+
declare class Application {
|
|
57
|
+
container: Container;
|
|
58
|
+
private providers;
|
|
59
|
+
private loadedProviders;
|
|
60
|
+
private deferredServices;
|
|
61
|
+
private booted;
|
|
62
|
+
private expressApp;
|
|
63
|
+
private httpServer;
|
|
64
|
+
constructor(container: Container);
|
|
65
|
+
register(provider: ServiceProviderClass, force?: boolean): ServiceProvider;
|
|
66
|
+
protected markAsRegistered(provider: ServiceProvider): void;
|
|
67
|
+
registerDeferredProvider(provider: ServiceProviderClass): void;
|
|
68
|
+
loadDeferredProvider(service: string): void;
|
|
69
|
+
make<T>(abstract: string | (new (...args: any[]) => T)): T;
|
|
70
|
+
boot(): Promise<void>;
|
|
71
|
+
protected bootProvider(provider: ServiceProvider): Promise<void>;
|
|
72
|
+
getProviders(): ServiceProvider[];
|
|
73
|
+
getProvider(cls: ServiceProviderClass): ServiceProvider | undefined;
|
|
74
|
+
isBooted(): boolean;
|
|
75
|
+
getDeferredServices(): Map<string, ServiceProviderClass>;
|
|
76
|
+
getExpressApp(): Application$1;
|
|
77
|
+
useMiddleware(middleware: RequestHandler): void;
|
|
78
|
+
useMiddlewares(middlewares: RequestHandler[]): void;
|
|
79
|
+
mountRoutes(prefix: string, router: any): void;
|
|
80
|
+
configureBaseMiddleware(): void;
|
|
81
|
+
configure404Handler(): void;
|
|
82
|
+
configureErrorHandler(handler: RequestHandler): void;
|
|
83
|
+
getHttpServer(): Server | null;
|
|
84
|
+
createHttpServer(): Server;
|
|
85
|
+
listen(port: number | string, callback?: () => void): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=Application.d.ts.map
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
export { type Abstract, Application, type Constructor, Container, Injectable, ServiceProvider, type ServiceProviderClass, app, container };
|
|
91
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/Container.ts","../src/ServiceProvider.ts","../src/Application.ts"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Application as Application$1, RequestHandler } from "express";
|
|
3
|
+
import { Server } from "http";
|
|
4
|
+
|
|
5
|
+
//#region src/Container.d.ts
|
|
6
|
+
type Constructor<T = any> = new (...args: any[]) => T;
|
|
7
|
+
type Abstract<T = any> = Constructor<T> | string | symbol;
|
|
8
|
+
declare class Container {
|
|
9
|
+
private static instance;
|
|
10
|
+
private bindings;
|
|
11
|
+
private instances;
|
|
12
|
+
private aliases;
|
|
13
|
+
private resolvingCallbacks;
|
|
14
|
+
static getInstance(): Container;
|
|
15
|
+
bind<T>(abstract: Abstract<T>, concrete?: any, singleton?: boolean): void;
|
|
16
|
+
bindIf<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
17
|
+
singleton<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
18
|
+
singletonIf<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
19
|
+
instance<T>(abstract: Abstract<T>, instance: T): void;
|
|
20
|
+
alias(abstract: Abstract, alias: Abstract): void;
|
|
21
|
+
bound(abstract: Abstract): boolean;
|
|
22
|
+
make<T>(abstract: Abstract<T>): T;
|
|
23
|
+
private build;
|
|
24
|
+
resolving(callback: Function): void;
|
|
25
|
+
private fireResolving;
|
|
26
|
+
private getAlias;
|
|
27
|
+
}
|
|
28
|
+
declare const container: Container;
|
|
29
|
+
declare function app<T>(abstract?: Abstract<T>): T | Container;
|
|
30
|
+
declare function Injectable(): ClassDecorator;
|
|
31
|
+
//# sourceMappingURL=Container.d.ts.map
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/ServiceProvider.d.ts
|
|
34
|
+
type ServiceProviderClass = new (app: Application) => ServiceProvider;
|
|
35
|
+
declare abstract class ServiceProvider {
|
|
36
|
+
protected app: Application;
|
|
37
|
+
protected bootingCallbacks: Array<() => void | Promise<void>>;
|
|
38
|
+
protected bootedCallbacks: Array<() => void | Promise<void>>;
|
|
39
|
+
constructor(app: Application);
|
|
40
|
+
protected get container(): Container;
|
|
41
|
+
abstract register(): void;
|
|
42
|
+
singleton<T>(abstract: Abstract<T>, concrete?: any): void;
|
|
43
|
+
boot(): void | Promise<void>;
|
|
44
|
+
protected registerProvider(provider: ServiceProviderClass): ServiceProvider;
|
|
45
|
+
protected registerProviders(providers: ServiceProviderClass[]): void;
|
|
46
|
+
booting(callback: () => void | Promise<void>): void;
|
|
47
|
+
booted(callback: () => void | Promise<void>): void;
|
|
48
|
+
callBootingCallbacks(): Promise<void>;
|
|
49
|
+
callBootedCallbacks(): Promise<void>;
|
|
50
|
+
provides(): string[];
|
|
51
|
+
when(): string[];
|
|
52
|
+
isDeferred(): boolean;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ServiceProvider.d.ts.map
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/Application.d.ts
|
|
57
|
+
declare class Application {
|
|
58
|
+
container: Container;
|
|
59
|
+
private providers;
|
|
60
|
+
private loadedProviders;
|
|
61
|
+
private deferredServices;
|
|
62
|
+
private booted;
|
|
63
|
+
private expressApp;
|
|
64
|
+
private httpServer;
|
|
65
|
+
constructor(container: Container);
|
|
66
|
+
register(provider: ServiceProviderClass, force?: boolean): ServiceProvider;
|
|
67
|
+
protected markAsRegistered(provider: ServiceProvider): void;
|
|
68
|
+
registerDeferredProvider(provider: ServiceProviderClass): void;
|
|
69
|
+
loadDeferredProvider(service: string): void;
|
|
70
|
+
make<T>(abstract: string | (new (...args: any[]) => T)): T;
|
|
71
|
+
boot(): Promise<void>;
|
|
72
|
+
protected bootProvider(provider: ServiceProvider): Promise<void>;
|
|
73
|
+
getProviders(): ServiceProvider[];
|
|
74
|
+
getProvider(cls: ServiceProviderClass): ServiceProvider | undefined;
|
|
75
|
+
isBooted(): boolean;
|
|
76
|
+
getDeferredServices(): Map<string, ServiceProviderClass>;
|
|
77
|
+
getExpressApp(): Application$1;
|
|
78
|
+
useMiddleware(middleware: RequestHandler): void;
|
|
79
|
+
useMiddlewares(middlewares: RequestHandler[]): void;
|
|
80
|
+
mountRoutes(prefix: string, router: any): void;
|
|
81
|
+
configureBaseMiddleware(): void;
|
|
82
|
+
configure404Handler(): void;
|
|
83
|
+
configureErrorHandler(handler: RequestHandler): void;
|
|
84
|
+
getHttpServer(): Server | null;
|
|
85
|
+
createHttpServer(): Server;
|
|
86
|
+
listen(port: number | string, callback?: () => void): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=Application.d.ts.map
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { type Abstract, Application, type Constructor, Container, Injectable, ServiceProvider, type ServiceProviderClass, app, container };
|
|
92
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Container.ts","../src/ServiceProvider.ts","../src/Application.ts"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { createServer } from "http";
|
|
4
|
+
import cors from "cors";
|
|
5
|
+
//#region src/Container.ts
|
|
6
|
+
var Container = class Container {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.bindings = /* @__PURE__ */ new Map();
|
|
9
|
+
this.instances = /* @__PURE__ */ new Map();
|
|
10
|
+
this.aliases = /* @__PURE__ */ new Map();
|
|
11
|
+
this.resolvingCallbacks = [];
|
|
12
|
+
}
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (!Container.instance) Container.instance = new Container();
|
|
15
|
+
return Container.instance;
|
|
16
|
+
}
|
|
17
|
+
bind(abstract, concrete = abstract, singleton = false) {
|
|
18
|
+
this.bindings.set(abstract, {
|
|
19
|
+
concrete,
|
|
20
|
+
singleton
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
bindIf(abstract, concrete = abstract) {
|
|
24
|
+
if (!this.bound(abstract)) this.bind(abstract, concrete);
|
|
25
|
+
}
|
|
26
|
+
singleton(abstract, concrete = abstract) {
|
|
27
|
+
this.bind(abstract, concrete, true);
|
|
28
|
+
}
|
|
29
|
+
singletonIf(abstract, concrete = abstract) {
|
|
30
|
+
if (!this.bound(abstract)) this.singleton(abstract, concrete);
|
|
31
|
+
}
|
|
32
|
+
instance(abstract, instance) {
|
|
33
|
+
this.instances.set(abstract, instance);
|
|
34
|
+
}
|
|
35
|
+
alias(abstract, alias) {
|
|
36
|
+
this.aliases.set(alias, abstract);
|
|
37
|
+
}
|
|
38
|
+
bound(abstract) {
|
|
39
|
+
return this.bindings.has(abstract) || this.instances.has(abstract);
|
|
40
|
+
}
|
|
41
|
+
make(abstract) {
|
|
42
|
+
abstract = this.getAlias(abstract);
|
|
43
|
+
if (this.instances.has(abstract)) return this.instances.get(abstract);
|
|
44
|
+
const binding = this.bindings.get(abstract);
|
|
45
|
+
const concrete = binding?.concrete ?? abstract;
|
|
46
|
+
const object = this.build(concrete);
|
|
47
|
+
if (binding?.singleton) this.instances.set(abstract, object);
|
|
48
|
+
this.fireResolving(object);
|
|
49
|
+
return object;
|
|
50
|
+
}
|
|
51
|
+
build(concrete) {
|
|
52
|
+
if (typeof concrete === "function") return new concrete(...(Reflect.getMetadata("design:paramtypes", concrete) ?? []).map((param) => this.make(param)));
|
|
53
|
+
return concrete;
|
|
54
|
+
}
|
|
55
|
+
resolving(callback) {
|
|
56
|
+
this.resolvingCallbacks.push(callback);
|
|
57
|
+
}
|
|
58
|
+
fireResolving(object) {
|
|
59
|
+
for (const cb of this.resolvingCallbacks) cb(object, this);
|
|
60
|
+
}
|
|
61
|
+
getAlias(abstract) {
|
|
62
|
+
return this.aliases.get(abstract) ?? abstract;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const container = Container.getInstance();
|
|
66
|
+
function app(abstract) {
|
|
67
|
+
if (!abstract) return container;
|
|
68
|
+
return container.make(abstract);
|
|
69
|
+
}
|
|
70
|
+
function Injectable() {
|
|
71
|
+
return (target) => target;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/Application.ts
|
|
75
|
+
var Application = class {
|
|
76
|
+
constructor(container) {
|
|
77
|
+
this.container = container;
|
|
78
|
+
this.providers = [];
|
|
79
|
+
this.loadedProviders = /* @__PURE__ */ new Map();
|
|
80
|
+
this.deferredServices = /* @__PURE__ */ new Map();
|
|
81
|
+
this.booted = false;
|
|
82
|
+
this.httpServer = null;
|
|
83
|
+
this.expressApp = express();
|
|
84
|
+
}
|
|
85
|
+
register(provider, force = false) {
|
|
86
|
+
const name = provider.name;
|
|
87
|
+
if (!force && this.loadedProviders.has(name)) return this.loadedProviders.get(name);
|
|
88
|
+
const instance = new provider(this);
|
|
89
|
+
this.markAsRegistered(instance);
|
|
90
|
+
if (this.booted) this.bootProvider(instance);
|
|
91
|
+
return instance;
|
|
92
|
+
}
|
|
93
|
+
markAsRegistered(provider) {
|
|
94
|
+
this.providers.push(provider);
|
|
95
|
+
this.loadedProviders.set(provider.constructor.name, provider);
|
|
96
|
+
provider.register();
|
|
97
|
+
}
|
|
98
|
+
registerDeferredProvider(provider) {
|
|
99
|
+
const instance = new provider(this);
|
|
100
|
+
for (const service of instance.provides()) this.deferredServices.set(service, provider);
|
|
101
|
+
}
|
|
102
|
+
loadDeferredProvider(service) {
|
|
103
|
+
if (!this.deferredServices.has(service)) return;
|
|
104
|
+
const provider = this.deferredServices.get(service);
|
|
105
|
+
this.deferredServices.delete(service);
|
|
106
|
+
this.register(provider);
|
|
107
|
+
}
|
|
108
|
+
make(abstract) {
|
|
109
|
+
const key = typeof abstract === "string" ? abstract : abstract.name;
|
|
110
|
+
if (this.deferredServices.has(key)) this.loadDeferredProvider(key);
|
|
111
|
+
return this.container.make(abstract);
|
|
112
|
+
}
|
|
113
|
+
async boot() {
|
|
114
|
+
if (this.booted) return;
|
|
115
|
+
for (const provider of this.providers) await provider.callBootingCallbacks();
|
|
116
|
+
for (const provider of this.providers) await this.bootProvider(provider);
|
|
117
|
+
for (const provider of this.providers) await provider.callBootedCallbacks();
|
|
118
|
+
this.booted = true;
|
|
119
|
+
}
|
|
120
|
+
async bootProvider(provider) {
|
|
121
|
+
await provider.boot();
|
|
122
|
+
}
|
|
123
|
+
getProviders() {
|
|
124
|
+
return this.providers;
|
|
125
|
+
}
|
|
126
|
+
getProvider(cls) {
|
|
127
|
+
return this.loadedProviders.get(cls.name);
|
|
128
|
+
}
|
|
129
|
+
isBooted() {
|
|
130
|
+
return this.booted;
|
|
131
|
+
}
|
|
132
|
+
getDeferredServices() {
|
|
133
|
+
return this.deferredServices;
|
|
134
|
+
}
|
|
135
|
+
getExpressApp() {
|
|
136
|
+
return this.expressApp;
|
|
137
|
+
}
|
|
138
|
+
useMiddleware(middleware) {
|
|
139
|
+
this.expressApp.use(middleware);
|
|
140
|
+
}
|
|
141
|
+
useMiddlewares(middlewares) {
|
|
142
|
+
for (const mw of middlewares) this.expressApp.use(mw);
|
|
143
|
+
}
|
|
144
|
+
mountRoutes(prefix, router) {
|
|
145
|
+
this.expressApp.use(prefix, router);
|
|
146
|
+
}
|
|
147
|
+
configureBaseMiddleware() {
|
|
148
|
+
this.expressApp.use(cors());
|
|
149
|
+
this.expressApp.use(express.json());
|
|
150
|
+
this.expressApp.use(express.urlencoded({ extended: true }));
|
|
151
|
+
}
|
|
152
|
+
configure404Handler() {
|
|
153
|
+
this.expressApp.use((req, res) => {
|
|
154
|
+
res.status(404).json({
|
|
155
|
+
success: false,
|
|
156
|
+
message: `Cannot ${req.method} ${req.originalUrl}`
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
configureErrorHandler(handler) {
|
|
161
|
+
this.expressApp.use(handler);
|
|
162
|
+
}
|
|
163
|
+
getHttpServer() {
|
|
164
|
+
return this.httpServer;
|
|
165
|
+
}
|
|
166
|
+
createHttpServer() {
|
|
167
|
+
if (!this.httpServer) this.httpServer = createServer(this.expressApp);
|
|
168
|
+
return this.httpServer;
|
|
169
|
+
}
|
|
170
|
+
listen(port, callback) {
|
|
171
|
+
this.createHttpServer().listen(port, callback);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/ServiceProvider.ts
|
|
176
|
+
var ServiceProvider = class {
|
|
177
|
+
constructor(app) {
|
|
178
|
+
this.app = app;
|
|
179
|
+
this.bootingCallbacks = [];
|
|
180
|
+
this.bootedCallbacks = [];
|
|
181
|
+
}
|
|
182
|
+
get container() {
|
|
183
|
+
return this.app.container;
|
|
184
|
+
}
|
|
185
|
+
singleton(abstract, concrete = abstract) {
|
|
186
|
+
this.container.singleton(abstract, concrete);
|
|
187
|
+
}
|
|
188
|
+
boot() {}
|
|
189
|
+
registerProvider(provider) {
|
|
190
|
+
return this.app.register(provider);
|
|
191
|
+
}
|
|
192
|
+
registerProviders(providers) {
|
|
193
|
+
for (const p of providers) this.registerProvider(p);
|
|
194
|
+
}
|
|
195
|
+
booting(callback) {
|
|
196
|
+
this.bootingCallbacks.push(callback);
|
|
197
|
+
}
|
|
198
|
+
booted(callback) {
|
|
199
|
+
this.bootedCallbacks.push(callback);
|
|
200
|
+
}
|
|
201
|
+
async callBootingCallbacks() {
|
|
202
|
+
for (const cb of this.bootingCallbacks) await cb();
|
|
203
|
+
}
|
|
204
|
+
async callBootedCallbacks() {
|
|
205
|
+
for (const cb of this.bootedCallbacks) await cb();
|
|
206
|
+
}
|
|
207
|
+
provides() {
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
when() {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
isDeferred() {
|
|
214
|
+
return this.provides().length > 0;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
//#endregion
|
|
218
|
+
export { Application, Container, Injectable, ServiceProvider, app, container };
|
|
219
|
+
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/Container.ts","../src/Application.ts","../src/ServiceProvider.ts"],"sourcesContent":["import \"reflect-metadata\";\n\nexport type Constructor<T = any> = new (...args: any[]) => T;\nexport type Abstract<T = any> = Constructor<T> | string | symbol;\n\ntype Binding<T = any> = {\n concrete: any;\n singleton: boolean;\n};\n\nexport class Container {\n private static instance: Container;\n\n private bindings = new Map<Abstract, Binding>();\n private instances = new Map<Abstract, any>();\n private aliases = new Map<Abstract, Abstract>();\n private resolvingCallbacks: Function[] = [];\n\n public static getInstance(): Container {\n if (!Container.instance) {\n Container.instance = new Container();\n }\n return Container.instance;\n }\n\n public bind<T>(abstract: Abstract<T>, concrete: any = abstract, singleton = false): void {\n this.bindings.set(abstract, { concrete, singleton });\n }\n\n public bindIf<T>(abstract: Abstract<T>, concrete: any = abstract): void {\n if (!this.bound(abstract)) this.bind(abstract, concrete);\n }\n\n public singleton<T>(abstract: Abstract<T>, concrete: any = abstract): void {\n this.bind(abstract, concrete, true);\n }\n\n public singletonIf<T>(abstract: Abstract<T>, concrete: any = abstract): void {\n if (!this.bound(abstract)) this.singleton(abstract, concrete);\n }\n\n public instance<T>(abstract: Abstract<T>, instance: T): void {\n this.instances.set(abstract, instance);\n }\n\n public alias(abstract: Abstract, alias: Abstract): void {\n this.aliases.set(alias, abstract);\n }\n\n public bound(abstract: Abstract): boolean {\n return this.bindings.has(abstract) || this.instances.has(abstract);\n }\n\n public make<T>(abstract: Abstract<T>): T {\n abstract = this.getAlias(abstract);\n\n if (this.instances.has(abstract)) {\n return this.instances.get(abstract);\n }\n\n const binding = this.bindings.get(abstract);\n const concrete = binding?.concrete ?? abstract;\n const object = this.build<T>(concrete);\n\n if (binding?.singleton) {\n this.instances.set(abstract, object);\n }\n\n this.fireResolving(object);\n return object;\n }\n\n private build<T>(concrete: any): T {\n if (typeof concrete === \"function\") {\n const params: any[] = Reflect.getMetadata(\"design:paramtypes\", concrete) ?? [];\n const dependencies = params.map((param) => this.make(param));\n return new concrete(...dependencies);\n }\n return concrete;\n }\n\n public resolving(callback: Function): void {\n this.resolvingCallbacks.push(callback);\n }\n\n private fireResolving(object: any): void {\n for (const cb of this.resolvingCallbacks) cb(object, this);\n }\n\n private getAlias(abstract: Abstract): Abstract {\n return this.aliases.get(abstract) ?? abstract;\n }\n}\n\nexport const container = Container.getInstance();\n\nexport function app<T>(abstract?: Abstract<T>): T | Container {\n if (!abstract) return container;\n return container.make<T>(abstract);\n}\n\nexport function Injectable(): ClassDecorator {\n return (target: any) => target;\n}\n","import express, { Application as ExpressApp, RequestHandler } from \"express\";\nimport { createServer, Server as HttpServer } from \"http\";\nimport cors from \"cors\";\nimport { Container } from \"./Container.js\";\nimport type { ServiceProvider, ServiceProviderClass } from \"./ServiceProvider.js\";\n\nexport class Application {\n private providers: ServiceProvider[] = [];\n private loadedProviders: Map<string, ServiceProvider> = new Map();\n private deferredServices: Map<string, ServiceProviderClass> = new Map();\n private booted = false;\n private expressApp: ExpressApp;\n private httpServer: HttpServer | null = null;\n\n constructor(public container: Container) {\n this.expressApp = express();\n }\n\n // ---------------------------------------------------------------------------\n // Service Providers\n // ---------------------------------------------------------------------------\n\n register(provider: ServiceProviderClass, force = false): ServiceProvider {\n const name = provider.name;\n if (!force && this.loadedProviders.has(name)) {\n return this.loadedProviders.get(name)!;\n }\n\n const instance = new provider(this);\n this.markAsRegistered(instance);\n\n if (this.booted) {\n void this.bootProvider(instance);\n }\n\n return instance;\n }\n\n protected markAsRegistered(provider: ServiceProvider): void {\n this.providers.push(provider);\n this.loadedProviders.set(provider.constructor.name, provider);\n provider.register();\n }\n\n registerDeferredProvider(provider: ServiceProviderClass): void {\n const instance = new provider(this);\n for (const service of instance.provides()) {\n this.deferredServices.set(service, provider);\n }\n }\n\n loadDeferredProvider(service: string): void {\n if (!this.deferredServices.has(service)) return;\n const provider = this.deferredServices.get(service)!;\n this.deferredServices.delete(service);\n this.register(provider);\n }\n\n make<T>(abstract: string | (new (...args: any[]) => T)): T {\n const key = typeof abstract === \"string\" ? abstract : abstract.name;\n if (this.deferredServices.has(key)) this.loadDeferredProvider(key);\n return this.container.make<T>(abstract as any);\n }\n\n async boot(): Promise<void> {\n if (this.booted) return;\n\n for (const provider of this.providers) await provider.callBootingCallbacks();\n for (const provider of this.providers) await this.bootProvider(provider);\n for (const provider of this.providers) await provider.callBootedCallbacks();\n\n this.booted = true;\n }\n\n protected async bootProvider(provider: ServiceProvider): Promise<void> {\n await provider.boot();\n }\n\n getProviders(): ServiceProvider[] {\n return this.providers;\n }\n\n getProvider(cls: ServiceProviderClass): ServiceProvider | undefined {\n return this.loadedProviders.get(cls.name);\n }\n\n isBooted(): boolean {\n return this.booted;\n }\n\n getDeferredServices(): Map<string, ServiceProviderClass> {\n return this.deferredServices;\n }\n\n // ---------------------------------------------------------------------------\n // Express / HTTP\n // ---------------------------------------------------------------------------\n\n getExpressApp(): ExpressApp {\n return this.expressApp;\n }\n\n useMiddleware(middleware: RequestHandler): void {\n this.expressApp.use(middleware);\n }\n\n useMiddlewares(middlewares: RequestHandler[]): void {\n for (const mw of middlewares) this.expressApp.use(mw);\n }\n\n mountRoutes(prefix: string, router: any): void {\n this.expressApp.use(prefix, router);\n }\n\n configureBaseMiddleware(): void {\n this.expressApp.use(cors());\n this.expressApp.use(express.json());\n this.expressApp.use(express.urlencoded({ extended: true }));\n }\n\n configure404Handler(): void {\n this.expressApp.use((req, res) => {\n res.status(404).json({\n success: false,\n message: `Cannot ${req.method} ${req.originalUrl}`,\n });\n });\n }\n\n configureErrorHandler(handler: RequestHandler): void {\n this.expressApp.use(handler);\n }\n\n getHttpServer(): HttpServer | null {\n return this.httpServer;\n }\n\n createHttpServer(): HttpServer {\n if (!this.httpServer) {\n this.httpServer = createServer(this.expressApp);\n }\n return this.httpServer;\n }\n\n listen(port: number | string, callback?: () => void): void {\n this.createHttpServer().listen(port, callback);\n }\n}\n","import type { Application } from \"./Application.js\";\nimport type { Abstract } from \"./Container.js\";\n\nexport type ServiceProviderClass = new (app: Application) => ServiceProvider;\n\nexport abstract class ServiceProvider {\n protected bootingCallbacks: Array<() => void | Promise<void>> = [];\n protected bootedCallbacks: Array<() => void | Promise<void>> = [];\n\n constructor(protected app: Application) {}\n\n protected get container() {\n return this.app.container;\n }\n\n abstract register(): void;\n\n singleton<T>(abstract: Abstract<T>, concrete: any = abstract): void {\n this.container.singleton(abstract, concrete);\n }\n\n boot(): void | Promise<void> {}\n\n protected registerProvider(provider: ServiceProviderClass): ServiceProvider {\n return this.app.register(provider);\n }\n\n protected registerProviders(providers: ServiceProviderClass[]): void {\n for (const p of providers) this.registerProvider(p);\n }\n\n booting(callback: () => void | Promise<void>): void {\n this.bootingCallbacks.push(callback);\n }\n\n booted(callback: () => void | Promise<void>): void {\n this.bootedCallbacks.push(callback);\n }\n\n async callBootingCallbacks(): Promise<void> {\n for (const cb of this.bootingCallbacks) await cb();\n }\n\n async callBootedCallbacks(): Promise<void> {\n for (const cb of this.bootedCallbacks) await cb();\n }\n\n provides(): string[] {\n return [];\n }\n\n when(): string[] {\n return [];\n }\n\n isDeferred(): boolean {\n return this.provides().length > 0;\n }\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lara-node/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lara-Node IoC container, Application, and ServiceProvider",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsdown",
|
|
25
|
+
"dev": "tsdown --watch",
|
|
26
|
+
"clean": "rimraf dist",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"test": "vitest run"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"cors": "^2.8.5",
|
|
32
|
+
"express": "^5.2.1",
|
|
33
|
+
"reflect-metadata": "^0.2.2"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/cors": "^2.8.19",
|
|
37
|
+
"@types/express": "^5.0.6",
|
|
38
|
+
"@types/node": "^24.12.2",
|
|
39
|
+
"rimraf": "^6.0.1",
|
|
40
|
+
"tsdown": "^0.12.9",
|
|
41
|
+
"typescript": "^5.9.3",
|
|
42
|
+
"vitest": "^3.2.3"
|
|
43
|
+
}
|
|
44
|
+
}
|