@wabot-dev/framework 0.9.1 → 0.9.5

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 (84) hide show
  1. package/dist/src/addon/async/in-memory/InMemoryCronJobRepository.js +45 -0
  2. package/dist/src/addon/async/in-memory/InMemoryJobRepository.js +75 -0
  3. package/dist/src/addon/async/in-memory/index.js +2 -0
  4. package/dist/src/addon/async/pg/PgCronJobRepository.js +7 -5
  5. package/dist/src/addon/async/pg/PgJobRepository.js +8 -5
  6. package/dist/src/addon/async/pg/PgTransactionAdapter.js +25 -0
  7. package/dist/src/addon/async/pg/index.js +3 -0
  8. package/dist/src/addon/auth/api-key/ApiKey.js +4 -4
  9. package/dist/src/addon/auth/api-key/PgApiKeyRepository.js +9 -8
  10. package/dist/src/addon/auth/jwt/JwtRefreshToken.js +4 -4
  11. package/dist/src/addon/auth/jwt/PgJwtRefreshTokenRepository.js +6 -5
  12. package/dist/src/addon/chat-bot/{ram/RamChatMemory.js → in-memory/InMemoryChatMemory.js} +2 -2
  13. package/dist/src/addon/chat-bot/{ram/RamChatRepository.js → in-memory/InMemoryChatRepository.js} +6 -6
  14. package/dist/src/addon/chat-bot/in-memory/index.js +2 -0
  15. package/dist/src/addon/chat-bot/pg/PgChatMemory.js +8 -7
  16. package/dist/src/addon/chat-bot/pg/PgChatRepository.js +7 -6
  17. package/dist/src/addon/chat-bot/pg/index.js +2 -0
  18. package/dist/src/addon/chat-controller/cmd/@cmd.js +7 -2
  19. package/dist/src/addon/chat-controller/cmd/CmdChannel.js +85 -61
  20. package/dist/src/addon/chat-controller/cmd/CmdChannelConfig.js +8 -0
  21. package/dist/src/addon/chat-controller/cmd/CmdChannelServer.js +169 -0
  22. package/dist/src/addon/chat-controller/cmd/cmdChannelSocketPath.js +16 -0
  23. package/dist/src/addon/chat-controller/cmd/runCmdClient.js +226 -0
  24. package/dist/src/addon/chat-controller/socket/@socket.js +3 -1
  25. package/dist/src/addon/chat-controller/socket/SocketChannelConfig.js +4 -4
  26. package/dist/src/addon/chat-controller/whatsapp/WhatsAppSender.js +2 -72
  27. package/dist/src/addon/chat-controller/whatsapp/{WhatsAppReceiver.js → cloud-api/WhatsAppApiReceiver.js} +2 -2
  28. package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppApiSender.js +67 -0
  29. package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppReceiverByCloudApi.js +5 -7
  30. package/dist/src/addon/chat-controller/whatsapp/wasender/@wasender.js +23 -0
  31. package/dist/src/addon/chat-controller/{wasender/WhatsAppByWasenderChannel.js → whatsapp/wasender/WasenderChannel.js} +20 -20
  32. package/dist/src/addon/chat-controller/{wasender/WhatsAppByWasenderChannelConfig.js → whatsapp/wasender/WasenderChannelConfig.js} +3 -3
  33. package/dist/src/addon/chat-controller/whatsapp/wasender/WasenderChannelName.js +3 -0
  34. package/dist/src/addon/chat-controller/{wasender/WhatsAppReceiverByWasender.js → whatsapp/wasender/WasenderReceiver.js} +7 -7
  35. package/dist/src/addon/chat-controller/{wasender/WhatsAppSenderByWasender.js → whatsapp/wasender/WasenderSender.js} +8 -5
  36. package/dist/src/addon/chat-controller/{wasender → whatsapp/wasender}/WasenderWebhookController.js +4 -4
  37. package/dist/src/addon/lock/InMemoryLockKey.js +45 -0
  38. package/dist/src/addon/lock/InMemoryLocker.js +15 -0
  39. package/dist/src/addon/lock/index.js +2 -0
  40. package/dist/src/core/repository/CrudRepository.js +25 -0
  41. package/dist/src/feature/async/{@cron.js → @cronHandler.js} +2 -2
  42. package/dist/src/feature/async/@transaction.js +22 -0
  43. package/dist/src/feature/async/AsyncMetadataStore.js +6 -0
  44. package/dist/src/feature/async/TransactionMetadataStore.js +28 -0
  45. package/dist/src/feature/chat-controller/metadata/ControllerMetadataStore.js +3 -0
  46. package/dist/src/feature/pg/@pgExtension.js +33 -0
  47. package/dist/src/feature/pg/PgJsonRepositoryAdapter.js +50 -0
  48. package/dist/src/feature/pg/index.js +10 -0
  49. package/dist/src/feature/project-runner/ProjectRunner.js +276 -0
  50. package/dist/src/feature/repository/@memoryExtension.js +29 -0
  51. package/dist/src/feature/repository/@query.js +22 -0
  52. package/dist/src/feature/repository/@queryExtension.js +21 -0
  53. package/dist/src/feature/repository/@repository.js +170 -0
  54. package/dist/src/feature/repository/MemoryRepositoryAdapter.js +110 -0
  55. package/dist/src/feature/repository/RepositoryAdapterRegistry.js +27 -0
  56. package/dist/src/feature/repository/RepositoryMetadataStore.js +102 -0
  57. package/dist/src/feature/repository/evaluateQueryAst.js +134 -0
  58. package/dist/src/feature/rest-controller/metadata/RestControllerMetadataStore.js +3 -0
  59. package/dist/src/feature/socket-controller/metadata/SocketControllerMetadataStore.js +3 -0
  60. package/dist/src/index.d.ts +377 -298
  61. package/dist/src/index.js +40 -34
  62. package/package.json +9 -7
  63. package/dist/src/addon/chat-controller/wasender/@whatsAppByWasender.js +0 -20
  64. package/dist/src/addon/chat-controller/wasender/whatsAppByWasenderChannelName.js +0 -3
  65. package/dist/src/addon/chat-controller/whatsapp/@whatsApp.js +0 -20
  66. package/dist/src/addon/chat-controller/whatsapp/EnvWhatsAppRepository.js +0 -49
  67. package/dist/src/addon/chat-controller/whatsapp/PgWhatsAppRepository.js +0 -48
  68. package/dist/src/addon/chat-controller/whatsapp/WhatsApp.js +0 -30
  69. package/dist/src/addon/chat-controller/whatsapp/WhatsAppChannel.js +0 -58
  70. package/dist/src/addon/chat-controller/whatsapp/WhatsAppChannelConfig.js +0 -8
  71. package/dist/src/addon/chat-controller/whatsapp/WhatsAppRepository.js +0 -10
  72. package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppSenderByCloudApi.js +0 -133
  73. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppProxyContracts.js +0 -5
  74. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppReceiverByWabotProxy.js +0 -67
  75. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppSenderByWabotProxy.js +0 -63
  76. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppWabotProxyConnection.js +0 -45
  77. package/dist/src/feature/pg/query/@pgJsonRepository.js +0 -73
  78. package/dist/src/feature/pg/query/@query.js +0 -14
  79. package/dist/src/feature/pg/query/PgJsonRepository.js +0 -23
  80. package/dist/src/feature/pg/query/PgRepositoryMetadataStore.js +0 -44
  81. /package/dist/src/addon/chat-controller/whatsapp/{whatsAppChannelName.js → cloud-api/whatsAppChannelName.js} +0 -0
  82. /package/dist/src/addon/chat-controller/{wasender → whatsapp/wasender}/extractNumberFromWasenderKey.js +0 -0
  83. /package/dist/src/feature/pg/{query/buildQuerySql.js → buildQuerySql.js} +0 -0
  84. /package/dist/src/feature/{pg/query → repository}/parseQueryMethodName.js +0 -0
@@ -0,0 +1,102 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../core/injection/index.js';
3
+
4
+ let RepositoryMetadataStore = class RepositoryMetadataStore {
5
+ queryMethods = new Map();
6
+ extensionMethods = new Map();
7
+ repositoryConfigs = new Map();
8
+ extensions = new Map();
9
+ saveQueryMethodMetadata(metadata) {
10
+ let perClass = this.queryMethods.get(metadata.repositoryConstructor);
11
+ if (!perClass) {
12
+ perClass = new Map();
13
+ this.queryMethods.set(metadata.repositoryConstructor, perClass);
14
+ }
15
+ perClass.set(metadata.functionName, metadata);
16
+ }
17
+ saveExtensionMethodMetadata(metadata) {
18
+ let perClass = this.extensionMethods.get(metadata.repositoryConstructor);
19
+ if (!perClass) {
20
+ perClass = new Map();
21
+ this.extensionMethods.set(metadata.repositoryConstructor, perClass);
22
+ }
23
+ perClass.set(metadata.functionName, metadata);
24
+ }
25
+ saveRepositoryConfig(ctor, config) {
26
+ this.repositoryConfigs.set(ctor, config);
27
+ }
28
+ getRepositoryConfig(ctor) {
29
+ return this.repositoryConfigs.get(ctor);
30
+ }
31
+ getQueryMethods(ctor) {
32
+ return this.collectMethodsFromHierarchy(ctor, this.queryMethods);
33
+ }
34
+ getExtensionMethods(ctor) {
35
+ return this.collectMethodsFromHierarchy(ctor, this.extensionMethods);
36
+ }
37
+ collectMethodsFromHierarchy(ctor, source) {
38
+ const collected = new Map();
39
+ const hierarchy = [];
40
+ let proto = ctor.prototype;
41
+ while (proto && proto.constructor !== Object) {
42
+ hierarchy.unshift(proto.constructor);
43
+ proto = Object.getPrototypeOf(proto);
44
+ }
45
+ for (const cls of hierarchy) {
46
+ const perClass = source.get(cls);
47
+ if (perClass) {
48
+ for (const [name, meta] of perClass) {
49
+ collected.set(name, meta);
50
+ }
51
+ }
52
+ }
53
+ return [...collected.values()];
54
+ }
55
+ saveExtension(repositoryConstructor, adapterId, extensionConstructor) {
56
+ let perRepo = this.extensions.get(repositoryConstructor);
57
+ if (!perRepo) {
58
+ perRepo = new Map();
59
+ this.extensions.set(repositoryConstructor, perRepo);
60
+ }
61
+ const existing = perRepo.get(adapterId);
62
+ if (existing && existing !== extensionConstructor) {
63
+ throw new Error(`Extension conflict on ${repositoryConstructor.name}: ` +
64
+ `adapter "${adapterId.description ?? 'unknown'}" already has ` +
65
+ `extension ${existing.name}; cannot register ${extensionConstructor.name}.`);
66
+ }
67
+ perRepo.set(adapterId, extensionConstructor);
68
+ }
69
+ getExtension(ctor, adapterId) {
70
+ let proto = ctor.prototype;
71
+ while (proto && proto.constructor !== Object) {
72
+ const perRepo = this.extensions.get(proto.constructor);
73
+ if (perRepo) {
74
+ const ext = perRepo.get(adapterId);
75
+ if (ext)
76
+ return ext;
77
+ }
78
+ proto = Object.getPrototypeOf(proto);
79
+ }
80
+ return undefined;
81
+ }
82
+ validateExtensionsRegistered(adapterId) {
83
+ const offenders = [];
84
+ for (const ctor of this.extensionMethods.keys()) {
85
+ if (!this.getExtension(ctor, adapterId)) {
86
+ offenders.push(ctor.name);
87
+ }
88
+ }
89
+ if (offenders.length === 0)
90
+ return;
91
+ throw new Error(`Repository extension wiring error: the following repositories declare ` +
92
+ `@queryExtension methods but no extension is registered for adapter ` +
93
+ `"${adapterId.description ?? 'unknown'}":\n - ${offenders.join('\n - ')}\n` +
94
+ `Did you forget to import the extension classes (so their decorators run), ` +
95
+ `or are you running with the wrong adapter?`);
96
+ }
97
+ };
98
+ RepositoryMetadataStore = __decorate([
99
+ singleton()
100
+ ], RepositoryMetadataStore);
101
+
102
+ export { RepositoryMetadataStore };
@@ -0,0 +1,134 @@
1
+ function getField(item, field) {
2
+ return item?.data?.[field];
3
+ }
4
+ function compare(a, b) {
5
+ if (a == null && b == null)
6
+ return 0;
7
+ if (a == null)
8
+ return -1;
9
+ if (b == null)
10
+ return 1;
11
+ if (typeof a === 'number' && typeof b === 'number')
12
+ return a - b;
13
+ return String(a).localeCompare(String(b));
14
+ }
15
+ function likeToRegex(pattern) {
16
+ let regex = '';
17
+ for (const ch of pattern) {
18
+ if (ch === '%')
19
+ regex += '.*';
20
+ else if (ch === '_')
21
+ regex += '.';
22
+ else
23
+ regex += ch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
24
+ }
25
+ return new RegExp('^' + regex + '$');
26
+ }
27
+ function operatorArity(op) {
28
+ if (op === 'IsNull' || op === 'IsNotNull')
29
+ return 0;
30
+ return 1;
31
+ }
32
+ function applyOperator(value, op, arg) {
33
+ switch (op) {
34
+ case 'Equals':
35
+ return value == arg;
36
+ case 'Not':
37
+ return value != arg;
38
+ case 'Like':
39
+ if (value == null)
40
+ return false;
41
+ return likeToRegex(String(arg)).test(String(value));
42
+ case 'NotLike':
43
+ if (value == null)
44
+ return false;
45
+ return !likeToRegex(String(arg)).test(String(value));
46
+ case 'In':
47
+ return Array.isArray(arg) && arg.some((x) => x == value);
48
+ case 'NotIn':
49
+ return Array.isArray(arg) && !arg.some((x) => x == value);
50
+ case 'Gt':
51
+ return value != null && arg != null && compare(value, arg) > 0;
52
+ case 'Gte':
53
+ return value != null && arg != null && compare(value, arg) >= 0;
54
+ case 'Lt':
55
+ return value != null && arg != null && compare(value, arg) < 0;
56
+ case 'Lte':
57
+ return value != null && arg != null && compare(value, arg) <= 0;
58
+ case 'IsNull':
59
+ return value == null;
60
+ case 'IsNotNull':
61
+ return value != null;
62
+ }
63
+ }
64
+ function bindArgs(conditions, args) {
65
+ let expectedArity = 0;
66
+ for (const c of conditions)
67
+ expectedArity += operatorArity(c.operator);
68
+ if (args.length !== expectedArity) {
69
+ throw new Error(`Query expected ${expectedArity} argument(s), received ${args.length}`);
70
+ }
71
+ const bound = [];
72
+ let idx = 0;
73
+ for (const cond of conditions) {
74
+ if (operatorArity(cond.operator) === 0) {
75
+ bound.push({ cond, arg: undefined });
76
+ }
77
+ else {
78
+ bound.push({ cond, arg: args[idx] });
79
+ idx += 1;
80
+ }
81
+ }
82
+ return bound;
83
+ }
84
+ // Matches SQL precedence: AND binds tighter than OR.
85
+ // Group consecutive conditions joined by And; start a new group on Or; OR across groups.
86
+ function matches(item, bound) {
87
+ if (bound.length === 0)
88
+ return true;
89
+ const groups = [[]];
90
+ for (const entry of bound) {
91
+ if (entry.cond.connector === 'Or' && groups[groups.length - 1].length > 0) {
92
+ groups.push([entry]);
93
+ }
94
+ else {
95
+ groups[groups.length - 1].push(entry);
96
+ }
97
+ }
98
+ return groups.some((group) => group.every(({ cond, arg }) => applyOperator(getField(item, cond.field), cond.operator, arg)));
99
+ }
100
+ function sortByOrderBy(items, ast) {
101
+ if (ast.orderBy.length === 0)
102
+ return items;
103
+ const copy = [...items];
104
+ copy.sort((a, b) => {
105
+ for (const o of ast.orderBy) {
106
+ const av = getField(a, o.field);
107
+ const bv = getField(b, o.field);
108
+ const c = compare(av, bv);
109
+ if (c !== 0)
110
+ return o.direction === 'ASC' ? c : -c;
111
+ }
112
+ return 0;
113
+ });
114
+ return copy;
115
+ }
116
+ function applyLimit(items, ast) {
117
+ if (ast.prefix === 'findOne')
118
+ return items.slice(0, 1);
119
+ if (ast.limit !== undefined)
120
+ return items.slice(0, ast.limit);
121
+ return items;
122
+ }
123
+ function evaluateQueryAst(items, ast, args) {
124
+ const bound = bindArgs(ast.conditions, args);
125
+ const filtered = [];
126
+ for (const item of items) {
127
+ if (matches(item, bound))
128
+ filtered.push(item);
129
+ }
130
+ const sorted = sortByOrderBy(filtered, ast);
131
+ return applyLimit(sorted, ast);
132
+ }
133
+
134
+ export { evaluateQueryAst };
@@ -35,6 +35,9 @@ let RestControllerMetadataStore = class RestControllerMetadataStore {
35
35
  }
36
36
  methodMiddlewares.unshift(middlewareMetadata);
37
37
  }
38
+ getAllRestControllerConstructors() {
39
+ return Array.from(this.restControllers.keys());
40
+ }
38
41
  getControllerEndPointsInfo(controllerConstructor) {
39
42
  const controller = this.restControllers.get(controllerConstructor);
40
43
  if (!controller) {
@@ -22,6 +22,9 @@ let SocketControllerMetadataStore = class SocketControllerMetadataStore {
22
22
  }
23
23
  controllerMiddlewares.unshift(handshakeMetadata);
24
24
  }
25
+ getAllSocketControllerConstructors() {
26
+ return Array.from(this.socketControllers.keys());
27
+ }
25
28
  getSocketControllerInfo(controllerConstructor) {
26
29
  const controller = this.socketControllers.get(controllerConstructor);
27
30
  if (!controller) {