@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
@@ -1,26 +1,26 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { injectable } from '../../../core/injection/index.js';
3
- import { Env } from '../../../core/env/Env.js';
4
- import { Logger } from '../../../core/logger/Logger.js';
5
- import { WhatsAppByWasenderChannelConfig } from './WhatsAppByWasenderChannelConfig.js';
6
- import { WhatsAppReceiverByWasender } from './WhatsAppReceiverByWasender.js';
7
- import { WhatsAppSenderByWasender } from './WhatsAppSenderByWasender.js';
8
- import { whatsAppByWasenderChannelName } from './whatsAppByWasenderChannelName.js';
2
+ import { injectable } from '../../../../core/injection/index.js';
3
+ import { Env } from '../../../../core/env/Env.js';
4
+ import { Logger } from '../../../../core/logger/Logger.js';
5
+ import { WasenderChannelConfig } from './WasenderChannelConfig.js';
6
+ import { WasenderReceiver } from './WasenderReceiver.js';
7
+ import { WasenderSender } from './WasenderSender.js';
8
+ import { wasenderChannelName } from './WasenderChannelName.js';
9
9
 
10
- var WhatsAppByWasenderChannel_1;
11
- let WhatsAppByWasenderChannel = class WhatsAppByWasenderChannel {
12
- static { WhatsAppByWasenderChannel_1 = this; }
10
+ var WasenderChannel_1;
11
+ let WasenderChannel = class WasenderChannel {
12
+ static { WasenderChannel_1 = this; }
13
13
  logger = new Logger('wabot:whatsapp-by-wasender-channel');
14
14
  sender;
15
15
  receiver;
16
16
  phoneNumber;
17
- static channelName = whatsAppByWasenderChannelName;
17
+ static channelName = wasenderChannelName;
18
18
  constructor(config, env) {
19
19
  const apiKey = config.apiKey ?? env.requireString('WASENDER_API_KEY');
20
20
  const webhookSecret = config.webhookSecret ?? env.requireString('WASENDER_WEBHOOK_SECRET');
21
21
  this.phoneNumber = config.phoneNumber ?? env.requireString('WASENDER_PHONE_NUMBER');
22
- this.sender = new WhatsAppSenderByWasender(apiKey, config.retryOptions);
23
- this.receiver = new WhatsAppReceiverByWasender({
22
+ this.sender = new WasenderSender(apiKey, config.retryOptions);
23
+ this.receiver = new WasenderReceiver({
24
24
  apiKey,
25
25
  webhookSecret,
26
26
  webhookPath: config.webhookPath,
@@ -31,15 +31,15 @@ let WhatsAppByWasenderChannel = class WhatsAppByWasenderChannel {
31
31
  this.receiver.listenMessage(async (message, from) => {
32
32
  try {
33
33
  await callback({
34
- channel: whatsAppByWasenderChannelName,
34
+ channel: wasenderChannelName,
35
35
  chatConnection: {
36
36
  chatType: 'PRIVATE',
37
- channelName: WhatsAppByWasenderChannel_1.channelName,
37
+ channelName: WasenderChannel_1.channelName,
38
38
  id: from,
39
39
  },
40
40
  message,
41
41
  reply: async (replyMessage) => {
42
- await this.sender.send({
42
+ await this.sender.sendMessage({
43
43
  from: this.phoneNumber,
44
44
  to: from,
45
45
  message: replyMessage,
@@ -59,9 +59,9 @@ let WhatsAppByWasenderChannel = class WhatsAppByWasenderChannel {
59
59
  this.receiver.disconnect();
60
60
  }
61
61
  };
62
- WhatsAppByWasenderChannel = WhatsAppByWasenderChannel_1 = __decorate([
62
+ WasenderChannel = WasenderChannel_1 = __decorate([
63
63
  injectable(),
64
- __metadata("design:paramtypes", [WhatsAppByWasenderChannelConfig, Env])
65
- ], WhatsAppByWasenderChannel);
64
+ __metadata("design:paramtypes", [WasenderChannelConfig, Env])
65
+ ], WasenderChannel);
66
66
 
67
- export { WhatsAppByWasenderChannel };
67
+ export { WasenderChannel };
@@ -1,4 +1,4 @@
1
- class WhatsAppByWasenderChannelConfig {
1
+ class WasenderChannelConfig {
2
2
  apiKey;
3
3
  webhookSecret;
4
4
  phoneNumber;
@@ -9,8 +9,8 @@ class WhatsAppByWasenderChannelConfig {
9
9
  this.webhookSecret = config.webhookSecret;
10
10
  this.phoneNumber = config.phoneNumber;
11
11
  this.webhookPath = config.webhookPath ?? '/wasender/hook';
12
- this.retryOptions = config.retryOptions ?? { enabled: true, maxRetries: 3 };
12
+ this.retryOptions = { enabled: true, maxRetries: 3 };
13
13
  }
14
14
  }
15
15
 
16
- export { WhatsAppByWasenderChannelConfig };
16
+ export { WasenderChannelConfig };
@@ -0,0 +1,3 @@
1
+ const wasenderChannelName = 'WhatsAppByWasenderChannel';
2
+
3
+ export { wasenderChannelName };
@@ -1,12 +1,12 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import '../../../core/injection/index.js';
3
- import '../../../feature/rest-controller/metadata/RestControllerMetadataStore.js';
4
- import { restController } from '../../../feature/rest-controller/metadata/@restController.js';
5
- import { runRestControllers } from '../../../feature/rest-controller/runRestControllers.js';
6
- import { createWasender } from '../../../node_modules/wasenderapi/dist/index.js';
2
+ import '../../../../core/injection/index.js';
3
+ import '../../../../feature/rest-controller/metadata/RestControllerMetadataStore.js';
4
+ import { restController } from '../../../../feature/rest-controller/metadata/@restController.js';
5
+ import { runRestControllers } from '../../../../feature/rest-controller/runRestControllers.js';
6
+ import { createWasender } from '../../../../node_modules/wasenderapi/dist/index.js';
7
7
  import { WasenderWebhookController } from './WasenderWebhookController.js';
8
8
 
9
- class WhatsAppReceiverByWasender {
9
+ class WasenderReceiver {
10
10
  config;
11
11
  wasender;
12
12
  listener = null;
@@ -36,4 +36,4 @@ class WhatsAppReceiverByWasender {
36
36
  }
37
37
  }
38
38
 
39
- export { WhatsAppReceiverByWasender };
39
+ export { WasenderReceiver };
@@ -1,13 +1,13 @@
1
- import { Logger } from '../../../core/logger/Logger.js';
2
- import { createWasender } from '../../../node_modules/wasenderapi/dist/index.js';
1
+ import { Logger } from '../../../../core/logger/Logger.js';
2
+ import { createWasender } from '../../../../node_modules/wasenderapi/dist/index.js';
3
3
 
4
- class WhatsAppSenderByWasender {
4
+ class WasenderSender {
5
5
  wasender;
6
6
  logger = new Logger('wabot:whatsapp-sender-by-wasender');
7
7
  constructor(apiKey, retryOptions) {
8
8
  this.wasender = createWasender(apiKey, undefined, undefined, undefined, retryOptions, undefined);
9
9
  }
10
- async send(request) {
10
+ async sendMessage(request) {
11
11
  try {
12
12
  const textPayload = {
13
13
  messageType: 'text',
@@ -28,6 +28,9 @@ class WhatsAppSenderByWasender {
28
28
  }
29
29
  }
30
30
  }
31
+ sendTemplate(request) {
32
+ throw new Error('Method not implemented.');
33
+ }
31
34
  }
32
35
 
33
- export { WhatsAppSenderByWasender };
36
+ export { WasenderSender };
@@ -1,8 +1,8 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { Logger } from '../../../core/logger/Logger.js';
3
- import '../../../core/injection/index.js';
4
- import '../../../feature/rest-controller/metadata/RestControllerMetadataStore.js';
5
- import { onPost } from '../../../feature/rest-controller/metadata/@onPost.js';
2
+ import { Logger } from '../../../../core/logger/Logger.js';
3
+ import '../../../../core/injection/index.js';
4
+ import '../../../../feature/rest-controller/metadata/RestControllerMetadataStore.js';
5
+ import { onPost } from '../../../../feature/rest-controller/metadata/@onPost.js';
6
6
  import { extractNumberFromWasenderMessageKey } from './extractNumberFromWasenderKey.js';
7
7
  import { IncomingMessage } from 'node:http';
8
8
 
@@ -0,0 +1,45 @@
1
+ class InMemoryLockKey {
2
+ key;
3
+ static locks = new Map();
4
+ constructor(key) {
5
+ this.key = key;
6
+ }
7
+ async run(fn) {
8
+ let release;
9
+ const lock = new Promise((r) => {
10
+ release = r;
11
+ });
12
+ const prev = InMemoryLockKey.locks.get(this.key) ?? Promise.resolve();
13
+ InMemoryLockKey.locks.set(this.key, lock);
14
+ try {
15
+ await prev;
16
+ return await fn();
17
+ }
18
+ finally {
19
+ if (InMemoryLockKey.locks.get(this.key) === lock) {
20
+ InMemoryLockKey.locks.delete(this.key);
21
+ }
22
+ release();
23
+ }
24
+ }
25
+ async tryRun(fn) {
26
+ if (InMemoryLockKey.locks.has(this.key))
27
+ return undefined;
28
+ let release;
29
+ const lock = new Promise((r) => {
30
+ release = r;
31
+ });
32
+ InMemoryLockKey.locks.set(this.key, lock);
33
+ try {
34
+ return await fn();
35
+ }
36
+ finally {
37
+ if (InMemoryLockKey.locks.get(this.key) === lock) {
38
+ InMemoryLockKey.locks.delete(this.key);
39
+ }
40
+ release();
41
+ }
42
+ }
43
+ }
44
+
45
+ export { InMemoryLockKey };
@@ -0,0 +1,15 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../core/injection/index.js';
3
+ import { InMemoryLockKey } from './InMemoryLockKey.js';
4
+
5
+ let InMemoryLocker = class InMemoryLocker {
6
+ withKey(key) {
7
+ const resolved = typeof key === 'object' ? key.lockerKey() : key;
8
+ return new InMemoryLockKey(resolved);
9
+ }
10
+ };
11
+ InMemoryLocker = __decorate([
12
+ singleton()
13
+ ], InMemoryLocker);
14
+
15
+ export { InMemoryLocker };
@@ -0,0 +1,2 @@
1
+ export { InMemoryLockKey } from './InMemoryLockKey.js';
2
+ export { InMemoryLocker } from './InMemoryLocker.js';
@@ -0,0 +1,25 @@
1
+ class CrudRepository {
2
+ find(id) {
3
+ throw new Error("Method not implemented.");
4
+ }
5
+ findOrThrow(id) {
6
+ throw new Error("Method not implemented.");
7
+ }
8
+ findByIds(ids) {
9
+ throw new Error("Method not implemented.");
10
+ }
11
+ findAll(id) {
12
+ throw new Error("Method not implemented.");
13
+ }
14
+ create(item) {
15
+ throw new Error("Method not implemented.");
16
+ }
17
+ update(item) {
18
+ throw new Error("Method not implemented.");
19
+ }
20
+ delete(item) {
21
+ throw new Error("Method not implemented.");
22
+ }
23
+ }
24
+
25
+ export { CrudRepository };
@@ -1,7 +1,7 @@
1
1
  import { AsyncMetadataStore } from './AsyncMetadataStore.js';
2
2
  import { container, singleton } from '../../core/injection/index.js';
3
3
 
4
- function cron(config) {
4
+ function cronHandler(config) {
5
5
  return function (target) {
6
6
  const metadataStore = container.resolve(AsyncMetadataStore);
7
7
  metadataStore.registerCron(target, {
@@ -14,4 +14,4 @@ function cron(config) {
14
14
  };
15
15
  }
16
16
 
17
- export { cron };
17
+ export { cronHandler };
@@ -0,0 +1,22 @@
1
+ import { container } from '../../core/injection/index.js';
2
+ import { TransactionMetadataStore } from './TransactionMetadataStore.js';
3
+
4
+ function transaction(dbNames) {
5
+ return function (_target, _propertyKey, descriptor) {
6
+ const originalMethod = descriptor.value;
7
+ const store = container.resolve(TransactionMetadataStore);
8
+ descriptor.value = function (...args) {
9
+ const adapters = dbNames ? store.requireAdapters(dbNames) : store.getAllAdapters();
10
+ return runInTransactions(adapters, () => originalMethod.apply(this, args));
11
+ };
12
+ return descriptor;
13
+ };
14
+ }
15
+ function runInTransactions(adapters, fn) {
16
+ if (adapters.length === 0)
17
+ return fn();
18
+ const composed = adapters.reduceRight((next, adapter) => () => adapter.run(next), fn);
19
+ return composed();
20
+ }
21
+
22
+ export { transaction };
@@ -52,6 +52,12 @@ let AsyncMetadataStore = class AsyncMetadataStore {
52
52
  getCommandForCommandName(commandName) {
53
53
  return this.commandsMap.get(commandName) ?? null;
54
54
  }
55
+ getAllCommandHandlers() {
56
+ return Array.from(this.handlersInverseMap.keys());
57
+ }
58
+ getAllCronHandlers() {
59
+ return Array.from(this.cronsMap.keys());
60
+ }
55
61
  };
56
62
  AsyncMetadataStore = __decorate([
57
63
  singleton()
@@ -0,0 +1,28 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../core/injection/index.js';
3
+
4
+ let TransactionMetadataStore = class TransactionMetadataStore {
5
+ adapters = new Map();
6
+ registerAdapter(dbName, adapter) {
7
+ this.adapters.set(dbName, adapter);
8
+ }
9
+ requireAdapter(dbName) {
10
+ const adapter = this.adapters.get(dbName);
11
+ if (!adapter) {
12
+ throw new Error(`No transaction adapter registered for "${dbName}". ` +
13
+ `Register one with container.resolve(TransactionMetadataStore).registerAdapter("${dbName}", adapter)`);
14
+ }
15
+ return adapter;
16
+ }
17
+ requireAdapters(dbNames) {
18
+ return dbNames.map((name) => this.requireAdapter(name));
19
+ }
20
+ getAllAdapters() {
21
+ return Array.from(this.adapters.values());
22
+ }
23
+ };
24
+ TransactionMetadataStore = __decorate([
25
+ singleton()
26
+ ], TransactionMetadataStore);
27
+
28
+ export { TransactionMetadataStore };
@@ -20,6 +20,9 @@ let ControllerMetadataStore = class ControllerMetadataStore {
20
20
  saveChatControllerMetadata(controllerMetadata) {
21
21
  this.chatControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
22
22
  }
23
+ getAllChatControllerConstructors() {
24
+ return Array.from(this.chatControllers.keys());
25
+ }
23
26
  getChatControllerMetadata(controllerConstructor) {
24
27
  const mainMetadata = this.chatControllers.get(controllerConstructor);
25
28
  if (!mainMetadata)
@@ -0,0 +1,33 @@
1
+ import { container } from '../../core/injection/index.js';
2
+ import 'short-uuid';
3
+ import '../../core/error/setupErrorHandlers.js';
4
+ import { RepositoryMetadataStore } from '../repository/RepositoryMetadataStore.js';
5
+ import '../repository/RepositoryAdapterRegistry.js';
6
+ import { PgRepositoryBase } from './PgRepositoryBase.js';
7
+
8
+ const PG_ADAPTER_ID = Symbol('wabot:pg-adapter');
9
+ function inheritsFrom(ctor, base) {
10
+ let proto = ctor.prototype;
11
+ while (proto) {
12
+ if (proto === base.prototype)
13
+ return true;
14
+ proto = Object.getPrototypeOf(proto);
15
+ }
16
+ return false;
17
+ }
18
+ function pgExtension(repositoryClass) {
19
+ if (typeof repositoryClass !== 'function') {
20
+ throw new Error(`@pgExtension: repository argument must be a class, ` +
21
+ `got ${typeof repositoryClass}`);
22
+ }
23
+ return function (target) {
24
+ if (!inheritsFrom(target, PgRepositoryBase)) {
25
+ throw new Error(`@pgExtension on ${target.name}: extension class must extend ` +
26
+ `PgRepositoryExtension.`);
27
+ }
28
+ const store = container.resolve(RepositoryMetadataStore);
29
+ store.saveExtension(repositoryClass, PG_ADAPTER_ID, target);
30
+ };
31
+ }
32
+
33
+ export { PG_ADAPTER_ID, pgExtension };
@@ -0,0 +1,50 @@
1
+ import { PgCrudRepository } from './PgCrudRepository.js';
2
+ import { PG_ADAPTER_ID } from './@pgExtension.js';
3
+ import { buildQuerySql } from './buildQuerySql.js';
4
+ import { withPgClient } from './withPgClient.js';
5
+
6
+ class PgJsonRepositoryRuntime extends PgCrudRepository {
7
+ async runQuery(ast, args) {
8
+ const built = buildQuerySql(ast, this.table, this.columns);
9
+ const params = built.buildParams(args);
10
+ return this.query(built.sql, params);
11
+ }
12
+ async runCount(ast, args) {
13
+ const built = buildQuerySql(ast, this.table, this.columns);
14
+ const params = built.buildParams(args);
15
+ return withPgClient(this.pool, async (client) => {
16
+ await this.ensureTable(client);
17
+ const result = await client.query(built.sql, params);
18
+ return result.rows[0]?.count ?? 0;
19
+ });
20
+ }
21
+ async runExists(ast, args) {
22
+ const built = buildQuerySql(ast, this.table, this.columns);
23
+ const params = built.buildParams(args);
24
+ return withPgClient(this.pool, async (client) => {
25
+ await this.ensureTable(client);
26
+ const result = await client.query(built.sql, params);
27
+ return Boolean(result.rows[0]?.exists);
28
+ });
29
+ }
30
+ async runDelete(ast, args) {
31
+ const built = buildQuerySql(ast, this.table, this.columns);
32
+ const params = built.buildParams(args);
33
+ await this.exec(built.sql, params);
34
+ }
35
+ }
36
+ class PgJsonRepositoryAdapter {
37
+ pool;
38
+ id = PG_ADAPTER_ID;
39
+ constructor(pool) {
40
+ this.pool = pool;
41
+ }
42
+ build(config) {
43
+ return new PgJsonRepositoryRuntime(this.pool, config);
44
+ }
45
+ buildExtension(config, ExtensionCtor) {
46
+ return new ExtensionCtor(this.pool, config);
47
+ }
48
+ }
49
+
50
+ export { PgJsonRepositoryAdapter };
@@ -0,0 +1,10 @@
1
+ export { PG_ADAPTER_ID, pgExtension } from './@pgExtension.js';
2
+ export { PgCrudRepository } from './PgCrudRepository.js';
3
+ export { PgJsonRepositoryAdapter } from './PgJsonRepositoryAdapter.js';
4
+ export { PgLocker } from './PgLocker.js';
5
+ export { PgLockKey } from './PgLockKey.js';
6
+ export { PgRepositoryBase, PgRepositoryBase as PgRepositoryExtension } from './PgRepositoryBase.js';
7
+ export { getClientMap, pgStorage } from './pgStorage.js';
8
+ export { buildQuerySql } from './buildQuerySql.js';
9
+ export { getPgClient, withPgClient } from './withPgClient.js';
10
+ export { withPgTransaction } from './withPgTransaction.js';