@fluojs/runtime 1.0.0-beta.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.
- package/LICENSE +21 -0
- package/README.ko.md +182 -0
- package/README.md +182 -0
- package/dist/abort.d.ts +19 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/abort.js +39 -0
- package/dist/adapters/internal-http-adapter.d.ts +2 -0
- package/dist/adapters/internal-http-adapter.d.ts.map +1 -0
- package/dist/adapters/internal-http-adapter.js +1 -0
- package/dist/adapters/internal-request-response-factory.d.ts +2 -0
- package/dist/adapters/internal-request-response-factory.d.ts.map +1 -0
- package/dist/adapters/internal-request-response-factory.js +1 -0
- package/dist/adapters/request-response-factory.d.ts +17 -0
- package/dist/adapters/request-response-factory.d.ts.map +1 -0
- package/dist/adapters/request-response-factory.js +27 -0
- package/dist/bootstrap.d.ts +73 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +870 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +88 -0
- package/dist/health/diagnostics.d.ts +56 -0
- package/dist/health/diagnostics.d.ts.map +1 -0
- package/dist/health/diagnostics.js +155 -0
- package/dist/health/health.d.ts +18 -0
- package/dist/health/health.d.ts.map +1 -0
- package/dist/health/health.js +82 -0
- package/dist/http-adapter-shared.d.ts +88 -0
- package/dist/http-adapter-shared.d.ts.map +1 -0
- package/dist/http-adapter-shared.js +199 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/internal-http-adapter.d.ts +2 -0
- package/dist/internal-http-adapter.d.ts.map +1 -0
- package/dist/internal-http-adapter.js +1 -0
- package/dist/internal-node.d.ts +2 -0
- package/dist/internal-node.d.ts.map +1 -0
- package/dist/internal-node.js +1 -0
- package/dist/internal-request-response-factory.d.ts +2 -0
- package/dist/internal-request-response-factory.d.ts.map +1 -0
- package/dist/internal-request-response-factory.js +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +1 -0
- package/dist/logging/json-logger.d.ts +3 -0
- package/dist/logging/json-logger.d.ts.map +1 -0
- package/dist/logging/json-logger.js +39 -0
- package/dist/logging/logger.d.ts +3 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +36 -0
- package/dist/module-graph.d.ts +26 -0
- package/dist/module-graph.d.ts.map +1 -0
- package/dist/module-graph.js +248 -0
- package/dist/multipart.d.ts +45 -0
- package/dist/multipart.d.ts.map +1 -0
- package/dist/multipart.js +195 -0
- package/dist/node/internal-node-compression.d.ts +7 -0
- package/dist/node/internal-node-compression.d.ts.map +1 -0
- package/dist/node/internal-node-compression.js +68 -0
- package/dist/node/internal-node-request.d.ts +34 -0
- package/dist/node/internal-node-request.d.ts.map +1 -0
- package/dist/node/internal-node-request.js +195 -0
- package/dist/node/internal-node-response.d.ts +8 -0
- package/dist/node/internal-node-response.d.ts.map +1 -0
- package/dist/node/internal-node-response.js +166 -0
- package/dist/node/internal-node-shutdown.d.ts +34 -0
- package/dist/node/internal-node-shutdown.d.ts.map +1 -0
- package/dist/node/internal-node-shutdown.js +83 -0
- package/dist/node/internal-node.d.ts +80 -0
- package/dist/node/internal-node.d.ts.map +1 -0
- package/dist/node/internal-node.js +209 -0
- package/dist/node/node-compression.d.ts +2 -0
- package/dist/node/node-compression.d.ts.map +1 -0
- package/dist/node/node-compression.js +1 -0
- package/dist/node/node-request.d.ts +2 -0
- package/dist/node/node-request.d.ts.map +1 -0
- package/dist/node/node-request.js +1 -0
- package/dist/node/node-response.d.ts +2 -0
- package/dist/node/node-response.d.ts.map +1 -0
- package/dist/node/node-response.js +1 -0
- package/dist/node/node-shutdown.d.ts +2 -0
- package/dist/node/node-shutdown.d.ts.map +1 -0
- package/dist/node/node-shutdown.js +1 -0
- package/dist/node/node.d.ts +2 -0
- package/dist/node/node.d.ts.map +1 -0
- package/dist/node/node.js +1 -0
- package/dist/node.d.ts +5 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/platform-contract.d.ts +140 -0
- package/dist/platform-contract.d.ts.map +1 -0
- package/dist/platform-contract.js +1 -0
- package/dist/platform-shell.d.ts +45 -0
- package/dist/platform-shell.d.ts.map +1 -0
- package/dist/platform-shell.js +368 -0
- package/dist/request-transaction.d.ts +17 -0
- package/dist/request-transaction.d.ts.map +1 -0
- package/dist/request-transaction.js +39 -0
- package/dist/tokens.d.ts +27 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +24 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/web.d.ts +58 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +431 -0
- package/package.json +86 -0
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { FluoError } from '@fluojs/core';
|
|
2
|
+
/**
|
|
3
|
+
* Structured context for runtime-level errors.
|
|
4
|
+
*/
|
|
5
|
+
export interface RuntimeErrorContext {
|
|
6
|
+
/** Name of the module where the error occurred. */
|
|
7
|
+
readonly module?: string;
|
|
8
|
+
/** DI token associated with the failure. */
|
|
9
|
+
readonly token?: unknown;
|
|
10
|
+
/** Application bootstrap or lifecycle phase. */
|
|
11
|
+
readonly phase?: string;
|
|
12
|
+
/** Actionable hint for resolving the error. */
|
|
13
|
+
readonly hint?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Error thrown when a failure occurs during module graph compilation or resolution.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ModuleGraphError extends FluoError {
|
|
19
|
+
constructor(message: string, context?: RuntimeErrorContext);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Error thrown when a provider is requested from a module that does not have visibility to it.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ModuleVisibilityError extends FluoError {
|
|
25
|
+
constructor(message: string, context?: RuntimeErrorContext);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Error thrown when module injection metadata is missing or invalid.
|
|
29
|
+
*/
|
|
30
|
+
export declare class ModuleInjectionMetadataError extends FluoError {
|
|
31
|
+
constructor(message: string, context?: RuntimeErrorContext);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Error thrown when multiple providers are registered for the same token within a module.
|
|
35
|
+
*/
|
|
36
|
+
export declare class DuplicateProviderError extends FluoError {
|
|
37
|
+
constructor(message: string, context?: RuntimeErrorContext);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,cAAc,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAuCD;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;CAS3D;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;CAS3D;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,SAAS;gBAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;CAS3D;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;CAS3D"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { FluoError, formatTokenName } from '@fluojs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Structured context for runtime-level errors.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
function formatRuntimeContext(ctx) {
|
|
8
|
+
if (!ctx) return '';
|
|
9
|
+
const parts = [];
|
|
10
|
+
if (ctx.module) {
|
|
11
|
+
parts.push(`Module: ${ctx.module}`);
|
|
12
|
+
}
|
|
13
|
+
if (ctx.token !== undefined) {
|
|
14
|
+
parts.push(`Token: ${formatTokenName(ctx.token)}`);
|
|
15
|
+
}
|
|
16
|
+
if (ctx.phase) {
|
|
17
|
+
parts.push(`Phase: ${ctx.phase}`);
|
|
18
|
+
}
|
|
19
|
+
if (ctx.hint) {
|
|
20
|
+
parts.push(`Hint: ${ctx.hint}`);
|
|
21
|
+
}
|
|
22
|
+
if (parts.length === 0) return '';
|
|
23
|
+
return '\n ' + parts.join('\n ');
|
|
24
|
+
}
|
|
25
|
+
function buildRuntimeMeta(context) {
|
|
26
|
+
const meta = {};
|
|
27
|
+
if (context.module) meta['module'] = context.module;
|
|
28
|
+
if (context.token !== undefined) meta['token'] = formatTokenName(context.token);
|
|
29
|
+
if (context.phase) meta['phase'] = context.phase;
|
|
30
|
+
if (context.hint) meta['hint'] = context.hint;
|
|
31
|
+
return meta;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Error thrown when a failure occurs during module graph compilation or resolution.
|
|
36
|
+
*/
|
|
37
|
+
export class ModuleGraphError extends FluoError {
|
|
38
|
+
constructor(message, context) {
|
|
39
|
+
super(message + formatRuntimeContext(context), {
|
|
40
|
+
code: 'MODULE_GRAPH_ERROR',
|
|
41
|
+
...(context ? {
|
|
42
|
+
meta: buildRuntimeMeta(context)
|
|
43
|
+
} : undefined)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Error thrown when a provider is requested from a module that does not have visibility to it.
|
|
50
|
+
*/
|
|
51
|
+
export class ModuleVisibilityError extends FluoError {
|
|
52
|
+
constructor(message, context) {
|
|
53
|
+
super(message + formatRuntimeContext(context), {
|
|
54
|
+
code: 'MODULE_VISIBILITY_ERROR',
|
|
55
|
+
...(context ? {
|
|
56
|
+
meta: buildRuntimeMeta(context)
|
|
57
|
+
} : undefined)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Error thrown when module injection metadata is missing or invalid.
|
|
64
|
+
*/
|
|
65
|
+
export class ModuleInjectionMetadataError extends FluoError {
|
|
66
|
+
constructor(message, context) {
|
|
67
|
+
super(message + formatRuntimeContext(context), {
|
|
68
|
+
code: 'MODULE_INJECTION_METADATA_ERROR',
|
|
69
|
+
...(context ? {
|
|
70
|
+
meta: buildRuntimeMeta(context)
|
|
71
|
+
} : undefined)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Error thrown when multiple providers are registered for the same token within a module.
|
|
78
|
+
*/
|
|
79
|
+
export class DuplicateProviderError extends FluoError {
|
|
80
|
+
constructor(message, context) {
|
|
81
|
+
super(message + formatRuntimeContext(context), {
|
|
82
|
+
code: 'DUPLICATE_PROVIDER_ERROR',
|
|
83
|
+
...(context ? {
|
|
84
|
+
meta: buildRuntimeMeta(context)
|
|
85
|
+
} : undefined)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Scope } from '@fluojs/di';
|
|
2
|
+
import type { CompiledModule, ModuleType } from '../types.js';
|
|
3
|
+
export interface RuntimeDiagnosticsGraph {
|
|
4
|
+
version: 1;
|
|
5
|
+
rootModule: string;
|
|
6
|
+
modules: RuntimeDiagnosticsModule[];
|
|
7
|
+
relationships: RuntimeDiagnosticsRelationships;
|
|
8
|
+
}
|
|
9
|
+
export interface RuntimeDiagnosticsModule {
|
|
10
|
+
name: string;
|
|
11
|
+
global: boolean;
|
|
12
|
+
imports: string[];
|
|
13
|
+
controllers: string[];
|
|
14
|
+
providers: RuntimeDiagnosticsProvider[];
|
|
15
|
+
exports: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface RuntimeDiagnosticsProvider {
|
|
18
|
+
token: string;
|
|
19
|
+
type: 'class' | 'factory' | 'value' | 'existing';
|
|
20
|
+
scope: Scope;
|
|
21
|
+
multi: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface RuntimeDiagnosticsRelationships {
|
|
24
|
+
moduleImports: Array<{
|
|
25
|
+
from: string;
|
|
26
|
+
to: string;
|
|
27
|
+
}>;
|
|
28
|
+
moduleExports: Array<{
|
|
29
|
+
module: string;
|
|
30
|
+
token: string;
|
|
31
|
+
}>;
|
|
32
|
+
moduleProviders: Array<{
|
|
33
|
+
module: string;
|
|
34
|
+
token: string;
|
|
35
|
+
providerType: RuntimeDiagnosticsProvider['type'];
|
|
36
|
+
scope: Scope;
|
|
37
|
+
multi: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
moduleControllers: Array<{
|
|
40
|
+
controller: string;
|
|
41
|
+
module: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export interface BootstrapTimingPhase {
|
|
45
|
+
durationMs: number;
|
|
46
|
+
name: 'bootstrap_module' | 'register_runtime_tokens' | 'resolve_lifecycle_instances' | 'run_bootstrap_lifecycle' | 'create_dispatcher';
|
|
47
|
+
}
|
|
48
|
+
export interface BootstrapTimingDiagnostics {
|
|
49
|
+
phases: BootstrapTimingPhase[];
|
|
50
|
+
totalMs: number;
|
|
51
|
+
version: 1;
|
|
52
|
+
}
|
|
53
|
+
export declare function createRuntimeDiagnosticsGraph(modules: readonly CompiledModule[], rootModule: ModuleType): RuntimeDiagnosticsGraph;
|
|
54
|
+
export declare function renderRuntimeDiagnosticsMermaid(graph: RuntimeDiagnosticsGraph): string;
|
|
55
|
+
export declare function createBootstrapTimingDiagnostics(phases: BootstrapTimingPhase[], totalMs: number): BootstrapTimingDiagnostics;
|
|
56
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/health/diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,KAAK,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpC,aAAa,EAAE,+BAA+B,CAAC;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,0BAA0B,EAAE,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,+BAA+B;IAC9C,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC,CAAC;IACH,aAAa,EAAE,KAAK,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IACH,iBAAiB,EAAE,KAAK,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EACA,kBAAkB,GAClB,yBAAyB,GACzB,6BAA6B,GAC7B,yBAAyB,GACzB,mBAAmB,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,CAAC;CACZ;AAiFD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,uBAAuB,CAkEjI;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAoCtF;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,oBAAoB,EAAE,EAC9B,OAAO,EAAE,MAAM,GACd,0BAA0B,CAS5B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { getClassDiMetadata } from '@fluojs/core/internal';
|
|
2
|
+
function roundMs(value) {
|
|
3
|
+
return Number(value.toFixed(3));
|
|
4
|
+
}
|
|
5
|
+
function labelModule(moduleType) {
|
|
6
|
+
return moduleType.name || '<anonymous-module>';
|
|
7
|
+
}
|
|
8
|
+
function labelToken(token) {
|
|
9
|
+
if (typeof token === 'function') {
|
|
10
|
+
return token.name || '<anonymous-token>';
|
|
11
|
+
}
|
|
12
|
+
if (typeof token === 'symbol') {
|
|
13
|
+
return token.description ? `Symbol(${token.description})` : token.toString();
|
|
14
|
+
}
|
|
15
|
+
return String(token);
|
|
16
|
+
}
|
|
17
|
+
function providerShape(provider) {
|
|
18
|
+
if (typeof provider === 'function') {
|
|
19
|
+
return 'class';
|
|
20
|
+
}
|
|
21
|
+
if ('useFactory' in provider) {
|
|
22
|
+
return 'factory';
|
|
23
|
+
}
|
|
24
|
+
if ('useValue' in provider) {
|
|
25
|
+
return 'value';
|
|
26
|
+
}
|
|
27
|
+
if ('useExisting' in provider) {
|
|
28
|
+
return 'existing';
|
|
29
|
+
}
|
|
30
|
+
return 'class';
|
|
31
|
+
}
|
|
32
|
+
function providerScope(provider) {
|
|
33
|
+
if (typeof provider === 'function') {
|
|
34
|
+
return getClassDiMetadata(provider)?.scope ?? 'singleton';
|
|
35
|
+
}
|
|
36
|
+
if ('useValue' in provider || 'useExisting' in provider) {
|
|
37
|
+
return 'singleton';
|
|
38
|
+
}
|
|
39
|
+
if ('useFactory' in provider) {
|
|
40
|
+
return provider.scope ?? (provider.resolverClass ? getClassDiMetadata(provider.resolverClass)?.scope : undefined) ?? 'singleton';
|
|
41
|
+
}
|
|
42
|
+
if ('useClass' in provider) {
|
|
43
|
+
return provider.scope ?? getClassDiMetadata(provider.useClass)?.scope ?? 'singleton';
|
|
44
|
+
}
|
|
45
|
+
return 'singleton';
|
|
46
|
+
}
|
|
47
|
+
function providerToken(provider) {
|
|
48
|
+
if (typeof provider === 'function') {
|
|
49
|
+
return provider;
|
|
50
|
+
}
|
|
51
|
+
return provider.provide;
|
|
52
|
+
}
|
|
53
|
+
function normalizeProvider(provider) {
|
|
54
|
+
const multi = typeof provider === 'object' && provider !== null && 'multi' in provider && provider.multi === true;
|
|
55
|
+
return {
|
|
56
|
+
multi,
|
|
57
|
+
scope: providerScope(provider),
|
|
58
|
+
token: labelToken(providerToken(provider)),
|
|
59
|
+
type: providerShape(provider)
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function createRuntimeDiagnosticsGraph(modules, rootModule) {
|
|
63
|
+
const moduleDiagnostics = [];
|
|
64
|
+
const moduleImports = [];
|
|
65
|
+
const moduleExports = [];
|
|
66
|
+
const moduleProviders = [];
|
|
67
|
+
const moduleControllers = [];
|
|
68
|
+
for (const compiledModule of modules) {
|
|
69
|
+
const moduleName = labelModule(compiledModule.type);
|
|
70
|
+
const imports = (compiledModule.definition.imports ?? []).map(moduleType => labelModule(moduleType));
|
|
71
|
+
const controllers = (compiledModule.definition.controllers ?? []).map(controller => controller.name || '<anonymous-controller>');
|
|
72
|
+
const providers = (compiledModule.definition.providers ?? []).map(provider => normalizeProvider(provider));
|
|
73
|
+
const exports = Array.from(compiledModule.exportedTokens).map(token => labelToken(token));
|
|
74
|
+
moduleDiagnostics.push({
|
|
75
|
+
controllers,
|
|
76
|
+
exports,
|
|
77
|
+
global: compiledModule.definition.global ?? false,
|
|
78
|
+
imports,
|
|
79
|
+
name: moduleName,
|
|
80
|
+
providers
|
|
81
|
+
});
|
|
82
|
+
for (const imported of imports) {
|
|
83
|
+
moduleImports.push({
|
|
84
|
+
from: moduleName,
|
|
85
|
+
to: imported
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
for (const token of exports) {
|
|
89
|
+
moduleExports.push({
|
|
90
|
+
module: moduleName,
|
|
91
|
+
token
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
for (const provider of providers) {
|
|
95
|
+
moduleProviders.push({
|
|
96
|
+
module: moduleName,
|
|
97
|
+
multi: provider.multi,
|
|
98
|
+
providerType: provider.type,
|
|
99
|
+
scope: provider.scope,
|
|
100
|
+
token: provider.token
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
for (const controller of controllers) {
|
|
104
|
+
moduleControllers.push({
|
|
105
|
+
controller,
|
|
106
|
+
module: moduleName
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
modules: moduleDiagnostics,
|
|
112
|
+
relationships: {
|
|
113
|
+
moduleControllers,
|
|
114
|
+
moduleExports,
|
|
115
|
+
moduleImports,
|
|
116
|
+
moduleProviders
|
|
117
|
+
},
|
|
118
|
+
rootModule: labelModule(rootModule),
|
|
119
|
+
version: 1
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function renderRuntimeDiagnosticsMermaid(graph) {
|
|
123
|
+
const lines = ['graph TD'];
|
|
124
|
+
const nodeByModule = new Map();
|
|
125
|
+
for (const [index, module] of graph.modules.entries()) {
|
|
126
|
+
const nodeId = `M${String(index + 1)}`;
|
|
127
|
+
nodeByModule.set(module.name, nodeId);
|
|
128
|
+
const summary = [module.name, `providers: ${String(module.providers.length)}`, `controllers: ${String(module.controllers.length)}`, `exports: ${String(module.exports.length)}`].join('\\n');
|
|
129
|
+
lines.push(` ${nodeId}["${summary}"]`);
|
|
130
|
+
}
|
|
131
|
+
for (const relation of graph.relationships.moduleImports) {
|
|
132
|
+
const from = nodeByModule.get(relation.from);
|
|
133
|
+
const to = nodeByModule.get(relation.to);
|
|
134
|
+
if (!from || !to) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
lines.push(` ${from} --> ${to}`);
|
|
138
|
+
}
|
|
139
|
+
const rootNodeId = nodeByModule.get(graph.rootModule);
|
|
140
|
+
if (rootNodeId) {
|
|
141
|
+
lines.push(` class ${rootNodeId} rootModule`);
|
|
142
|
+
lines.push(' classDef rootModule stroke:#2563eb,stroke-width:2px');
|
|
143
|
+
}
|
|
144
|
+
return lines.join('\n');
|
|
145
|
+
}
|
|
146
|
+
export function createBootstrapTimingDiagnostics(phases, totalMs) {
|
|
147
|
+
return {
|
|
148
|
+
phases: phases.map(phase => ({
|
|
149
|
+
...phase,
|
|
150
|
+
durationMs: roundMs(phase.durationMs)
|
|
151
|
+
})),
|
|
152
|
+
totalMs: roundMs(totalMs),
|
|
153
|
+
version: 1
|
|
154
|
+
};
|
|
155
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ModuleType } from '../types.js';
|
|
2
|
+
export interface HealthStatus {
|
|
3
|
+
status: 'ok' | 'unavailable';
|
|
4
|
+
}
|
|
5
|
+
export interface HealthCheckResponse {
|
|
6
|
+
body: unknown;
|
|
7
|
+
statusCode?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ReadinessStatus {
|
|
10
|
+
status: 'ready' | 'starting' | 'unavailable';
|
|
11
|
+
}
|
|
12
|
+
export interface HealthModuleOptions {
|
|
13
|
+
healthCheck?: (ctx: import('@fluojs/http').RequestContext) => HealthStatus | HealthCheckResponse | Promise<HealthStatus | HealthCheckResponse>;
|
|
14
|
+
path?: string;
|
|
15
|
+
}
|
|
16
|
+
export type ReadinessCheck = () => boolean | Promise<boolean>;
|
|
17
|
+
export declare function createHealthModule(options?: HealthModuleOptions): ModuleType;
|
|
18
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/health/health.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;CAC9C;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,cAAc,EAAE,cAAc,KACrD,YAAY,GACZ,mBAAmB,GACnB,OAAO,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CA0EhF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
function _applyDecs(e, t, n, r, o, i) { var a, c, u, s, f, l, p, d = Symbol.metadata || Symbol.for("Symbol.metadata"), m = Object.defineProperty, h = Object.create, y = [h(null), h(null)], v = t.length; function g(t, n, r) { return function (o, i) { n && (i = o, o = e); for (var a = 0; a < t.length; a++) i = t[a].apply(o, r ? [i] : []); return r ? i : o; }; } function b(e, t, n, r) { if ("function" != typeof e && (r || void 0 !== e)) throw new TypeError(t + " must " + (n || "be") + " a function" + (r ? "" : " or undefined")); return e; } function applyDec(e, t, n, r, o, i, u, s, f, l, p) { function d(e) { if (!p(e)) throw new TypeError("Attempted to access private element on non-instance"); } var h = [].concat(t[0]), v = t[3], w = !u, D = 1 === o, S = 3 === o, j = 4 === o, E = 2 === o; function I(t, n, r) { return function (o, i) { return n && (i = o, o = e), r && r(o), P[t].call(o, i); }; } if (!w) { var P = {}, k = [], F = S ? "get" : j || D ? "set" : "value"; if (f ? (l || D ? P = { get: _setFunctionName(function () { return v(this); }, r, "get"), set: function (e) { t[4](this, e); } } : P[F] = v, l || _setFunctionName(P[F], r, E ? "" : F)) : l || (P = Object.getOwnPropertyDescriptor(e, r)), !l && !f) { if ((c = y[+s][r]) && 7 !== (c ^ o)) throw Error("Decorating two elements with the same name (" + P[F].name + ") is not supported yet"); y[+s][r] = o < 3 ? 1 : o; } } for (var N = e, O = h.length - 1; O >= 0; O -= n ? 2 : 1) { var T = b(h[O], "A decorator", "be", !0), z = n ? h[O - 1] : void 0, A = {}, H = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: r, metadata: a, addInitializer: function (e, t) { if (e.v) throw new TypeError("attempted to call addInitializer after decoration was finished"); b(t, "An initializer", "be", !0), i.push(t); }.bind(null, A) }; if (w) c = T.call(z, N, H), A.v = 1, b(c, "class decorators", "return") && (N = c);else if (H.static = s, H.private = f, c = H.access = { has: f ? p.bind() : function (e) { return r in e; } }, j || (c.get = f ? E ? function (e) { return d(e), P.value; } : I("get", 0, d) : function (e) { return e[r]; }), E || S || (c.set = f ? I("set", 0, d) : function (e, t) { e[r] = t; }), N = T.call(z, D ? { get: P.get, set: P.set } : P[F], H), A.v = 1, D) { if ("object" == typeof N && N) (c = b(N.get, "accessor.get")) && (P.get = c), (c = b(N.set, "accessor.set")) && (P.set = c), (c = b(N.init, "accessor.init")) && k.unshift(c);else if (void 0 !== N) throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined"); } else b(N, (l ? "field" : "method") + " decorators", "return") && (l ? k.unshift(N) : P[F] = N); } return o < 2 && u.push(g(k, s, 1), g(i, s, 0)), l || w || (f ? D ? u.splice(-1, 0, I("get", s), I("set", s)) : u.push(E ? P[F] : b.call.bind(P[F])) : m(e, r, P)), N; } function w(e) { return m(e, d, { configurable: !0, enumerable: !0, value: a }); } return void 0 !== i && (a = i[d]), a = h(null == a ? null : a), f = [], l = function (e) { e && f.push(g(e)); }, p = function (t, r) { for (var i = 0; i < n.length; i++) { var a = n[i], c = a[1], l = 7 & c; if ((8 & c) == t && !l == r) { var p = a[2], d = !!a[3], m = 16 & c; applyDec(t ? e : e.prototype, a, m, d ? "#" + p : _toPropertyKey(p), l, l < 2 ? [] : t ? s = s || [] : u = u || [], f, !!t, d, r, t && d ? function (t) { return _checkInRHS(t) === e; } : o); } } }, p(8, 0), p(0, 0), p(8, 1), p(0, 1), l(u), l(s), c = f, v || w(e), { e: c, get c() { var n = []; return v && [w(e = applyDec(e, [t], r, e.name, 5, n)), g(n, 1)]; } }; }
|
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
|
+
function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
|
|
5
|
+
function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
|
|
6
|
+
import { Controller, Get } from '@fluojs/http';
|
|
7
|
+
import { defineModule } from '../bootstrap.js';
|
|
8
|
+
export function createHealthModule(options = {}) {
|
|
9
|
+
let _initProto, _initClass;
|
|
10
|
+
const basePath = options.path ?? '';
|
|
11
|
+
const readinessChecks = [];
|
|
12
|
+
let ready = false;
|
|
13
|
+
const resolveHealthResponse = async ctx => {
|
|
14
|
+
if (!options.healthCheck) {
|
|
15
|
+
return {
|
|
16
|
+
status: 'ok'
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return options.healthCheck(ctx);
|
|
20
|
+
};
|
|
21
|
+
const isHealthCheckResponse = value => typeof value === 'object' && value !== null && 'body' in value;
|
|
22
|
+
let _HealthController;
|
|
23
|
+
class HealthController {
|
|
24
|
+
static {
|
|
25
|
+
({
|
|
26
|
+
e: [_initProto],
|
|
27
|
+
c: [_HealthController, _initClass]
|
|
28
|
+
} = _applyDecs(this, [Controller(basePath)], [[Get('/health'), 2, "health"], [Get('/ready'), 2, "ready"]]));
|
|
29
|
+
}
|
|
30
|
+
constructor() {
|
|
31
|
+
_initProto(this);
|
|
32
|
+
}
|
|
33
|
+
async health(_input, ctx) {
|
|
34
|
+
const result = await resolveHealthResponse(ctx);
|
|
35
|
+
if (isHealthCheckResponse(result)) {
|
|
36
|
+
if (result.statusCode !== undefined) {
|
|
37
|
+
ctx.response.setStatus(result.statusCode);
|
|
38
|
+
}
|
|
39
|
+
return result.body;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
async ready(_input, ctx) {
|
|
44
|
+
if (!ready) {
|
|
45
|
+
ctx.response.setStatus(503);
|
|
46
|
+
return {
|
|
47
|
+
status: 'starting'
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
for (const check of readinessChecks) {
|
|
51
|
+
const result = await check();
|
|
52
|
+
if (!result) {
|
|
53
|
+
ctx.response.setStatus(503);
|
|
54
|
+
return {
|
|
55
|
+
status: 'unavailable'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
status: 'ready'
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
static {
|
|
64
|
+
_initClass();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
class HealthModule {
|
|
68
|
+
static addReadinessCheck(fn) {
|
|
69
|
+
readinessChecks.push(fn);
|
|
70
|
+
}
|
|
71
|
+
static markReady() {
|
|
72
|
+
ready = true;
|
|
73
|
+
}
|
|
74
|
+
static markStarting() {
|
|
75
|
+
ready = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
defineModule(HealthModule, {
|
|
79
|
+
controllers: [_HealthController]
|
|
80
|
+
});
|
|
81
|
+
return HealthModule;
|
|
82
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type CorsOptions, type HttpApplicationAdapter, type MiddlewareLike, type SecurityHeadersOptions } from '@fluojs/http';
|
|
2
|
+
import type { Application, ApplicationLogger, CreateApplicationOptions, ModuleType } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Input type for configuring CORS in an HTTP adapter.
|
|
5
|
+
*/
|
|
6
|
+
export type HttpAdapterCorsInput = false | string | string[] | CorsOptions;
|
|
7
|
+
/**
|
|
8
|
+
* Resolved target for an HTTP server listener.
|
|
9
|
+
*/
|
|
10
|
+
export interface HttpAdapterListenTarget {
|
|
11
|
+
/** The local address or host the server is bound to. */
|
|
12
|
+
bindTarget: string;
|
|
13
|
+
/** The public URL of the running server. */
|
|
14
|
+
url: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Common middleware options for HTTP adapters.
|
|
18
|
+
*/
|
|
19
|
+
export interface HttpAdapterMiddlewareOptions {
|
|
20
|
+
/** CORS configuration for the adapter. */
|
|
21
|
+
cors?: HttpAdapterCorsInput;
|
|
22
|
+
/** Global prefix applied to all routes. */
|
|
23
|
+
globalPrefix?: string;
|
|
24
|
+
/** List of route patterns to exclude from the global prefix. */
|
|
25
|
+
globalPrefixExclude?: readonly string[];
|
|
26
|
+
/** Custom middleware to inject into the adapter pipeline. */
|
|
27
|
+
middleware?: MiddlewareLike[];
|
|
28
|
+
/** Security header configuration. */
|
|
29
|
+
securityHeaders?: false | SecurityHeadersOptions;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Options for bootstrapping an HTTP adapter application.
|
|
33
|
+
*/
|
|
34
|
+
export interface BootstrapHttpAdapterApplicationOptions extends Omit<CreateApplicationOptions, 'adapter' | 'logger' | 'middleware'>, HttpAdapterMiddlewareOptions {
|
|
35
|
+
/** Optional custom application logger. */
|
|
36
|
+
logger?: ApplicationLogger;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Options for running an HTTP adapter application with shutdown management.
|
|
40
|
+
*/
|
|
41
|
+
export interface RunHttpAdapterApplicationOptions extends BootstrapHttpAdapterApplicationOptions {
|
|
42
|
+
/** Timeout for marking shutdown as failed during signal-driven teardown in milliseconds. */
|
|
43
|
+
forceExitTimeoutMs?: number;
|
|
44
|
+
/** Custom shutdown registration logic. */
|
|
45
|
+
shutdownRegistration?: HttpAdapterShutdownRegistration;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Function type for registering custom application shutdown logic.
|
|
49
|
+
*/
|
|
50
|
+
export type HttpAdapterShutdownRegistration = (app: Application, logger: ApplicationLogger, forceExitTimeoutMs?: number) => void | (() => void);
|
|
51
|
+
type ManagedHttpApplicationAdapter = HttpApplicationAdapter & {
|
|
52
|
+
getListenTarget(): HttpAdapterListenTarget;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Bootstraps an HTTP application with the provided adapter and options.
|
|
56
|
+
*
|
|
57
|
+
* @param rootModule The root application module class.
|
|
58
|
+
* @param options Bootstrap configuration for middleware and logging.
|
|
59
|
+
* @param adapter The HTTP platform adapter to use.
|
|
60
|
+
* @returns A promise that resolves to the initialized application instance.
|
|
61
|
+
*/
|
|
62
|
+
export declare function bootstrapHttpAdapterApplication(rootModule: ModuleType, options: BootstrapHttpAdapterApplicationOptions, adapter: HttpApplicationAdapter): Promise<Application>;
|
|
63
|
+
/**
|
|
64
|
+
* Resolves the final middleware chain for an HTTP adapter based on options.
|
|
65
|
+
*
|
|
66
|
+
* @param options Middleware configuration including CORS and prefix settings.
|
|
67
|
+
* @returns An array of middleware instances to be registered in the adapter.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createHttpAdapterMiddleware(options: HttpAdapterMiddlewareOptions): MiddlewareLike[];
|
|
70
|
+
/**
|
|
71
|
+
* Formats a log message indicating that the HTTP adapter is listening on a specific target.
|
|
72
|
+
*
|
|
73
|
+
* @param target - The listen target containing the URL and bind target.
|
|
74
|
+
* @returns A formatted string message.
|
|
75
|
+
*/
|
|
76
|
+
export declare function formatHttpAdapterListenMessage(target: HttpAdapterListenTarget): string;
|
|
77
|
+
/**
|
|
78
|
+
* Boots and runs an HTTP application using the provided adapter and options,
|
|
79
|
+
* including setup for shutdown management and logging.
|
|
80
|
+
*
|
|
81
|
+
* @param rootModule - The root application module class.
|
|
82
|
+
* @param options - Run configuration including shutdown and logging settings.
|
|
83
|
+
* @param adapter - The managed HTTP platform adapter to use.
|
|
84
|
+
* @returns A promise that resolves to the running application instance.
|
|
85
|
+
*/
|
|
86
|
+
export declare function runHttpAdapterApplication(rootModule: ModuleType, options: RunHttpAdapterApplicationOptions, adapter: ManagedHttpApplicationAdapter): Promise<Application>;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=http-adapter-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapter-shared.d.ts","sourceRoot":"","sources":["../src/http-adapter-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EAEhB,KAAK,sBAAsB,EAE3B,KAAK,cAAc,EAEnB,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvG;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0CAA0C;IAC1C,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,qCAAqC;IACrC,eAAe,CAAC,EAAE,KAAK,GAAG,sBAAsB,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,sCACf,SAAQ,IAAI,CAAC,wBAAwB,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC,EACzE,4BAA4B;IAC9B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gCAAiC,SAAQ,sCAAsC;IAC9F,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,+BAA+B,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,MAAM,+BAA+B,GAAG,CAC5C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,EACzB,kBAAkB,CAAC,EAAE,MAAM,KACxB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEzB,KAAK,6BAA6B,GAAG,sBAAsB,GAAG;IAC5D,eAAe,IAAI,uBAAuB,CAAC;CAC5C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,+BAA+B,CACnD,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,sCAAsC,EAC/C,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAQtB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,cAAc,EAAE,CAkBnG;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAItF;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gCAAgC,EACzC,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
|