@labostack/typebridge 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/README.md +62 -0
- package/dist/adapters/decorators.d.ts +11 -0
- package/dist/adapters/decorators.d.ts.map +1 -0
- package/dist/adapters/decorators.js +20 -0
- package/dist/adapters/decorators.js.map +1 -0
- package/dist/adapters/deepkit-adapter.d.ts +11 -0
- package/dist/adapters/deepkit-adapter.d.ts.map +1 -0
- package/dist/adapters/deepkit-adapter.js +39 -0
- package/dist/adapters/deepkit-adapter.js.map +1 -0
- package/dist/adapters/generic-adapter.d.ts +12 -0
- package/dist/adapters/generic-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-adapter.js +28 -0
- package/dist/adapters/generic-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/nest-adapter.d.ts +14 -0
- package/dist/adapters/nest-adapter.d.ts.map +1 -0
- package/dist/adapters/nest-adapter.js +33 -0
- package/dist/adapters/nest-adapter.js.map +1 -0
- package/dist/adapters/tsed-adapter.d.ts +10 -0
- package/dist/adapters/tsed-adapter.d.ts.map +1 -0
- package/dist/adapters/tsed-adapter.js +31 -0
- package/dist/adapters/tsed-adapter.js.map +1 -0
- package/dist/autobarrel/index.d.ts +2 -0
- package/dist/autobarrel/index.d.ts.map +1 -0
- package/dist/autobarrel/index.js +2 -0
- package/dist/autobarrel/index.js.map +1 -0
- package/dist/autobarrel/scanner.d.ts +14 -0
- package/dist/autobarrel/scanner.d.ts.map +1 -0
- package/dist/autobarrel/scanner.js +93 -0
- package/dist/autobarrel/scanner.js.map +1 -0
- package/dist/bridge.d.ts +54 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +151 -0
- package/dist/bridge.js.map +1 -0
- package/dist/discovery/dns.d.ts +10 -0
- package/dist/discovery/dns.d.ts.map +1 -0
- package/dist/discovery/dns.js +19 -0
- package/dist/discovery/dns.js.map +1 -0
- package/dist/discovery/index.d.ts +4 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +4 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/mdns.d.ts +18 -0
- package/dist/discovery/mdns.d.ts.map +1 -0
- package/dist/discovery/mdns.js +49 -0
- package/dist/discovery/mdns.js.map +1 -0
- package/dist/discovery/resolver.d.ts +16 -0
- package/dist/discovery/resolver.d.ts.map +1 -0
- package/dist/discovery/resolver.js +36 -0
- package/dist/discovery/resolver.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mesh/index.d.ts +2 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +2 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/mesh-manager.d.ts +55 -0
- package/dist/mesh/mesh-manager.d.ts.map +1 -0
- package/dist/mesh/mesh-manager.js +179 -0
- package/dist/mesh/mesh-manager.js.map +1 -0
- package/dist/proxy/client-proxy.d.ts +20 -0
- package/dist/proxy/client-proxy.d.ts.map +1 -0
- package/dist/proxy/client-proxy.js +69 -0
- package/dist/proxy/client-proxy.js.map +1 -0
- package/dist/proxy/index.d.ts +2 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +2 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/reflection/extractor.d.ts +13 -0
- package/dist/reflection/extractor.d.ts.map +1 -0
- package/dist/reflection/extractor.js +62 -0
- package/dist/reflection/extractor.js.map +1 -0
- package/dist/reflection/index.d.ts +2 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/dist/reflection/index.js +2 -0
- package/dist/reflection/index.js.map +1 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/method-registry.d.ts +56 -0
- package/dist/registry/method-registry.d.ts.map +1 -0
- package/dist/registry/method-registry.js +84 -0
- package/dist/registry/method-registry.js.map +1 -0
- package/dist/serialization/error-ext.d.ts +38 -0
- package/dist/serialization/error-ext.d.ts.map +1 -0
- package/dist/serialization/error-ext.js +76 -0
- package/dist/serialization/error-ext.js.map +1 -0
- package/dist/serialization/index.d.ts +4 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +3 -0
- package/dist/serialization/index.js.map +1 -0
- package/dist/serialization/msgpack.d.ts +30 -0
- package/dist/serialization/msgpack.d.ts.map +1 -0
- package/dist/serialization/msgpack.js +76 -0
- package/dist/serialization/msgpack.js.map +1 -0
- package/dist/serialization/serializer.d.ts +15 -0
- package/dist/serialization/serializer.d.ts.map +1 -0
- package/dist/serialization/serializer.js +2 -0
- package/dist/serialization/serializer.js.map +1 -0
- package/dist/transport/client.d.ts +38 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +57 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/connection.d.ts +57 -0
- package/dist/transport/connection.d.ts.map +1 -0
- package/dist/transport/connection.js +212 -0
- package/dist/transport/connection.js.map +1 -0
- package/dist/transport/constants.d.ts +2 -0
- package/dist/transport/constants.d.ts.map +1 -0
- package/dist/transport/constants.js +2 -0
- package/dist/transport/constants.js.map +1 -0
- package/dist/transport/framing.d.ts +54 -0
- package/dist/transport/framing.d.ts.map +1 -0
- package/dist/transport/framing.js +107 -0
- package/dist/transport/framing.js.map +1 -0
- package/dist/transport/index.d.ts +7 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +7 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/peer-manager.d.ts +67 -0
- package/dist/transport/peer-manager.d.ts.map +1 -0
- package/dist/transport/peer-manager.js +172 -0
- package/dist/transport/peer-manager.js.map +1 -0
- package/dist/transport/server.d.ts +37 -0
- package/dist/transport/server.d.ts.map +1 -0
- package/dist/transport/server.js +88 -0
- package/dist/transport/server.js.map +1 -0
- package/dist/types/adapter.d.ts +33 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +2 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/descriptor.d.ts +35 -0
- package/dist/types/descriptor.d.ts.map +1 -0
- package/dist/types/descriptor.js +2 -0
- package/dist/types/descriptor.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +55 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +6 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/protocol.d.ts +94 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +43 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/type-descriptor.d.ts +64 -0
- package/dist/types/type-descriptor.d.ts.map +1 -0
- package/dist/types/type-descriptor.js +2 -0
- package/dist/types/type-descriptor.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# @labostack/typebridge
|
|
2
|
+
|
|
3
|
+
Zero-ceremony RPC bridge with full auto-typing for TypeScript microservices.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @labostack/typebridge
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Service A — exposes controllers
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { TypeBridge } from "@labostack/typebridge";
|
|
17
|
+
import { NestAdapter } from "@labostack/typebridge/adapters";
|
|
18
|
+
import { UserController } from "./controllers";
|
|
19
|
+
|
|
20
|
+
export const api = await TypeBridge.create(NestAdapter, {
|
|
21
|
+
controllers: { UserController },
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Service B — calls Service A
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { TypeBridge } from "@labostack/typebridge";
|
|
29
|
+
import { GenericAdapter } from "@labostack/typebridge/adapters";
|
|
30
|
+
import type { api as UsersAPI } from "../service-a/node";
|
|
31
|
+
|
|
32
|
+
const api = await TypeBridge
|
|
33
|
+
.with<typeof UsersAPI>()
|
|
34
|
+
.create(GenericAdapter, {
|
|
35
|
+
controllers: "./controllers",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Fully typed — IDE autocomplete, args, return types
|
|
39
|
+
const user = await api.userController.findById("abc-123");
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Adapters
|
|
43
|
+
|
|
44
|
+
| Adapter | Framework |
|
|
45
|
+
|---------|-----------|
|
|
46
|
+
| `NestAdapter` | NestJS |
|
|
47
|
+
| `GenericAdapter` | Plain TypeScript |
|
|
48
|
+
| `TsedAdapter` | Ts.ED |
|
|
49
|
+
| `DeepkitAdapter` | Deepkit |
|
|
50
|
+
|
|
51
|
+
All from `@labostack/typebridge/adapters`.
|
|
52
|
+
|
|
53
|
+
## How it works
|
|
54
|
+
|
|
55
|
+
- **Discovery**: mDNS (local dev) + DNS (Docker/K8s)
|
|
56
|
+
- **Transport**: TCP with binary framing (MessagePack)
|
|
57
|
+
- **Typing**: `import type` + Proxy — zero codegen
|
|
58
|
+
- **Mesh**: Bidirectional — services call each other
|
|
59
|
+
|
|
60
|
+
## License
|
|
61
|
+
|
|
62
|
+
MIT
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
/**
|
|
3
|
+
* @Bridge() decorator — marks a class as a TypeBridge controller.
|
|
4
|
+
* Use this when your class name doesn't end with "Controller".
|
|
5
|
+
*/
|
|
6
|
+
export declare function Bridge(): ClassDecorator;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a class has the @Bridge() decorator.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hasBridgeDecorator(target: unknown): boolean;
|
|
11
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/adapters/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,wBAAgB,MAAM,IAAI,cAAc,CAIvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG3D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
const BRIDGE_METADATA_KEY = "typebridge:bridge";
|
|
3
|
+
/**
|
|
4
|
+
* @Bridge() decorator — marks a class as a TypeBridge controller.
|
|
5
|
+
* Use this when your class name doesn't end with "Controller".
|
|
6
|
+
*/
|
|
7
|
+
export function Bridge() {
|
|
8
|
+
return (target) => {
|
|
9
|
+
Reflect.defineMetadata(BRIDGE_METADATA_KEY, true, target);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if a class has the @Bridge() decorator.
|
|
14
|
+
*/
|
|
15
|
+
export function hasBridgeDecorator(target) {
|
|
16
|
+
if (typeof target !== "function")
|
|
17
|
+
return false;
|
|
18
|
+
return Reflect.hasMetadata(BRIDGE_METADATA_KEY, target) === true;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/adapters/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import type { FrameworkAdapter } from "../index.js";
|
|
3
|
+
/**
|
|
4
|
+
* DeepkitAdapter — adapter for Deepkit framework.
|
|
5
|
+
*
|
|
6
|
+
* Detects controllers by checking for Deepkit's http controller metadata.
|
|
7
|
+
* Deepkit uses `@http.controller()` decorator which stores metadata
|
|
8
|
+
* via `__type` reflection or Reflect.metadata.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DeepkitAdapter: FrameworkAdapter;
|
|
11
|
+
//# sourceMappingURL=deepkit-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepkit-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/deepkit-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAC;AAGtE;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,gBA8B5B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { extractMethodsFromPrototype } from "../index.js";
|
|
3
|
+
/**
|
|
4
|
+
* DeepkitAdapter — adapter for Deepkit framework.
|
|
5
|
+
*
|
|
6
|
+
* Detects controllers by checking for Deepkit's http controller metadata.
|
|
7
|
+
* Deepkit uses `@http.controller()` decorator which stores metadata
|
|
8
|
+
* via `__type` reflection or Reflect.metadata.
|
|
9
|
+
*/
|
|
10
|
+
export const DeepkitAdapter = {
|
|
11
|
+
name: "Deepkit",
|
|
12
|
+
isController(target) {
|
|
13
|
+
if (typeof target !== "function")
|
|
14
|
+
return false;
|
|
15
|
+
const t = target;
|
|
16
|
+
// Deepkit marks HTTP controllers with _httpController metadata
|
|
17
|
+
if (Reflect.hasMetadata("httpController", target))
|
|
18
|
+
return true;
|
|
19
|
+
// Deepkit's @http.controller() sets a static property
|
|
20
|
+
if (t._httpController !== undefined)
|
|
21
|
+
return true;
|
|
22
|
+
// Check for Deepkit's __type runtime reflection data
|
|
23
|
+
if (t.__type !== undefined) {
|
|
24
|
+
// If it has routes defined, it's a controller
|
|
25
|
+
const meta = Reflect.getMetadata("httpController", target);
|
|
26
|
+
if (meta)
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
},
|
|
31
|
+
extractMethods(controller) {
|
|
32
|
+
if (typeof controller !== "function")
|
|
33
|
+
return [];
|
|
34
|
+
const ctor = controller;
|
|
35
|
+
const name = ctor.name.charAt(0).toLowerCase() + ctor.name.slice(1);
|
|
36
|
+
return extractMethodsFromPrototype(name, ctor);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=deepkit-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepkit-adapter.js","sourceRoot":"","sources":["../../src/adapters/deepkit-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,IAAI,EAAE,SAAS;IAEf,YAAY,CAAC,MAAe;QAC1B,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,CAAC,GAAG,MAAa,CAAC;QAExB,+DAA+D;QAC/D,IAAI,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAE/D,sDAAsD;QACtD,IAAI,CAAC,CAAC,eAAe,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEjD,qDAAqD;QACrD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,8CAA8C;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc,CAAC,UAAmB;QAChC,IAAI,OAAO,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,UAAiD,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FrameworkAdapter } from "../index.js";
|
|
2
|
+
/**
|
|
3
|
+
* GenericAdapter — framework-agnostic adapter for plain TypeScript classes.
|
|
4
|
+
*
|
|
5
|
+
* Detects controllers by:
|
|
6
|
+
* 1. Class name ending with "Controller" (e.g., UserController)
|
|
7
|
+
* 2. Presence of @Bridge() decorator
|
|
8
|
+
*
|
|
9
|
+
* No framework dependency required.
|
|
10
|
+
*/
|
|
11
|
+
export declare const GenericAdapter: FrameworkAdapter;
|
|
12
|
+
//# sourceMappingURL=generic-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/generic-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,gBAe5B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { extractMethodsFromPrototype } from "../index.js";
|
|
2
|
+
import { hasBridgeDecorator } from "./decorators.js";
|
|
3
|
+
/**
|
|
4
|
+
* GenericAdapter — framework-agnostic adapter for plain TypeScript classes.
|
|
5
|
+
*
|
|
6
|
+
* Detects controllers by:
|
|
7
|
+
* 1. Class name ending with "Controller" (e.g., UserController)
|
|
8
|
+
* 2. Presence of @Bridge() decorator
|
|
9
|
+
*
|
|
10
|
+
* No framework dependency required.
|
|
11
|
+
*/
|
|
12
|
+
export const GenericAdapter = {
|
|
13
|
+
name: "Generic",
|
|
14
|
+
isController(target) {
|
|
15
|
+
if (typeof target !== "function")
|
|
16
|
+
return false;
|
|
17
|
+
const name = target.name;
|
|
18
|
+
return name.endsWith("Controller") || hasBridgeDecorator(target);
|
|
19
|
+
},
|
|
20
|
+
extractMethods(controller) {
|
|
21
|
+
if (typeof controller !== "function")
|
|
22
|
+
return [];
|
|
23
|
+
const ctor = controller;
|
|
24
|
+
const name = ctor.name.charAt(0).toLowerCase() + ctor.name.slice(1);
|
|
25
|
+
return extractMethodsFromPrototype(name, ctor);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=generic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-adapter.js","sourceRoot":"","sources":["../../src/adapters/generic-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,IAAI,EAAE,SAAS;IAEf,YAAY,CAAC,MAAe;QAC1B,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,IAAI,GAAI,MAAmB,CAAC,IAAI,CAAC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,cAAc,CAAC,UAAmB;QAChC,IAAI,OAAO,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,UAAiD,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import type { FrameworkAdapter } from "../index.js";
|
|
3
|
+
/**
|
|
4
|
+
* NestAdapter — adapter for NestJS framework.
|
|
5
|
+
*
|
|
6
|
+
* Detects controllers by checking for @Controller() decorator metadata.
|
|
7
|
+
* Extracts methods by inspecting the class prototype.
|
|
8
|
+
*
|
|
9
|
+
* Note: This adapter reads NestJS metadata but doesn't depend on the
|
|
10
|
+
* NestJS DI container. Controllers should be passed as instances
|
|
11
|
+
* (resolved from the container) via ServeOptions.controllers.
|
|
12
|
+
*/
|
|
13
|
+
export declare const NestAdapter: FrameworkAdapter;
|
|
14
|
+
//# sourceMappingURL=nest-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/nest-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAC;AAOtE;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,gBAkBzB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { extractMethodsFromPrototype } from "../index.js";
|
|
3
|
+
// NestJS metadata keys (from @nestjs/common)
|
|
4
|
+
const CONTROLLER_WATERMARK = "__controller__";
|
|
5
|
+
const PATH_METADATA = "path";
|
|
6
|
+
/**
|
|
7
|
+
* NestAdapter — adapter for NestJS framework.
|
|
8
|
+
*
|
|
9
|
+
* Detects controllers by checking for @Controller() decorator metadata.
|
|
10
|
+
* Extracts methods by inspecting the class prototype.
|
|
11
|
+
*
|
|
12
|
+
* Note: This adapter reads NestJS metadata but doesn't depend on the
|
|
13
|
+
* NestJS DI container. Controllers should be passed as instances
|
|
14
|
+
* (resolved from the container) via ServeOptions.controllers.
|
|
15
|
+
*/
|
|
16
|
+
export const NestAdapter = {
|
|
17
|
+
name: "NestJS",
|
|
18
|
+
isController(target) {
|
|
19
|
+
if (typeof target !== "function")
|
|
20
|
+
return false;
|
|
21
|
+
// Check for NestJS @Controller() decorator watermark
|
|
22
|
+
return (Reflect.hasMetadata(CONTROLLER_WATERMARK, target) ||
|
|
23
|
+
Reflect.hasMetadata(PATH_METADATA, target));
|
|
24
|
+
},
|
|
25
|
+
extractMethods(controller) {
|
|
26
|
+
if (typeof controller !== "function")
|
|
27
|
+
return [];
|
|
28
|
+
const ctor = controller;
|
|
29
|
+
const name = ctor.name.charAt(0).toLowerCase() + ctor.name.slice(1);
|
|
30
|
+
return extractMethodsFromPrototype(name, ctor);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=nest-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-adapter.js","sourceRoot":"","sources":["../../src/adapters/nest-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAC9C,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,QAAQ;IAEd,YAAY,CAAC,MAAe;QAC1B,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC/C,qDAAqD;QACrD,OAAO,CACL,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC;YACjD,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAC3C,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,UAAmB;QAChC,IAAI,OAAO,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,UAAiD,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import type { FrameworkAdapter } from "../index.js";
|
|
3
|
+
/**
|
|
4
|
+
* TsedAdapter — adapter for Ts.ED framework.
|
|
5
|
+
*
|
|
6
|
+
* Detects controllers by checking for @Controller() decorator metadata
|
|
7
|
+
* from @tsed/common. Extracts methods from the class prototype.
|
|
8
|
+
*/
|
|
9
|
+
export declare const TsedAdapter: FrameworkAdapter;
|
|
10
|
+
//# sourceMappingURL=tsed-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsed-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/tsed-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAC;AAOtE;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,gBAoBzB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { extractMethodsFromPrototype } from "../index.js";
|
|
3
|
+
// Ts.ED metadata keys (from @tsed/common)
|
|
4
|
+
const TSED_CONTROLLER_KEY = "tsed:controller";
|
|
5
|
+
const TSED_CONTROLLER_URL = "tsed:controller:url";
|
|
6
|
+
/**
|
|
7
|
+
* TsedAdapter — adapter for Ts.ED framework.
|
|
8
|
+
*
|
|
9
|
+
* Detects controllers by checking for @Controller() decorator metadata
|
|
10
|
+
* from @tsed/common. Extracts methods from the class prototype.
|
|
11
|
+
*/
|
|
12
|
+
export const TsedAdapter = {
|
|
13
|
+
name: "Ts.ED",
|
|
14
|
+
isController(target) {
|
|
15
|
+
if (typeof target !== "function")
|
|
16
|
+
return false;
|
|
17
|
+
// Check for Ts.ED @Controller() decorator metadata
|
|
18
|
+
return (Reflect.hasMetadata(TSED_CONTROLLER_KEY, target) ||
|
|
19
|
+
Reflect.hasMetadata(TSED_CONTROLLER_URL, target) ||
|
|
20
|
+
// Ts.ED v7+ uses "injectable:type" with value "controller"
|
|
21
|
+
Reflect.getMetadata("injectable:type", target) === "controller");
|
|
22
|
+
},
|
|
23
|
+
extractMethods(controller) {
|
|
24
|
+
if (typeof controller !== "function")
|
|
25
|
+
return [];
|
|
26
|
+
const ctor = controller;
|
|
27
|
+
const name = ctor.name.charAt(0).toLowerCase() + ctor.name.slice(1);
|
|
28
|
+
return extractMethodsFromPrototype(name, ctor);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=tsed-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsed-adapter.js","sourceRoot":"","sources":["../../src/adapters/tsed-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,0CAA0C;AAC1C,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,OAAO;IAEb,YAAY,CAAC,MAAe;QAC1B,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC/C,mDAAmD;QACnD,OAAO,CACL,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC;YAChD,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC;YAChD,2DAA2D;YAC3D,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,YAAY,CAChE,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,UAAmB;QAChC,IAAI,OAAO,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,UAAiD,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/autobarrel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autobarrel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FrameworkAdapter } from "../types/adapter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Scan a directory for controller classes.
|
|
4
|
+
*
|
|
5
|
+
* Recursively walks the directory, imports all .ts/.js files,
|
|
6
|
+
* and collects exports that the adapter recognizes as controllers
|
|
7
|
+
* (or whose name ends with "Controller").
|
|
8
|
+
*
|
|
9
|
+
* @param dirPath - Path to the controllers directory (relative or absolute)
|
|
10
|
+
* @param adapter - Framework adapter with isController() predicate
|
|
11
|
+
* @returns Object of discovered controller classes: { UserController, OrderController, ... }
|
|
12
|
+
*/
|
|
13
|
+
export declare function scanControllers(dirPath: string, adapter: FrameworkAdapter): Promise<Record<string, unknown>>;
|
|
14
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/autobarrel/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Scan a directory for controller classes.
|
|
6
|
+
*
|
|
7
|
+
* Recursively walks the directory, imports all .ts/.js files,
|
|
8
|
+
* and collects exports that the adapter recognizes as controllers
|
|
9
|
+
* (or whose name ends with "Controller").
|
|
10
|
+
*
|
|
11
|
+
* @param dirPath - Path to the controllers directory (relative or absolute)
|
|
12
|
+
* @param adapter - Framework adapter with isController() predicate
|
|
13
|
+
* @returns Object of discovered controller classes: { UserController, OrderController, ... }
|
|
14
|
+
*/
|
|
15
|
+
export async function scanControllers(dirPath, adapter) {
|
|
16
|
+
const absolutePath = resolve(process.cwd(), dirPath);
|
|
17
|
+
const controllers = {};
|
|
18
|
+
let files;
|
|
19
|
+
try {
|
|
20
|
+
files = await readdirRecursive(absolutePath);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
throw new Error(`[TypeBridge] Failed to scan controllers directory "${dirPath}": ${err.message}`);
|
|
24
|
+
}
|
|
25
|
+
for (const filePath of files) {
|
|
26
|
+
// Skip non-source files
|
|
27
|
+
if (!isSourceFile(filePath))
|
|
28
|
+
continue;
|
|
29
|
+
try {
|
|
30
|
+
// Dynamic import using file:// URL (required for ESM)
|
|
31
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
32
|
+
const mod = await import(fileUrl);
|
|
33
|
+
// Check all named exports
|
|
34
|
+
for (const [exportName, exportValue] of Object.entries(mod)) {
|
|
35
|
+
if (exportName === "default")
|
|
36
|
+
continue;
|
|
37
|
+
if (typeof exportValue !== "function")
|
|
38
|
+
continue;
|
|
39
|
+
// Check: adapter says it's a controller, OR name ends with "Controller"
|
|
40
|
+
const isController = adapter.isController(exportValue) ||
|
|
41
|
+
exportName.endsWith("Controller");
|
|
42
|
+
if (isController) {
|
|
43
|
+
controllers[exportName] = exportValue;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Skip files that fail to import (e.g., non-module files, syntax errors)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (Object.keys(controllers).length === 0) {
|
|
52
|
+
console.warn(`[TypeBridge] No controllers found in "${dirPath}". ` +
|
|
53
|
+
`Make sure controller class names end with "Controller" or use the @Bridge() decorator.`);
|
|
54
|
+
}
|
|
55
|
+
return controllers;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Recursively list all files in a directory.
|
|
59
|
+
*/
|
|
60
|
+
async function readdirRecursive(dir) {
|
|
61
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
62
|
+
const files = [];
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const fullPath = join(dir, entry.name);
|
|
65
|
+
if (entry.isDirectory()) {
|
|
66
|
+
const nested = await readdirRecursive(fullPath);
|
|
67
|
+
files.push(...nested);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
files.push(fullPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return files;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a file is a TypeScript/JavaScript source file we should import.
|
|
77
|
+
*/
|
|
78
|
+
function isSourceFile(filePath) {
|
|
79
|
+
// Include .ts, .js, .mts, .mjs
|
|
80
|
+
if (!filePath.endsWith(".ts") &&
|
|
81
|
+
!filePath.endsWith(".js") &&
|
|
82
|
+
!filePath.endsWith(".mts") &&
|
|
83
|
+
!filePath.endsWith(".mjs")) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Exclude declaration files, tests, specs
|
|
87
|
+
if (filePath.endsWith(".d.ts") || filePath.endsWith(".d.mts"))
|
|
88
|
+
return false;
|
|
89
|
+
if (filePath.includes(".test.") || filePath.includes(".spec."))
|
|
90
|
+
return false;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/autobarrel/scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { FrameworkAdapter } from "./types/adapter.js";
|
|
2
|
+
import type { NodeOptions, TypeBridgeAPI } from "./types/options.js";
|
|
3
|
+
/**
|
|
4
|
+
* TypeBridge — zero-ceremony RPC mesh for TypeScript microservices.
|
|
5
|
+
*
|
|
6
|
+
* One method: `TypeBridge.create()`. That's it.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { TypeBridge } from "@labostack/typebridge";
|
|
11
|
+
* import { NestAdapter } from "@labostack/typebridge/adapters";
|
|
12
|
+
* import { UserController } from "./controllers";
|
|
13
|
+
*
|
|
14
|
+
* const api = await TypeBridge.create(NestAdapter, {
|
|
15
|
+
* controllers: { UserController },
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // From another service — auto-discovered, auto-routed:
|
|
19
|
+
* // api.userController.findById("abc") — just works.
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class TypeBridge {
|
|
23
|
+
/**
|
|
24
|
+
* Declare remote peer types for full type inference.
|
|
25
|
+
*
|
|
26
|
+
* Returns a builder whose `.create()` merges remote controller types
|
|
27
|
+
* into the returned API. Zero runtime cost — pure type narrowing.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import type { api as UsersAPI } from "example-service-nest/node";
|
|
32
|
+
*
|
|
33
|
+
* const api = await TypeBridge
|
|
34
|
+
* .with<typeof UsersAPI>()
|
|
35
|
+
* .create(GenericAdapter, { controllers: { OrderController } });
|
|
36
|
+
*
|
|
37
|
+
* api.userController.findById("abc"); // ✅ typed (remote)
|
|
38
|
+
* api.orderController.create({...}); // ✅ typed (local)
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
static with<P>(): {
|
|
42
|
+
create: {
|
|
43
|
+
/** Object controllers — fully typed local + remote */
|
|
44
|
+
<C extends Record<string, unknown>>(adapter: FrameworkAdapter, options: NodeOptions<C>): Promise<TypeBridgeAPI<C> & Omit<P, "close" | "name" | "port" | "__controllers" | "__mesh">>;
|
|
45
|
+
/** Autobarrel — directory path */
|
|
46
|
+
(adapter: FrameworkAdapter, options: NodeOptions<string>): Promise<TypeBridgeAPI<Record<string, unknown>> & Omit<P, "close" | "name" | "port" | "__controllers" | "__mesh">>;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/** Object controllers — fully typed */
|
|
50
|
+
static create<C extends Record<string, unknown>>(adapter: FrameworkAdapter, options: NodeOptions<C>): Promise<TypeBridgeAPI<C>>;
|
|
51
|
+
/** Autobarrel — directory path, controllers discovered at runtime */
|
|
52
|
+
static create(adapter: FrameworkAdapter, options: NodeOptions<string>): Promise<TypeBridgeAPI<Record<string, unknown>>>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASrE;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAU;IACrB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC;gBAGoB;YAC3B,sDAAsD;YACtD,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,kEAAkB,CAAC,CAAC;YAC/C,kCAAkC;YAClC,CACE,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kEAAkB,CAAC,CAAC;SACtE;;IAIL,uCAAuC;WAC1B,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAE5B,qEAAqE;WACxD,MAAM,CACjB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAkGnD"}
|