@zdavison/nestjs-rpc-toolkit 0.0.11 → 0.0.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.
Files changed (61) hide show
  1. package/README.md +263 -0
  2. package/dist/bin/init.js +15 -2
  3. package/dist/bin/init.js.map +1 -1
  4. package/dist/decorators/rpc-controller.decorator.d.ts +32 -0
  5. package/dist/decorators/rpc-controller.decorator.d.ts.map +1 -1
  6. package/dist/decorators/rpc-controller.decorator.js +35 -0
  7. package/dist/decorators/rpc-controller.decorator.js.map +1 -1
  8. package/dist/decorators/rpc-method.decorator.d.ts +20 -0
  9. package/dist/decorators/rpc-method.decorator.d.ts.map +1 -1
  10. package/dist/decorators/rpc-method.decorator.js +26 -0
  11. package/dist/decorators/rpc-method.decorator.js.map +1 -1
  12. package/dist/generators/rpc-types-generator.d.ts +1 -1
  13. package/dist/generators/rpc-types-generator.d.ts.map +1 -1
  14. package/dist/generators/rpc-types-generator.js +74 -7
  15. package/dist/generators/rpc-types-generator.js.map +1 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +0 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/rpc/rpc-client.d.ts +3 -0
  21. package/dist/rpc/rpc-client.d.ts.map +1 -1
  22. package/dist/rpc/rpc-client.js +4 -1
  23. package/dist/rpc/rpc-client.js.map +1 -1
  24. package/dist/rpc/typed-message-bus.d.ts +11 -0
  25. package/dist/rpc/typed-message-bus.d.ts.map +1 -1
  26. package/dist/rpc/typed-message-bus.js +2 -1
  27. package/dist/rpc/typed-message-bus.js.map +1 -1
  28. package/dist/transport/{in-memory.client.d.ts → in-process.client.d.ts} +2 -2
  29. package/dist/transport/in-process.client.d.ts.map +1 -0
  30. package/dist/transport/{in-memory.client.js → in-process.client.js} +8 -7
  31. package/dist/transport/in-process.client.js.map +1 -0
  32. package/dist/transport/{in-memory.transport.d.ts → in-process.transport.d.ts} +3 -3
  33. package/dist/transport/in-process.transport.d.ts.map +1 -0
  34. package/dist/transport/{in-memory.transport.js → in-process.transport.js} +10 -7
  35. package/dist/transport/in-process.transport.js.map +1 -0
  36. package/dist/transport/index.d.ts +2 -2
  37. package/dist/transport/index.d.ts.map +1 -1
  38. package/dist/transport/index.js +2 -2
  39. package/dist/transport/index.js.map +1 -1
  40. package/dist/types/serializable.d.ts +21 -1
  41. package/dist/types/serializable.d.ts.map +1 -1
  42. package/dist/types/serializable.js +4 -0
  43. package/dist/types/serializable.js.map +1 -1
  44. package/package.json +1 -1
  45. package/dist/module-base/index.d.ts +0 -15
  46. package/dist/module-base/index.d.ts.map +0 -1
  47. package/dist/module-base/index.js +0 -38
  48. package/dist/module-base/index.js.map +0 -1
  49. package/dist/test-date-serialization.d.ts +0 -2
  50. package/dist/test-date-serialization.d.ts.map +0 -1
  51. package/dist/test-date-serialization.js +0 -12
  52. package/dist/test-date-serialization.js.map +0 -1
  53. package/dist/test-type-validation.d.ts +0 -2
  54. package/dist/test-type-validation.d.ts.map +0 -1
  55. package/dist/test-type-validation.js +0 -87
  56. package/dist/test-type-validation.js.map +0 -1
  57. package/dist/transport/in-memory.client.d.ts.map +0 -1
  58. package/dist/transport/in-memory.client.js.map +0 -1
  59. package/dist/transport/in-memory.transport.d.ts.map +0 -1
  60. package/dist/transport/in-memory.transport.js.map +0 -1
  61. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,17 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InMemoryClientProxy = void 0;
3
+ exports.InProcessClientProxy = void 0;
4
4
  const microservices_1 = require("@nestjs/microservices");
5
- const in_memory_transport_1 = require("./in-memory.transport");
6
- class InMemoryClientProxy extends microservices_1.ClientProxy {
5
+ const in_process_transport_1 = require("./in-process.transport");
6
+ class InProcessClientProxy extends microservices_1.ClientProxy {
7
7
  constructor() {
8
8
  super(...arguments);
9
- this.transport = in_memory_transport_1.InMemoryTransportStrategy.getInstance();
9
+ this.transport = in_process_transport_1.InProcessTransportStrategy.getInstance();
10
10
  }
11
11
  async connect() {
12
12
  return Promise.resolve();
13
13
  }
14
14
  close() {
15
+ // Nothing to close for in-memory transport
15
16
  }
16
17
  async dispatchEvent(packet) {
17
18
  const { pattern, data } = packet;
@@ -27,8 +28,8 @@ class InMemoryClientProxy extends microservices_1.ClientProxy {
27
28
  .catch(error => {
28
29
  callback({ err: error });
29
30
  });
30
- return () => { };
31
+ return () => { }; // Return cleanup function (no-op for in-memory)
31
32
  }
32
33
  }
33
- exports.InMemoryClientProxy = InMemoryClientProxy;
34
- //# sourceMappingURL=in-memory.client.js.map
34
+ exports.InProcessClientProxy = InProcessClientProxy;
35
+ //# sourceMappingURL=in-process.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process.client.js","sourceRoot":"","sources":["../../src/transport/in-process.client.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAC7E,iEAAoE;AAEpE,MAAa,oBAAqB,SAAQ,2BAAW;IAArD;;QACU,cAAS,GAAG,iDAA0B,CAAC,WAAW,EAAE,CAAC;IA6B/D,CAAC;IA3BC,KAAK,CAAC,OAAO;QACX,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,2CAA2C;IAC7C,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,MAAkB;QAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAiB,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO,CAAC,MAAkB,EAAE,QAAuC;QAC3E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAiB,EAAE,IAAI,CAAC;aAChD,IAAI,CAAC,MAAM,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,gDAAgD;IACnE,CAAC;CACF;AA9BD,oDA8BC"}
@@ -1,7 +1,7 @@
1
1
  import { CustomTransportStrategy, Server, ReadPacket, BaseRpcContext } from '@nestjs/microservices';
2
- export declare class InMemoryTransportStrategy extends Server implements CustomTransportStrategy {
2
+ export declare class InProcessTransportStrategy extends Server implements CustomTransportStrategy {
3
3
  private static instance;
4
- static getInstance(): InMemoryTransportStrategy;
4
+ static getInstance(): InProcessTransportStrategy;
5
5
  listen(callback: () => void): void;
6
6
  close(): void;
7
7
  handleMessage(pattern: string, packet: ReadPacket, context: BaseRpcContext): Promise<any>;
@@ -9,4 +9,4 @@ export declare class InMemoryTransportStrategy extends Server implements CustomT
9
9
  sendMessage(pattern: string, data: any): Promise<any>;
10
10
  emitEvent(pattern: string, data: any): void;
11
11
  }
12
- //# sourceMappingURL=in-memory.transport.d.ts.map
12
+ //# sourceMappingURL=in-process.transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process.transport.d.ts","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpG,qBAAa,0BAA2B,SAAQ,MAAO,YAAW,uBAAuB;IACvF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,MAAM,CAAC,WAAW,IAAI,0BAA0B;IAOhD,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAIP,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAST,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAYT,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAO3D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;CAK5C"}
@@ -1,18 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InMemoryTransportStrategy = void 0;
3
+ exports.InProcessTransportStrategy = void 0;
4
4
  const microservices_1 = require("@nestjs/microservices");
5
- class InMemoryTransportStrategy extends microservices_1.Server {
5
+ class InProcessTransportStrategy extends microservices_1.Server {
6
6
  static getInstance() {
7
- if (!InMemoryTransportStrategy.instance) {
8
- InMemoryTransportStrategy.instance = new InMemoryTransportStrategy();
7
+ if (!InProcessTransportStrategy.instance) {
8
+ InProcessTransportStrategy.instance = new InProcessTransportStrategy();
9
9
  }
10
- return InMemoryTransportStrategy.instance;
10
+ return InProcessTransportStrategy.instance;
11
11
  }
12
12
  listen(callback) {
13
13
  callback();
14
14
  }
15
15
  close() {
16
+ // Clean up if needed
16
17
  }
17
18
  async handleMessage(pattern, packet, context) {
18
19
  const handler = this.getHandlerByPattern(pattern);
@@ -32,16 +33,18 @@ class InMemoryTransportStrategy extends microservices_1.Server {
32
33
  }
33
34
  }
34
35
  }
36
+ // Internal method to send messages
35
37
  async sendMessage(pattern, data) {
36
38
  const packet = { pattern, data };
37
39
  const context = new microservices_1.BaseRpcContext([]);
38
40
  return await this.handleMessage(pattern, packet, context);
39
41
  }
42
+ // Internal method to emit events
40
43
  emitEvent(pattern, data) {
41
44
  const packet = { pattern, data };
42
45
  const context = new microservices_1.BaseRpcContext([]);
43
46
  this.handleEvent(pattern, packet, context);
44
47
  }
45
48
  }
46
- exports.InMemoryTransportStrategy = InMemoryTransportStrategy;
47
- //# sourceMappingURL=in-memory.transport.js.map
49
+ exports.InProcessTransportStrategy = InProcessTransportStrategy;
50
+ //# sourceMappingURL=in-process.transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process.transport.js","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":";;;AAAA,yDAAoG;AAEpG,MAAa,0BAA2B,SAAQ,sBAAM;IAGpD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,CAAC;YACzC,0BAA0B,CAAC,QAAQ,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,0BAA0B,CAAC,QAAQ,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,QAAoB;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,KAAK;QACH,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAS;QAC1C,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,OAAe,EAAE,IAAS;QAClC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AA3DD,gEA2DC"}
@@ -1,3 +1,3 @@
1
- export * from './in-memory.transport';
2
- export * from './in-memory.client';
1
+ export * from './in-process.transport';
2
+ export * from './in-process.client';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./in-memory.transport"), exports);
18
- __exportStar(require("./in-memory.client"), exports);
17
+ __exportStar(require("./in-process.transport"), exports);
18
+ __exportStar(require("./in-process.client"), exports);
19
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,sDAAoC"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Type utilities for ensuring JSON serialization compatibility in RPC methods.
3
+ * These types help catch non-serializable types at compile time.
4
+ */
1
5
  type JsonPrimitive = string | number | boolean | null | Date;
2
6
  export type SerializableJson = JsonPrimitive | SerializableJsonObject | SerializableJsonArray;
3
7
  interface SerializableJsonObject {
@@ -5,11 +9,27 @@ interface SerializableJsonObject {
5
9
  }
6
10
  interface SerializableJsonArray extends Array<SerializableJson> {
7
11
  }
12
+ /**
13
+ * Helper type to check if a type is serializable.
14
+ * This creates compile-time errors for non-serializable types.
15
+ */
8
16
  export type AssertSerializable<T> = T extends SerializableJson ? T : never;
17
+ /**
18
+ * Utility type that extracts parameters from a function type
19
+ * and ensures they are all serializable
20
+ */
9
21
  export type SerializableParameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? {
10
22
  [K in keyof P]: AssertSerializable<P[K]>;
11
23
  } : never;
24
+ /**
25
+ * Utility type that extracts the return type from a function
26
+ * and ensures it's serializable (excluding Promise wrapper)
27
+ */
12
28
  export type SerializableReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => Promise<infer R> ? AssertSerializable<R> : T extends (...args: any[]) => infer R ? AssertSerializable<R> : never;
13
- export type SerializableRpcMethod<T extends (...args: any[]) => any> = (...args: SerializableParameters<T>) => T extends (...args: any[]) => Promise<infer R> ? Promise<SerializableReturnType<T>> : SerializableReturnType<T>;
29
+ /**
30
+ * Complete validation type for RPC methods.
31
+ * Ensures both parameters and return type are serializable.
32
+ */
33
+ export type SerializableRpcMethod<T extends (...args: any[]) => any> = (...args: SerializableParameters<T>) => T extends (...args: any[]) => Promise<any> ? Promise<SerializableReturnType<T>> : SerializableReturnType<T>;
14
34
  export {};
15
35
  //# sourceMappingURL=serializable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":"AAMA,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAG7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAE9F,UAAU,sBAAsB;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAED,UAAU,qBAAsB,SAAQ,KAAK,CAAC,gBAAgB,CAAC;CAAG;AAMlE,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC;AAM3E,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,GAAG,GACJ;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC5C,KAAK,CAAC;AAMV,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC,GACjB,kBAAkB,CAAC,CAAC,CAAC,GACrB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GACrC,kBAAkB,CAAC,CAAC,CAAC,GACrB,KAAK,CAAC;AAMV,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CACrE,GAAG,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAC/B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC/C,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAClC,sBAAsB,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAG7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAE9F,UAAU,sBAAsB;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAED,UAAU,qBAAsB,SAAQ,KAAK,CAAC,gBAAgB,CAAC;CAAG;AAElE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,GAAG,GACJ;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC5C,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC,GACjB,kBAAkB,CAAC,CAAC,CAAC,GACrB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GACrC,kBAAkB,CAAC,CAAC,CAAC,GACrB,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CACrE,GAAG,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAC/B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAClC,sBAAsB,CAAC,CAAC,CAAC,CAAC"}
@@ -1,3 +1,7 @@
1
1
  "use strict";
2
+ /**
3
+ * Type utilities for ensuring JSON serialization compatibility in RPC methods.
4
+ * These types help catch non-serializable types at compile time.
5
+ */
2
6
  Object.defineProperty(exports, "__esModule", { value: true });
3
7
  //# sourceMappingURL=serializable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializable.js","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"serializable.js","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zdavison/nestjs-rpc-toolkit",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "Toolkit for type-safe RPC calls in NestJS monorepos.",
5
5
  "private": false,
6
6
  "main": "dist/index.js",
@@ -1,15 +0,0 @@
1
- import { DynamicModule, Type } from '@nestjs/common';
2
- export interface ModularModuleMetadata {
3
- name: string;
4
- version: string;
5
- dependencies?: string[];
6
- }
7
- export declare function ModularModuleDecorator(metadata: ModularModuleMetadata): ClassDecorator;
8
- export interface ModularModuleOptions {
9
- imports?: Array<Type<any> | DynamicModule>;
10
- providers?: any[];
11
- exports?: any[];
12
- controllers?: Type<any>[];
13
- }
14
- export declare function createModularModule(name: string, version: string, options?: ModularModuleOptions): DynamicModule;
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/module-base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,cAAc,CAKtF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IAC3C,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAiBf"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ModularModuleDecorator = ModularModuleDecorator;
10
- exports.createModularModule = createModularModule;
11
- const common_1 = require("@nestjs/common");
12
- function ModularModuleDecorator(metadata) {
13
- return (target) => {
14
- Reflect.defineMetadata('modular:module', metadata, target);
15
- return target;
16
- };
17
- }
18
- function createModularModule(name, version, options = {}) {
19
- let ModularModuleClass = class ModularModuleClass {
20
- };
21
- ModularModuleClass = __decorate([
22
- (0, common_1.Module)({})
23
- ], ModularModuleClass);
24
- return {
25
- module: ModularModuleClass,
26
- imports: options.imports || [],
27
- providers: [
28
- ...(options.providers || []),
29
- {
30
- provide: 'MODULE_INFO',
31
- useValue: { name, version },
32
- },
33
- ],
34
- exports: options.exports || [],
35
- controllers: options.controllers || [],
36
- };
37
- }
38
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/module-base/index.ts"],"names":[],"mappings":";;;;;;;;AAQA,wDAKC;AASD,kDAqBC;AA3CD,2CAA6D;AAQ7D,SAAgB,sBAAsB,CAAC,QAA+B;IACpE,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AASD,SAAgB,mBAAmB,CACjC,IAAY,EACZ,OAAe,EACf,UAAgC,EAAE;IAGlC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;KAAG,CAAA;IAArB,kBAAkB;QADvB,IAAA,eAAM,EAAC,EAAE,CAAC;OACL,kBAAkB,CAAG;IAE3B,OAAO;QACL,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,SAAS,EAAE;YACT,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;YAC5B;gBACE,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aAC5B;SACF;QACD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;KACvC,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-date-serialization.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-date-serialization.d.ts","sourceRoot":"","sources":["../src/test-date-serialization.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const validDate = new Date();
4
- const validUser = {
5
- id: 'user123',
6
- name: 'John Doe',
7
- createdAt: new Date(),
8
- updatedAt: new Date()
9
- };
10
- const invalidFunction = () => { };
11
- const invalidMap = new Map();
12
- //# sourceMappingURL=test-date-serialization.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-date-serialization.js","sourceRoot":"","sources":["../src/test-date-serialization.ts"],"names":[],"mappings":";;AAOA,MAAM,SAAS,GAAqB,IAAI,IAAI,EAAE,CAAC;AAC/C,MAAM,SAAS,GAAqB;IAClC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,IAAI,IAAI,EAAE;IACrB,SAAS,EAAE,IAAI,IAAI,EAAE;CACtB,CAAC;AAGF,MAAM,eAAe,GAAqB,GAAG,EAAE,GAAE,CAAC,CAAC;AACnD,MAAM,UAAU,GAAqB,IAAI,GAAG,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-type-validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-type-validation.d.ts","sourceRoot":"","sources":["../src/test-type-validation.ts"],"names":[],"mappings":""}
@@ -1,87 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const rpc_method_decorator_1 = require("./decorators/rpc-method.decorator");
13
- class TestController {
14
- validMethod(id, count) {
15
- return Promise.resolve({ result: 'success' });
16
- }
17
- validArrayMethod(items, metadata) {
18
- return Promise.resolve(true);
19
- }
20
- validNullMethod(id) {
21
- return Promise.resolve(null);
22
- }
23
- invalidFunctionParam(callback) {
24
- return Promise.resolve();
25
- }
26
- invalidHtmlReturn(id) {
27
- return Promise.resolve(document.createElement('div'));
28
- }
29
- invalidMapParam(data) {
30
- return Promise.resolve('test');
31
- }
32
- invalidUndefinedReturn(id) {
33
- return Promise.resolve(undefined);
34
- }
35
- invalidClassParam(date) {
36
- return Promise.resolve('test');
37
- }
38
- }
39
- __decorate([
40
- (0, rpc_method_decorator_1.RpcMethod)(),
41
- __metadata("design:type", Function),
42
- __metadata("design:paramtypes", [String, Number]),
43
- __metadata("design:returntype", Promise)
44
- ], TestController.prototype, "validMethod", null);
45
- __decorate([
46
- (0, rpc_method_decorator_1.RpcMethod)(),
47
- __metadata("design:type", Function),
48
- __metadata("design:paramtypes", [Array, Object]),
49
- __metadata("design:returntype", Promise)
50
- ], TestController.prototype, "validArrayMethod", null);
51
- __decorate([
52
- (0, rpc_method_decorator_1.RpcMethod)(),
53
- __metadata("design:type", Function),
54
- __metadata("design:paramtypes", [String]),
55
- __metadata("design:returntype", Promise)
56
- ], TestController.prototype, "validNullMethod", null);
57
- __decorate([
58
- (0, rpc_method_decorator_1.RpcMethod)(),
59
- __metadata("design:type", Function),
60
- __metadata("design:paramtypes", [Function]),
61
- __metadata("design:returntype", Promise)
62
- ], TestController.prototype, "invalidFunctionParam", null);
63
- __decorate([
64
- (0, rpc_method_decorator_1.RpcMethod)(),
65
- __metadata("design:type", Function),
66
- __metadata("design:paramtypes", [String]),
67
- __metadata("design:returntype", Promise)
68
- ], TestController.prototype, "invalidHtmlReturn", null);
69
- __decorate([
70
- (0, rpc_method_decorator_1.RpcMethod)(),
71
- __metadata("design:type", Function),
72
- __metadata("design:paramtypes", [Map]),
73
- __metadata("design:returntype", Promise)
74
- ], TestController.prototype, "invalidMapParam", null);
75
- __decorate([
76
- (0, rpc_method_decorator_1.RpcMethod)(),
77
- __metadata("design:type", Function),
78
- __metadata("design:paramtypes", [String]),
79
- __metadata("design:returntype", Promise)
80
- ], TestController.prototype, "invalidUndefinedReturn", null);
81
- __decorate([
82
- (0, rpc_method_decorator_1.RpcMethod)(),
83
- __metadata("design:type", Function),
84
- __metadata("design:paramtypes", [Date]),
85
- __metadata("design:returntype", Promise)
86
- ], TestController.prototype, "invalidClassParam", null);
87
- //# sourceMappingURL=test-type-validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-type-validation.js","sourceRoot":"","sources":["../src/test-type-validation.ts"],"names":[],"mappings":";;;;;;;;;;;AAKA,4EAA8D;AAE9D,MAAM,cAAc;IAGlB,WAAW,CAAC,EAAU,EAAE,KAAa;QACnC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;IAID,gBAAgB,CAAC,KAAe,EAAE,QAAmC;QACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAID,eAAe,CAAC,EAAU;QACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAID,oBAAoB,CAAC,QAAgC;QACnD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAID,iBAAiB,CAAC,EAAU;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAID,eAAe,CAAC,IAAyB;QACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAID,sBAAsB,CAAC,EAAU;QAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAID,iBAAiB,CAAC,IAAU;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;CACF;AA7CC;IADC,IAAA,gCAAS,GAAE;;;;iDAGX;AAID;IADC,IAAA,gCAAS,GAAE;;;;sDAGX;AAID;IADC,IAAA,gCAAS,GAAE;;;;qDAGX;AAID;IADC,IAAA,gCAAS,GAAE;;;;0DAGX;AAID;IADC,IAAA,gCAAS,GAAE;;;;uDAGX;AAID;IADC,IAAA,gCAAS,GAAE;;qCACU,GAAG;;qDAExB;AAID;IADC,IAAA,gCAAS,GAAE;;;;4DAGX;AAID;IADC,IAAA,gCAAS,GAAE;;qCACY,IAAI;;uDAE3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory.client.d.ts","sourceRoot":"","sources":["../../src/transport/in-memory.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG7E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,SAAS,CAA2C;IAEtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,KAAK,IAAI,IAAI;cAIG,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAM/D,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;CAa3F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory.client.js","sourceRoot":"","sources":["../../src/transport/in-memory.client.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAC7E,+DAAkE;AAElE,MAAa,mBAAoB,SAAQ,2BAAW;IAApD;;QACU,cAAS,GAAG,+CAAyB,CAAC,WAAW,EAAE,CAAC;IA6B9D,CAAC;IA3BC,KAAK,CAAC,OAAO;QACX,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;IAEL,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,MAAkB;QAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAiB,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO,CAAC,MAAkB,EAAE,QAAuC;QAC3E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAiB,EAAE,IAAI,CAAC;aAChD,IAAI,CAAC,MAAM,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;CACF;AA9BD,kDA8BC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory.transport.d.ts","sourceRoot":"","sources":["../../src/transport/in-memory.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpG,qBAAa,yBAA0B,SAAQ,MAAO,YAAW,uBAAuB;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IAEnD,MAAM,CAAC,WAAW,IAAI,yBAAyB;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAIP,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAST,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAYT,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAO3D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;CAK5C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory.transport.js","sourceRoot":"","sources":["../../src/transport/in-memory.transport.ts"],"names":[],"mappings":";;;AAAA,yDAAoG;AAEpG,MAAa,yBAA0B,SAAQ,sBAAM;IAGnD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,CAAC;YACxC,yBAAyB,CAAC,QAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,yBAAyB,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,QAAoB;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,KAAK;IAEL,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAS;QAC1C,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAGD,SAAS,CAAC,OAAe,EAAE,IAAS;QAClC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AA3DD,8DA2DC"}