exisjs 0.7.10 → 0.7.12
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/cli/commands/dev.d.ts +4 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +140 -29
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/run.d.ts +7 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +99 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.js +29 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +18 -3
- package/dist/cli/manifest.js.map +1 -1
- package/dist/cli/routes.d.ts +6 -0
- package/dist/cli/routes.d.ts.map +1 -1
- package/dist/cli/routes.js +224 -135
- package/dist/cli/routes.js.map +1 -1
- package/dist/config/config.d.ts +3 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +28 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/database/lifecycle.d.ts +8 -2
- package/dist/database/lifecycle.d.ts.map +1 -1
- package/dist/database/lifecycle.js +21 -6
- package/dist/database/lifecycle.js.map +1 -1
- package/dist/di/container.d.ts +2 -1
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js.map +1 -1
- package/dist/di/index.d.ts +1 -1
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/index.js.map +1 -1
- package/dist/docs/BENCHMARKS.md +5 -5
- package/dist/docs/content/boundaries.mdx +19 -3
- package/dist/docs/content/cli/commands.mdx +31 -0
- package/dist/docs/content/cli/overview.mdx +1 -0
- package/dist/docs/content/config.mdx +27 -6
- package/dist/docs/content/routing.mdx +44 -0
- package/dist/docs/content/security.mdx +48 -35
- package/dist/docs/content/structure.mdx +119 -93
- package/dist/docs/reference/config.mdx +31 -19
- package/dist/docs/reference/database.mdx +7 -7
- package/dist/docs/reference/router.mdx +45 -1
- package/dist/lib/inspect-routes.d.ts +2 -0
- package/dist/lib/inspect-routes.d.ts.map +1 -0
- package/dist/lib/inspect-routes.js +148 -0
- package/dist/lib/inspect-routes.js.map +1 -0
- package/dist/lib/start-server.js +10 -0
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/security.d.ts +18 -0
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +32 -0
- package/dist/middleware/security.js.map +1 -1
- package/dist/router/radix.d.ts +1 -0
- package/dist/router/radix.d.ts.map +1 -1
- package/dist/router/radix.js +21 -0
- package/dist/router/radix.js.map +1 -1
- package/dist/router/scanner/cron-mounter.d.ts.map +1 -1
- package/dist/router/scanner/cron-mounter.js +9 -2
- package/dist/router/scanner/cron-mounter.js.map +1 -1
- package/dist/server/adapters/uws-adapter.d.ts +17 -0
- package/dist/server/adapters/uws-adapter.d.ts.map +1 -1
- package/dist/server/adapters/uws-adapter.js +101 -7
- package/dist/server/adapters/uws-adapter.js.map +1 -1
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +5 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/define.d.ts.map +1 -1
- package/dist/server/define.js +5 -0
- package/dist/server/define.js.map +1 -1
- package/dist/server/helpers/etag.d.ts.map +1 -1
- package/dist/server/helpers/etag.js +51 -3
- package/dist/server/helpers/etag.js.map +1 -1
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +35 -19
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +4 -3
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +26 -8
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +1 -0
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +24 -13
- package/dist/server/response.js.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +9 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -11,6 +11,7 @@ export interface DatabaseRegistration {
|
|
|
11
11
|
connect: () => Promise<void> | void;
|
|
12
12
|
disconnect: () => Promise<void> | void;
|
|
13
13
|
isHealthy?: () => Promise<boolean | DatabaseHealthInfo> | boolean | DatabaseHealthInfo;
|
|
14
|
+
healthCheck?: () => Promise<boolean | DatabaseHealthInfo> | boolean | DatabaseHealthInfo;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Universal Database Manager for ExisJS.
|
|
@@ -25,7 +26,7 @@ export declare class DatabaseManager {
|
|
|
25
26
|
*/
|
|
26
27
|
static register(db: DatabaseRegistration): void;
|
|
27
28
|
/**
|
|
28
|
-
* Connects all registered databases.
|
|
29
|
+
* Connects all registered databases that are not already connected.
|
|
29
30
|
*/
|
|
30
31
|
static connectAll(): Promise<void>;
|
|
31
32
|
/**
|
|
@@ -39,6 +40,10 @@ export declare class DatabaseManager {
|
|
|
39
40
|
healthy: boolean;
|
|
40
41
|
databases: Record<string, DatabaseHealthInfo>;
|
|
41
42
|
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the number of registered databases.
|
|
45
|
+
*/
|
|
46
|
+
static get size(): number;
|
|
42
47
|
/**
|
|
43
48
|
* Clears registered databases (useful for testing).
|
|
44
49
|
*/
|
|
@@ -47,6 +52,7 @@ export declare class DatabaseManager {
|
|
|
47
52
|
}
|
|
48
53
|
/**
|
|
49
54
|
* Convenience helper to register database lifecycle hooks.
|
|
55
|
+
* Supports both `registerDatabase(options)` and `registerDatabase(app, options)`.
|
|
50
56
|
*/
|
|
51
|
-
export declare function registerDatabase(
|
|
57
|
+
export declare function registerDatabase(appOrDb: any, maybeDb?: DatabaseRegistration): void;
|
|
52
58
|
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/database/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAC9B,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,CAAA;AAEvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,oBAAoB,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtC,SAAS,CAAC,EAAE,MACV,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC,GAAG,OAAO,GAAG,kBAAkB,CAAA;CACvE;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/database/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAC9B,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,CAAA;AAEvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,oBAAoB,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACnC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACtC,SAAS,CAAC,EAAE,MACV,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC,GAAG,OAAO,GAAG,kBAAkB,CAAA;IACtE,WAAW,CAAC,EAAE,MACZ,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC,GAAG,OAAO,GAAG,kBAAkB,CAAA;CACvE;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,CAGrB;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAQ;IAE/C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI;IAK/C;;OAEG;WACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxC;;OAEG;WACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3C;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC;QAClC,OAAO,EAAE,OAAO,CAAA;QAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;KAC9C,CAAC;IAgDF;;OAEG;IACH,MAAM,KAAK,IAAI,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAanC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,oBAAoB,GAC7B,IAAI,CAGN"}
|
|
@@ -12,19 +12,24 @@ class DatabaseManager {
|
|
|
12
12
|
* Registers a database connection lifecycle with the framework.
|
|
13
13
|
*/
|
|
14
14
|
static register(db) {
|
|
15
|
-
this.databases.set(db.name, db);
|
|
15
|
+
this.databases.set(db.name, { ...db, _connected: false });
|
|
16
16
|
this.ensureShutdownHooks();
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Connects all registered databases.
|
|
19
|
+
* Connects all registered databases that are not already connected.
|
|
20
20
|
*/
|
|
21
21
|
static async connectAll() {
|
|
22
22
|
for (const [name, db] of this.databases) {
|
|
23
|
+
if (db._connected)
|
|
24
|
+
continue;
|
|
23
25
|
try {
|
|
24
26
|
await db.connect();
|
|
27
|
+
db._connected = true;
|
|
25
28
|
}
|
|
26
29
|
catch (err) {
|
|
27
|
-
|
|
30
|
+
const error = new Error(`[ExisJS Database] Failed to connect database "${name}": ${err.message}`);
|
|
31
|
+
error.cause = err;
|
|
32
|
+
throw error;
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
}
|
|
@@ -35,6 +40,7 @@ class DatabaseManager {
|
|
|
35
40
|
const disconnectPromises = Array.from(this.databases.values()).map(async (db) => {
|
|
36
41
|
try {
|
|
37
42
|
await db.disconnect();
|
|
43
|
+
db._connected = false;
|
|
38
44
|
}
|
|
39
45
|
catch (err) {
|
|
40
46
|
console.error(`[ExisJS Database] Error disconnecting "${db.name}":`, err);
|
|
@@ -51,11 +57,12 @@ class DatabaseManager {
|
|
|
51
57
|
for (const [name, db] of this.databases) {
|
|
52
58
|
const start = Date.now();
|
|
53
59
|
try {
|
|
54
|
-
|
|
60
|
+
const healthFn = db.isHealthy || db.healthCheck;
|
|
61
|
+
if (!healthFn) {
|
|
55
62
|
results[name] = { name, status: 'connected', latencyMs: 0 };
|
|
56
63
|
continue;
|
|
57
64
|
}
|
|
58
|
-
const healthRes = await
|
|
65
|
+
const healthRes = await healthFn();
|
|
59
66
|
const latencyMs = Date.now() - start;
|
|
60
67
|
if (typeof healthRes === 'boolean') {
|
|
61
68
|
results[name] = {
|
|
@@ -91,6 +98,12 @@ class DatabaseManager {
|
|
|
91
98
|
databases: results,
|
|
92
99
|
};
|
|
93
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Returns the number of registered databases.
|
|
103
|
+
*/
|
|
104
|
+
static get size() {
|
|
105
|
+
return this.databases.size;
|
|
106
|
+
}
|
|
94
107
|
/**
|
|
95
108
|
* Clears registered databases (useful for testing).
|
|
96
109
|
*/
|
|
@@ -115,8 +128,10 @@ DatabaseManager.databases = new Map();
|
|
|
115
128
|
DatabaseManager.isShutdownHookRegistered = false;
|
|
116
129
|
/**
|
|
117
130
|
* Convenience helper to register database lifecycle hooks.
|
|
131
|
+
* Supports both `registerDatabase(options)` and `registerDatabase(app, options)`.
|
|
118
132
|
*/
|
|
119
|
-
function registerDatabase(
|
|
133
|
+
function registerDatabase(appOrDb, maybeDb) {
|
|
134
|
+
const db = maybeDb || appOrDb;
|
|
120
135
|
DatabaseManager.register(db);
|
|
121
136
|
}
|
|
122
137
|
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/database/lifecycle.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/database/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/di/container.d.ts
CHANGED
|
@@ -12,7 +12,8 @@ export interface FactoryProvider<T> extends BaseProvider {
|
|
|
12
12
|
export interface ClassProvider<T> extends BaseProvider {
|
|
13
13
|
useClass: new (...args: any[]) => T;
|
|
14
14
|
}
|
|
15
|
-
export type
|
|
15
|
+
export type ClassConstructor<T = any> = new (...args: any[]) => T;
|
|
16
|
+
export type ProviderDefinition<T> = ValueProvider<T> | FactoryProvider<T> | ClassProvider<T> | ClassConstructor<T> | T;
|
|
16
17
|
export declare const INJECT_METADATA: unique symbol;
|
|
17
18
|
export declare const PROPERTY_INJECT_METADATA: unique symbol;
|
|
18
19
|
export declare const OPTIONAL_METADATA: unique symbol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAC/B,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAErE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,CAAC,CAAA;CACZ;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY;IACtD,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACpC;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAC/B,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAErE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,CAAC,CAAA;CACZ;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY;IACtD,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACpC;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAEjE,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,aAAa,CAAC,CAAC,CAAC,GAChB,eAAe,CAAC,CAAC,CAAC,GAClB,aAAa,CAAC,CAAC,CAAC,GAChB,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,CAAA;AAEL,eAAO,MAAM,eAAe,eAAqC,CAAA;AACjE,eAAO,MAAM,wBAAwB,eAEpC,CAAA;AACD,eAAO,MAAM,iBAAiB,eAAuC,CAAA;AACrE,eAAO,MAAM,cAAc,eAA6B,CAAA;AAExD,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAiB;IAEjC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAM1E,UAAU,IAAI,IAAI;IAKlB,gBAAgB,CAAC,CAAC,EAChB,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EACtC,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAC3B,CAAC;IAoJJ,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IA0IvD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe9D"}
|
package/dist/di/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":";;;AAAA,+CAAmE;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":";;;AAAA,+CAAmE;AA8BtD,QAAA,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;AACpD,QAAA,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAChD,+BAA+B,CAChC,CAAA;AACY,QAAA,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;AACxD,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAExD,MAAa,SAAS;IAAtB;QACU,cAAS,GAAG,IAAI,GAAG,EAAY,CAAA;QAC/B,mBAAc,GAAG,IAAI,GAAG,EAAY,CAAA;QACpC,aAAQ,GAAG,IAAI,GAAG,EAAO,CAAA;IA6UnC,CAAC;IA3UC,OAAO,CAAI,KAAuB,EAAE,QAA+B;QACjE,MAAM,cAAc,GAAG,IAAA,0BAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;QACvE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;QAC5C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAC5C,CAAC;IAED,UAAU;QACR,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED,gBAAgB,CACd,WAAsC,EACtC,YAA4B;QAE5B,MAAM,YAAY,GAAkC;YAClD,GAAG,CAAC,CAAC,WAAW,CAAC,SAAS;gBACvB,WAAW,CAAC,SAAiB,CAAC,uBAAe,CAAC,CAAC;gBAChD,EAAE,CAAC;YACL,GAAG,CAAE,WAAmB,CAAC,uBAAe,CAAC,IAAI,EAAE,CAAC;SACjD,CAAA;QACD,MAAM,cAAc,GACjB,WAAmB,CAAC,yBAAiB,CAAC;YACvC,CAAC,WAAW,CAAC,SAAS;gBACnB,WAAW,CAAC,SAAiB,CAAC,yBAAiB,CAAC,CAAC;YACpD,IAAI,GAAG,EAAE,CAAA;QAEX,iFAAiF;QACjF,MAAM,iBAAiB,GACrB,CAAC,OAAQ,UAAkB,CAAC,OAAO,EAAE,WAAW,KAAK,UAAU;YAC7D,CAAC,CAAE,UAAkB,CAAC,OAAO,CAAC,WAAW,CACrC,mBAAmB,EACnB,WAAW,CACZ;gBACD,CAAC,WAAW,CAAC,SAAS;oBACpB,CAAC,CAAE,UAAkB,CAAC,OAAO,CAAC,WAAW,CACrC,mBAAmB,EACnB,WAAW,CAAC,SAAS,CACtB;oBACH,CAAC,CAAC,SAAS,CAAC;YAChB,CAAC,CAAC,SAAS,CAAC;YACb,WAAmB,CAAC,mBAAmB,CAAC;YACxC,WAAW,CAAC,SAAiB,EAAE,CAAC,mBAAmB,CAAC;YACrD,EAAE,CAAA;QAEJ,mFAAmF;QACnF,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClD,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACtC,IACE,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS;oBAC7B,OAAO,SAAS,KAAK,UAAU;oBAC/B,SAAS,KAAK,MAAM;oBACpB,SAAS,KAAK,MAAM;oBACpB,SAAS,KAAK,MAAM;oBACpB,SAAS,KAAK,OAAO;oBACrB,SAAS,KAAK,MAAM;oBACpB,SAAS,KAAK,KAAK;oBACnB,SAAS,KAAK,QAAQ,EACtB,CAAC;oBACD,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzE,IAAI,QAAW,CAAA;QAEf,IACE,QAAQ,KAAK,CAAC,CAAC;YACf,cAAc,CAAC,IAAI,KAAK,CAAC;YACzB,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,EACjD,CAAC;YACD,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,QAAQ,GAAG,CAAC,EACZ,WAAW,CAAC,MAAM,IAAI,CAAC,EACvB,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CACpD,CAAA;YAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAA;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAU,EAAE,CAAA;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;oBAC7B,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;oBAExC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,IAAI,CAAC;4BACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAA;wBAC9C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,IAAI,UAAU,EAAE,CAAC;gCACf,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;4BACtB,CAAC;iCAAM,CAAC;gCACN,MAAM,GAAG,CAAA;4BACX,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,IAAI,UAAU,EAAE,CAAC;wBACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBACtB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBACtB,CAAC;gBACH,CAAC;gBACD,QAAQ,GAAG,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QAED,6EAA6E;QAC7E,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAU,EAAE,CAAA;YAC5B,IAAI,IAAI,GAAG,WAAW,CAAC,SAAS,CAAA;YAChC,OAAO,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;gBACzC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACxB,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YACpC,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAGd,CAAC,CAAC,gCAAwB,CAAC,IAAI,EAAE,CAAA;gBACvC,MAAM,QAAQ,GAAyB,CAAC,CAAC,yBAAiB,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;gBAExE,KAAK,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;oBACpD,IAAI,aAAa,GAAG,KAAK,CAAA;oBACzB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;wBAChC,MAAM,aAAa,GACjB,OAAQ,UAAkB,CAAC,OAAO,EAAE,WAAW,KAAK,UAAU;4BAC5D,CAAC,CAAE,UAAkB,CAAC,OAAO,CAAC,WAAW,CACrC,aAAa,EACb,CAAC,EACD,WAAW,CACZ;4BACH,CAAC,CAAC,SAAS,CAAA;wBACf,IAAI,aAAa;4BAAE,aAAa,GAAG,aAAa,CAAA;oBAClD,CAAC;oBAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;wBAChC,IAAI,CAAC;4BACH,CAAC;4BAAC,QAAgB,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,CAC5C,aAAa,EACb,YAAY,CACb,CAAA;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gCAC9B,CAAC;gCAAC,QAAgB,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;4BAC7C,CAAC;iCAAM,CAAC;gCACN,MAAM,GAAG,CAAA;4BACX,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,CAAI,KAAuB,EAAE,YAA4B;QAC9D,MAAM,cAAc,GAAQ,IAAA,0BAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;QAE5E,2BAA2B;QAC3B,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QAChD,CAAC;QAED,yBAAyB;QACzB,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,OAAO,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACzC,CAAC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,KAAK,CAAC,EAAS,EAAE;gBAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;oBACf,MAAM,YAAY,GAChB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;wBACvC,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;oBACpD,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;wBAC9B,OAAO,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;oBACjE,CAAC;oBACD,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;oBACtB,MAAM,YAAY,GAChB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;wBACvC,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;oBACpD,IAAI,YAAY,EAAE,CAAC;wBACjB,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;wBAC1B,OAAO,IAAI,CAAA;oBACb,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBACjC,IAAI,CAAC;oBACH,MAAM,KAAK,GACT,cAAc,CAAC,SAAS,EAAE,CAAC,sBAAc,CAAC,IAAI,WAAW,CAAA;oBAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CACpC,cAA2C,EAC3C,YAAY,CACb,CAAA;oBAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;wBAC1B,OAAO,QAAQ,CAAA;oBACjB,CAAC;oBAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;4BAClB,MAAM,IAAI,KAAK,CACb,2CAA2C,MAAM,CAC/C,cAAc,CACf,mMAAmM,CACrM,CAAA;wBACH,CAAC;wBACD,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;oBAC5C,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;oBACnD,CAAC;oBACD,OAAO,QAAQ,CAAA;gBACjB,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBACjE,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,sCAAsC,MAAM,CAC1C,cAAc,CACf,kBAAkB,QAAQ,EAAE,CAC9B,CACA;oBAAC,KAAa,CAAC,KAAK,GAAG,GAAG,CAAA;oBAC3B,MAAM,KAAK,CAAA;gBACb,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;QAC5E,CAAC;QAED,IAAI,aAAkB,CAAA;QACtB,IAAI,KAAK,GAA0C,WAAW,CAAA;QAE9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACjC,IAAI,CAAC;YACH,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,UAAU,GACb,QAAgB,CAAC,SAAS,EAAE,CAAC,sBAAc,CAAC,IAAI,WAAW,CAAA;gBAC9D,KAAK,GAAG,UAAU,CAAA;gBAClB,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAe,EAAE,YAAY,CAAC,CAAA;YACtE,CAAC;iBAAM,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACpD,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAC1C,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;gBACxB,CAAC;gBAED,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;oBAC3B,aAAa,GAAI,QAA6B,CAAC,QAAQ,CAAA;gBACzD,CAAC;qBAAM,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;oBACpC,aAAa,GAAI,QAA+B,CAAC,UAAU,EAAE,CAAA;gBAC/D,CAAC;qBAAM,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;oBAClC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAClC,QAA6B,CAAC,QAAQ,EACvC,YAAY,CACb,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,aAAa,GAAG,QAAQ,CAAA;gBAC1B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,QAAQ,CAAA;YAC1B,CAAC;YAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC1B,OAAO,aAAa,CAAA;YACtB,CAAC;YAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CACb,2CAA2C,MAAM,CAC/C,cAAc,CACf,mMAAmM,CACrM,CAAA;gBACH,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;YACjD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;YACxD,CAAC;YAED,OAAO,aAAa,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1C,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAA;gBACzB,CAAC;gBACD,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;oBAChD,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAA;gBAC/B,CAAC;gBACD,IAAI,OAAO,QAAQ,CAAC,sBAAsB,KAAK,UAAU,EAAE,CAAC;oBAC1D,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAA;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,MAAe;QAC3C,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC7C,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAA;gBAC5B,CAAC;gBACD,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;oBACnD,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAA;gBAClC,CAAC;gBACD,IAAI,OAAO,QAAQ,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;oBACzD,MAAM,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAhVD,8BAgVC"}
|
package/dist/di/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { inject } from './inject';
|
|
2
2
|
export { Container, INJECT_METADATA, PROPERTY_INJECT_METADATA, OPTIONAL_METADATA, SCOPE_METADATA, } from './container';
|
|
3
3
|
export { Inject, Optional } from './decorators';
|
|
4
|
-
export type { ProviderToken, ProviderDefinition, ValueProvider, FactoryProvider, ClassProvider, } from './container';
|
|
4
|
+
export type { ProviderToken, ProviderDefinition, ValueProvider, FactoryProvider, ClassProvider, ClassConstructor, } from './container';
|
|
5
5
|
export { forwardRef, isForwardRef, type ForwardReference } from './forward-ref';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/di/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EACL,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC/C,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EACL,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC/C,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/di/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,yCAMoB;AALlB,sGAAA,SAAS,OAAA;AACT,4GAAA,eAAe,OAAA;AACf,qHAAA,wBAAwB,OAAA;AACxB,8GAAA,iBAAiB,OAAA;AACjB,2GAAA,cAAc,OAAA;AAEhB,2CAA+C;AAAtC,oGAAA,MAAM,OAAA;AAAE,sGAAA,QAAQ,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,yCAMoB;AALlB,sGAAA,SAAS,OAAA;AACT,4GAAA,eAAe,OAAA;AACf,qHAAA,wBAAwB,OAAA;AACxB,8GAAA,iBAAiB,OAAA;AACjB,2GAAA,cAAc,OAAA;AAEhB,2CAA+C;AAAtC,oGAAA,MAAM,OAAA;AAAE,sGAAA,QAAQ,OAAA;AASzB,6CAA+E;AAAtE,yGAAA,UAAU,OAAA;AAAE,2GAAA,YAAY,OAAA"}
|
package/dist/docs/BENCHMARKS.md
CHANGED
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
- **Trials:** 3 per framework, order randomized each trial, median reported
|
|
13
13
|
- **Warmup:** 2s untimed warmup run before each timed trial
|
|
14
14
|
- **Cores:** single-core, no clustering, for all four frameworks
|
|
15
|
-
- **Framework versions:** Express ^5.2.1, Fastify ^5.12.
|
|
15
|
+
- **Framework versions:** Express ^5.2.1, Fastify ^5.12.5, Hono ^4.13.8, ExisJS 0.7.3
|
|
16
16
|
|
|
17
17
|
### Performance Metrics
|
|
18
18
|
|
|
19
19
|
| Framework | Req/Sec (median) | Latency avg (ms) | Latency p50 (ms) | Latency p99 (ms) | Errors | Server backend |
|
|
20
20
|
|---|---|---|---|---|---|---|
|
|
21
|
-
| Express |
|
|
22
|
-
| Fastify |
|
|
23
|
-
| Hono |
|
|
24
|
-
| Exis JS |
|
|
21
|
+
| Express | 24778.91 | 3.41 | 3.00 | 5.00 | 0 | n/a |
|
|
22
|
+
| Fastify | 41802.19 | 2.04 | 2.00 | 3.00 | 0 | n/a |
|
|
23
|
+
| Hono | 43174.40 | 2.04 | 2.00 | 3.00 | 0 | n/a |
|
|
24
|
+
| Exis JS | 51430.40 | 1.26 | 1.00 | 3.00 | 0 | uws |
|
|
25
25
|
|
|
26
26
|
### Handler Parity Note
|
|
27
27
|
|
|
@@ -159,9 +159,25 @@ src/http/
|
|
|
159
159
|
└── route.ts # Handled by both Root Boundary and Admin Boundary
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
1. **Wrappers & Chain Steps**: Outer boundaries execute first. Root wrappers wrap nested wrappers, and root chain steps run before nested chain steps.
|
|
163
|
-
2. **CORS &
|
|
164
|
-
|
|
162
|
+
1. **Wrappers & Chain Steps**: Outer boundaries execute first. Root wrappers wrap nested wrappers, and root chain steps run before nested chain steps top-down.
|
|
163
|
+
2. **CORS Precedence & Inheritance**:
|
|
164
|
+
- **Innermost Boundary Wins**: If a nested boundary specifies `cors`, it overrides any CORS configuration set in parent boundaries or `exis.config.ts`.
|
|
165
|
+
- **Inheritance**: If a sub-boundary omits `cors`, it seamlessly inherits the parent boundary's CORS configuration (or global config).
|
|
166
|
+
- **Per-Route Overrides**: A `route.ts` handler can define its own `cors` setting to override boundary settings for that single endpoint.
|
|
167
|
+
- **Disabling CORS**: Setting `cors: false` on a boundary or route explicitly disables CORS headers and preflight handling for that sub-tree or route.
|
|
168
|
+
3. **Headers Merging**: Headers are deep-merged from root to child. Child headers override parent headers if keys collide.
|
|
169
|
+
4. **Exclusions**: When a route matches an exclusion pattern (e.g. `/admin/health` in `exclude`), that boundary's chain steps and wrappers are bypassed for the request.
|
|
170
|
+
|
|
171
|
+
### CORS Resolution Hierarchy
|
|
172
|
+
|
|
173
|
+
ExisJS resolves CORS in a 3-tier precedence order:
|
|
174
|
+
|
|
175
|
+
| Level | Where to Define | Priority | Description |
|
|
176
|
+
|---|---|---|---|
|
|
177
|
+
| **Route** | `route.get('/', { cors: ... })` or `@Cors(...)` | 🥇 **Highest** | Specific to a single endpoint. Overrides boundary and global config. |
|
|
178
|
+
| **Nested Boundary** | `src/http/admin/boundary.ts` | 🥈 **High** | Scoped to the subfolder tree. Overrides parent boundaries and global config. |
|
|
179
|
+
| **Parent / Root Boundary** | `src/http/boundary.ts` | 🥉 **Medium** | Scoped to all API routes under the folder. Overrides global config. |
|
|
180
|
+
| **Global Config** | `exis.config.ts` (`defineConfig({ cors })`) | **Base** | Fallback baseline for any route not covered by a boundary or route override. |
|
|
165
181
|
|
|
166
182
|
---
|
|
167
183
|
|
|
@@ -158,6 +158,37 @@ $ npx exisjs test [files...] [options]
|
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
+
### `exisjs run`
|
|
162
|
+
|
|
163
|
+
Executes any standalone TypeScript script, migration runner, or external tool (e.g. `drizzle-kit`, `prisma`, `knex`) with ExisJS `.env` files automatically loaded into `process.env`.
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
$ npx exisjs run <scriptOrCmd> [args...] [options]
|
|
167
|
+
$ npx exisjs exec <scriptOrCmd> [args...] [options]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Options**
|
|
171
|
+
|
|
172
|
+
| Option | Description |
|
|
173
|
+
| :--- | :--- |
|
|
174
|
+
| `-e, --env <file>` | Custom environment file to load. |
|
|
175
|
+
| `-m, --mode <mode>` | Environment mode to load (e.g. `production`, `development`, `staging`). |
|
|
176
|
+
|
|
177
|
+
**Examples**
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Run Drizzle migrations with auto-loaded .env database credentials
|
|
181
|
+
$ npx exisjs run drizzle-kit push
|
|
182
|
+
|
|
183
|
+
# Execute a TypeScript database seed script
|
|
184
|
+
$ npx exisjs run src/database/seed.ts
|
|
185
|
+
|
|
186
|
+
# Run with a custom environment file
|
|
187
|
+
$ npx exisjs run scripts/report.ts --env .env.staging
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
161
192
|
### `exisjs repl`
|
|
162
193
|
|
|
163
194
|
Starts an interactive Node.js REPL console loaded with your application context.
|
|
@@ -76,6 +76,7 @@ $ npx exisjs g r users --oop
|
|
|
76
76
|
| `routes` | | Prints the application routing table to the terminal. |
|
|
77
77
|
| `generate` | `g` | Scaffolds framework slices (resource, route, service, schema, boundary, plugin, middleware, test). |
|
|
78
78
|
| `test` | | Runs the native Node.js test suite (`node:test`) with custom Jest-style reporting. |
|
|
79
|
+
| `run` | `exec` | Executes a script or external tool (e.g. `drizzle-kit`, `prisma`) with auto-loaded `.env`. |
|
|
79
80
|
| `repl` | `console` | Starts an interactive Node.js REPL loaded with the application context. |
|
|
80
81
|
| `exports` | | Displays all available `@exisjs` and `exisjs/*` subpath exports. |
|
|
81
82
|
| `info` | | Displays system, Node.js, and ExisJS runtime information. |
|
|
@@ -75,11 +75,13 @@ We highly recommend using `v.env()` from `exisjs/validator` to strongly type and
|
|
|
75
75
|
```typescript filename="env.ts"
|
|
76
76
|
import { tex } from 'exisjs/validator'
|
|
77
77
|
|
|
78
|
-
export const env = tex
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
export const env = tex
|
|
79
|
+
.object({
|
|
80
|
+
PORT: tex.number({ coerce: true, optional: true }),
|
|
81
|
+
NODE_ENV: tex.string({ optional: true }),
|
|
82
|
+
MONGODB_URI: tex.string(),
|
|
83
|
+
})
|
|
84
|
+
.parse(process.env)
|
|
83
85
|
```
|
|
84
86
|
|
|
85
87
|
```typescript filename="exis.config.ts"
|
|
@@ -145,6 +147,7 @@ Here is a full breakdown of the configuration schema:
|
|
|
145
147
|
- Regular expressions (e.g. `/localhost:\d+/`).
|
|
146
148
|
- Arrays mixing strings and regexes (`['https://app.example.com', /https:\/\/.*\.domain\.com/']`).
|
|
147
149
|
- Dynamic callbacks: `(origin, cb) => ...` or async functions: `async (origin) => boolean` for multi-tenant setups.
|
|
150
|
+
- **Precedence & Overrides**: Global CORS acts as the baseline default. It can be overridden at the directory level using `boundary.ts` (`defineBoundary({ cors })`), or at the individual endpoint level using `route.get('/', { cors })` / `@Cors()`. Setting `cors: false` at any level disables CORS for that scope.
|
|
148
151
|
- `transformResponse` _(boolean | function)_: Automatically wraps all successful handler responses into a standardized envelope:
|
|
149
152
|
- When `true`: `{ success: true, data: ..., timestamp: ... }` (matching `HttpError`'s `{ success: false, error: ... }`).
|
|
150
153
|
- When a function: `(data, req, res) => ({ ... })` to provide your own custom envelope.
|
|
@@ -167,6 +170,24 @@ Here is a full breakdown of the configuration schema:
|
|
|
167
170
|
- `debugRouting` _(boolean)_: Enables detailed logging of the resolved route file and applied gateways for every incoming request.
|
|
168
171
|
- `test` _(object)_: Configuration for the native test runner (`include`, `exclude`, `setupFiles`, `concurrency`, `coverage`).
|
|
169
172
|
|
|
173
|
+
### Development Server & File Watcher (`watch` & `dev`)
|
|
174
|
+
|
|
175
|
+
ExisJS dev server (`exis dev`) features intelligent hot-reloading with strict extension filtering and automatic runtime artifact exclusion:
|
|
176
|
+
|
|
177
|
+
- `watch.paths` / `dev.watch` _(string[])_: Custom paths to watch for hot reloads. Defaults to `['src', ...configFiles]` (or `[cwd]` if no `src` folder exists).
|
|
178
|
+
- `watch.ignore` / `dev.ignored` _((string | RegExp)[])_: Additional files, directories, or regex patterns to ignore during watch restarts.
|
|
179
|
+
- `watch.extensions` / `dev.extensions` _(string[])_: Explicit file extensions that trigger reloads (defaults to `['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']`).
|
|
180
|
+
- `watch.debounceMs` / `dev.debounceMs` _(number)_: Debounce interval before restarting the server on file changes (default: `250ms`).
|
|
181
|
+
- `dev.usePolling` _(boolean)_: Enables filesystem polling for cross-platform/Windows NTFS reliability (defaults to `true` on Windows).
|
|
182
|
+
- `dev.interval` _(number)_: Polling interval in milliseconds (default: `100`).
|
|
183
|
+
- `dev.binaryInterval` _(number)_: Polling binary interval in milliseconds (default: `300`).
|
|
184
|
+
|
|
185
|
+
<Info title="Default Ignored Artifacts">
|
|
186
|
+
By default, ExisJS automatically ignores non-source files and runtime artifact folders to prevent accidental server restarts:
|
|
187
|
+
- **Folders**: `node_modules`, `.git`, `.exis`, `dist`, `build`, `out`, `.turbo`, `.next`, `.cache`, `downloads`, `storage`, `uploads`, `tmp`, `temp`, `logs`, `data`, `fixtures`, `reports`, `artifacts`, `public`, `tests`, `coverage`.
|
|
188
|
+
- **Files**: `.csv`, `.xlsx`, `.pdf`, `.log`, `.sqlite`, `.db`, `.png`, `.jpg`, `.svg`, `.webp`, `.md`, `.txt`, `.zip`, `.tar.gz`, `package-lock.json`, `*.d.ts`.
|
|
189
|
+
</Info>
|
|
190
|
+
|
|
170
191
|
### Queues & Plugins
|
|
171
192
|
|
|
172
193
|
- `queue` _(object)_: Configures the Global Job Queue driver (`memory` or `redis`) and backpressure settings.
|
|
@@ -242,6 +263,6 @@ export default exis({
|
|
|
242
263
|
async onStop(app) {
|
|
243
264
|
// Cleanly close database pools when SIGTERM or SIGINT is received
|
|
244
265
|
await db.disconnect()
|
|
245
|
-
}
|
|
266
|
+
},
|
|
246
267
|
})
|
|
247
268
|
```
|
|
@@ -537,6 +537,50 @@ export default controller({
|
|
|
537
537
|
})
|
|
538
538
|
```
|
|
539
539
|
|
|
540
|
+
### Route-Level CORS Overrides
|
|
541
|
+
|
|
542
|
+
Routes can also override CORS policies defined in parent `boundary.ts` files or `exis.config.ts`. Route-level CORS has the **highest precedence** in the framework:
|
|
543
|
+
|
|
544
|
+
#### Functional Paradigm
|
|
545
|
+
```typescript filename="src/http/webhooks/stripe/route.ts"
|
|
546
|
+
import { controller, route } from 'exisjs/router'
|
|
547
|
+
|
|
548
|
+
export default controller({
|
|
549
|
+
// Open webhook endpoint to Stripe servers only, bypassing restrictive boundary CORS
|
|
550
|
+
webhook: route.post('/', {
|
|
551
|
+
cors: {
|
|
552
|
+
origin: 'https://hooks.stripe.com',
|
|
553
|
+
methods: ['POST'],
|
|
554
|
+
},
|
|
555
|
+
handle({ req }) {
|
|
556
|
+
return { received: true }
|
|
557
|
+
}
|
|
558
|
+
}),
|
|
559
|
+
|
|
560
|
+
// Disable CORS completely for internal endpoints
|
|
561
|
+
internalHealth: route.get('/health', {
|
|
562
|
+
cors: false,
|
|
563
|
+
handle() {
|
|
564
|
+
return { status: 'healthy' }
|
|
565
|
+
}
|
|
566
|
+
})
|
|
567
|
+
})
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
#### Class-Based (OOP) Paradigm
|
|
571
|
+
```typescript filename="src/http/webhooks/stripe/route.ts"
|
|
572
|
+
import { Controller, Post, Cors } from 'exisjs/decorators'
|
|
573
|
+
|
|
574
|
+
@Controller('/webhooks/stripe')
|
|
575
|
+
export default class StripeWebhookController {
|
|
576
|
+
@Post('/')
|
|
577
|
+
@Cors({ origin: 'https://hooks.stripe.com', methods: ['POST'] })
|
|
578
|
+
handleWebhook() {
|
|
579
|
+
return { received: true }
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
540
584
|
### Query Pagination Schemas
|
|
541
585
|
|
|
542
586
|
ExisJS provides the `tex.pagination()` primitive for declarative pagination, sorting, and ordering query parameters. String query parameters are automatically coerced into numbers:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
nextUrl:
|
|
3
|
-
nextTitle:
|
|
2
|
+
nextUrl: '/docs/structure'
|
|
3
|
+
nextTitle: 'Project Structure'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Security & Edge Middleware
|
|
@@ -33,7 +33,7 @@ export default exis({
|
|
|
33
33
|
app.use(timeout(10000))
|
|
34
34
|
app.use(hpp())
|
|
35
35
|
app.use(mongoSanitize())
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
})
|
|
38
38
|
```
|
|
39
39
|
|
|
@@ -52,9 +52,9 @@ export const config = defineBoundary({})
|
|
|
52
52
|
// Apply rate limiting chain step across the boundary
|
|
53
53
|
export const limiter = rateLimit({
|
|
54
54
|
windowMs: 60 * 1000, // 1 minute window
|
|
55
|
-
max: 100,
|
|
55
|
+
max: 100, // 100 requests per window
|
|
56
56
|
message: 'Too many requests from this IP, please try again after a minute',
|
|
57
|
-
keyGenerator: (req) => req.ip // Uses normalized IPv4/IPv6 client IP
|
|
57
|
+
keyGenerator: (req) => req.ip, // Uses normalized IPv4/IPv6 client IP
|
|
58
58
|
})
|
|
59
59
|
```
|
|
60
60
|
|
|
@@ -62,13 +62,13 @@ export const limiter = rateLimit({
|
|
|
62
62
|
|
|
63
63
|
`rateLimit` automatically emits standard IETF draft and legacy rate-limiting headers on every response:
|
|
64
64
|
|
|
65
|
-
| Header
|
|
66
|
-
|
|
|
67
|
-
| `RateLimit-Limit`
|
|
68
|
-
| `RateLimit-Remaining` | Remaining requests permitted within the current window.
|
|
69
|
-
| `RateLimit-Reset`
|
|
70
|
-
| `Retry-After`
|
|
71
|
-
| `X-RateLimit-*`
|
|
65
|
+
| Header | Description | Example |
|
|
66
|
+
| :-------------------- | :------------------------------------------------------------------------- | :---------------------- |
|
|
67
|
+
| `RateLimit-Limit` | Maximum request quota for the configured window. | `100` |
|
|
68
|
+
| `RateLimit-Remaining` | Remaining requests permitted within the current window. | `42` |
|
|
69
|
+
| `RateLimit-Reset` | Time remaining in seconds until the window quota resets. | `18` |
|
|
70
|
+
| `Retry-After` | Included on `429 Too Many Requests` (RFC 6585) indicating seconds to wait. | `18` |
|
|
71
|
+
| `X-RateLimit-*` | Legacy header equivalents for backwards compatibility. | `X-RateLimit-Reset: 18` |
|
|
72
72
|
|
|
73
73
|
> [!NOTE]
|
|
74
74
|
> The core `rateLimit` middleware runs using an in-memory native off-heap store. For distributed, multi-instance rate limiting backed by Redis, use `@exisjs/cache`.
|
|
@@ -77,34 +77,47 @@ export const limiter = rateLimit({
|
|
|
77
77
|
|
|
78
78
|
## 3. Role-Based Access Control (RBAC) Metadata
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
#### Functional Paradigm
|
|
80
|
+
---
|
|
83
81
|
|
|
84
|
-
|
|
85
|
-
import { controller, route } from 'exisjs/router'
|
|
82
|
+
## 4. Timing-Safe Operations & Authentication
|
|
86
83
|
|
|
87
|
-
|
|
88
|
-
deleteItem: route.delete('/:id', {
|
|
89
|
-
permissions: ['admin'],
|
|
90
|
-
handle({ params }) {
|
|
91
|
-
return { success: true, deleted: params.id }
|
|
92
|
-
}
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
```
|
|
84
|
+
To prevent side-channel timing attacks when validating authentication tokens, API keys, HMAC signatures, or webhook secrets, ExisJS provides the `timingSafeEqual` helper:
|
|
96
85
|
|
|
97
|
-
|
|
86
|
+
```typescript filename="src/http/common/guards/auth.guard.ts"
|
|
87
|
+
import { timingSafeEqual } from 'exisjs/middleware'
|
|
88
|
+
import { UnauthorizedException } from 'exisjs/error'
|
|
98
89
|
|
|
99
|
-
|
|
100
|
-
|
|
90
|
+
export function apiKeyGuard(req: any) {
|
|
91
|
+
const apiKey = req.headers['x-api-key']
|
|
92
|
+
const secretKey = process.env.API_KEY
|
|
101
93
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@Permissions('admin')
|
|
105
|
-
@Delete('/:id')
|
|
106
|
-
async deleteItem(@Param('id') id: string) {
|
|
107
|
-
return { success: true, deleted: id }
|
|
94
|
+
if (!timingSafeEqual(apiKey, secretKey)) {
|
|
95
|
+
throw new UnauthorizedException('Invalid API Key')
|
|
108
96
|
}
|
|
109
97
|
}
|
|
110
98
|
```
|
|
99
|
+
|
|
100
|
+
`timingSafeEqual` executes in constant time regardless of string lengths or partial matching prefixes, neutralizing timing analysis exploits.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 5. Security Scanner Noise Suppression & Blackhole Handler
|
|
105
|
+
|
|
106
|
+
ExisJS includes built-in protection against automated vulnerability bots scanning for `.env`, `/.git`, `/.DS_Store`, WordPress/PHP configs, and Java actuator dumps:
|
|
107
|
+
|
|
108
|
+
```typescript filename="src/http/server.ts"
|
|
109
|
+
import { exis } from 'exisjs'
|
|
110
|
+
import { blockSuspiciousProbes } from 'exisjs/middleware'
|
|
111
|
+
|
|
112
|
+
export default exis({
|
|
113
|
+
async onStart(app) {
|
|
114
|
+
// Intercepts scanner probes and blackholes them without triggering downstream error logs
|
|
115
|
+
app.use(
|
|
116
|
+
blockSuspiciousProbes({
|
|
117
|
+
blackhole: true, // Terminate immediately with 404/empty body
|
|
118
|
+
silent: true, // Suppress 404 noise from production logs
|
|
119
|
+
})
|
|
120
|
+
)
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
```
|