@wabot-dev/framework 0.1.0-beta.2 → 0.1.0-beta.21

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 (99) hide show
  1. package/dist/src/ai/claude/ClaudeChatBotAdapter.js +113 -0
  2. package/dist/src/ai/deepseek/DeepSeekChatBotAdapter.js +12 -13
  3. package/dist/src/ai/openia/OpenaiChatBotAdapter.js +9 -7
  4. package/dist/src/channels/cmd/@cmd.js +0 -4
  5. package/dist/src/channels/cmd/CmdChannel.js +0 -4
  6. package/dist/src/channels/express/ExpressProvider.js +46 -0
  7. package/dist/src/channels/http/HttpServerProvider.js +31 -0
  8. package/dist/src/channels/{socket-io → socket}/@socket.js +0 -4
  9. package/dist/src/channels/{socket-io → socket}/SocketChannel.js +12 -11
  10. package/dist/src/channels/socket/SocketServerProvider.js +50 -0
  11. package/dist/src/channels/telegram/@telegram.js +0 -4
  12. package/dist/src/channels/telegram/TelegramChannel.js +0 -4
  13. package/dist/src/channels/wabot/WabotDevConnection.js +57 -0
  14. package/dist/src/channels/{whatsapp/WhatsAppDevSocketContracts.js → wabot/WabotDevSocketContracts.js} +3 -3
  15. package/dist/src/channels/whatsapp/@whatsapp.js +0 -4
  16. package/dist/src/channels/whatsapp/EnvWhatsAppRepository.js +49 -0
  17. package/dist/src/channels/whatsapp/PgWhatsAppRepository.js +41 -0
  18. package/dist/src/channels/whatsapp/WhatsApp.js +32 -0
  19. package/dist/src/channels/whatsapp/WhatsAppChannel.js +33 -32
  20. package/dist/src/channels/whatsapp/{WhatsAppConnection.js → WhatsAppReceiver.js} +4 -6
  21. package/dist/src/channels/whatsapp/WhatsAppReceiverByDevConnection.js +32 -0
  22. package/dist/src/channels/whatsapp/WhatsAppReceiverByWebHook.js +63 -0
  23. package/dist/src/channels/whatsapp/WhatsAppRepository.js +10 -0
  24. package/dist/src/channels/whatsapp/WhatsAppSender.js +107 -20
  25. package/dist/src/channels/whatsapp/WhatsAppSenderByCloudApi.js +118 -0
  26. package/dist/src/channels/whatsapp/WhatsAppSenderByDevConnection.js +56 -0
  27. package/dist/src/chatbot/ChatBotAdapter.js +1 -5
  28. package/dist/src/chatbot/metadata/@chatBot.js +0 -5
  29. package/dist/src/chatbot/metadata/ChatBotMetadataStore.js +0 -5
  30. package/dist/src/controller/metadata/ControllerMetadataStore.js +0 -2
  31. package/dist/src/controller/metadata/controller/@chatController.js +0 -2
  32. package/dist/src/core/{Persistent.js → Entity.js} +24 -9
  33. package/dist/src/core/IMessageContext.js +0 -2
  34. package/dist/src/core/Storable.js +8 -0
  35. package/dist/src/core/chat/Chat.js +2 -2
  36. package/dist/src/core/chat/ChatItem.js +2 -2
  37. package/dist/src/core/user/User.js +2 -2
  38. package/dist/src/env/Env.js +39 -0
  39. package/dist/src/error/CustomError.js +15 -0
  40. package/dist/src/index.d.ts +539 -240
  41. package/dist/src/index.js +65 -34
  42. package/dist/src/mindset/MindsetOperator.js +1 -3
  43. package/dist/src/mindset/metadata/MindsetMetadataStore.js +0 -2
  44. package/dist/src/mindset/metadata/mindsets/@mindset.js +0 -2
  45. package/dist/src/mindset/metadata/modules/@mindsetModule.js +0 -2
  46. package/dist/src/pre-made/module/authentication/requests/SendOneTimePasswordRequest.js +0 -2
  47. package/dist/src/pre-made/module/authentication/requests/ValidateOneTimePasswordRequest.js +0 -2
  48. package/dist/src/pre-made/module/html/HtmlModule.js +70 -0
  49. package/dist/src/pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js +0 -2
  50. package/dist/src/pre-made/repository/chat/pg/PgChatMemory.js +1 -7
  51. package/dist/src/pre-made/repository/chat/pg/PgChatRepository.js +0 -5
  52. package/dist/src/pre-made/repository/chat/ram/RamChatRepository.js +1 -1
  53. package/dist/src/pre-made/repository/user/pg/PgUserRepository.js +0 -5
  54. package/dist/src/repository/pg/PgCrudRepository.js +13 -3
  55. package/dist/src/repository/pg/PgRepositoryBase.js +2 -2
  56. package/dist/src/rest-controller/metadata/@get.js +19 -0
  57. package/dist/src/rest-controller/metadata/@middleware.js +16 -0
  58. package/dist/src/rest-controller/metadata/@post.js +19 -0
  59. package/dist/src/rest-controller/metadata/@restController.js +15 -0
  60. package/dist/src/rest-controller/metadata/RestControllerMetadataStore.js +50 -0
  61. package/dist/src/rest-controller/runRestControllers.js +93 -0
  62. package/dist/src/server/prepareChatContainer.js +6 -6
  63. package/dist/src/server/runChannel.js +2 -10
  64. package/dist/src/server/runServer.js +0 -43
  65. package/dist/src/validation/metadata/@isBoolean.js +17 -0
  66. package/dist/src/validation/metadata/@isDate.js +17 -0
  67. package/dist/src/validation/metadata/@isModel.js +18 -0
  68. package/dist/src/validation/metadata/@isNotEmpty.js +17 -0
  69. package/dist/src/validation/metadata/@isNumber.js +17 -0
  70. package/dist/src/validation/metadata/@isOptional.js +17 -0
  71. package/dist/src/validation/metadata/@isPresent.js +17 -0
  72. package/dist/src/validation/metadata/@isString.js +17 -0
  73. package/dist/src/validation/metadata/@max.js +18 -0
  74. package/dist/src/validation/metadata/@min.js +18 -0
  75. package/dist/src/validation/metadata/ValidationMetadataStore.js +70 -0
  76. package/dist/src/validation/validate.js +11 -0
  77. package/dist/src/validation/validators/validateIsBoolean.js +12 -0
  78. package/dist/src/validation/validators/validateIsDate.js +16 -0
  79. package/dist/src/validation/validators/validateIsNotEmpty.js +12 -0
  80. package/dist/src/validation/validators/validateIsNumber.js +12 -0
  81. package/dist/src/validation/validators/validateIsOptional.js +5 -0
  82. package/dist/src/validation/validators/validateIsPresent.js +12 -0
  83. package/dist/src/validation/validators/validateIsString.js +12 -0
  84. package/dist/src/validation/validators/validateMax.js +17 -0
  85. package/dist/src/validation/validators/validateMin.js +17 -0
  86. package/dist/src/validation/validators/validateModel.js +34 -0
  87. package/package.json +5 -6
  88. package/dist/src/channels/whatsapp/WhatsAppDevConnection.js +0 -69
  89. package/dist/src/channels/whatsapp/WhatsAppProdConnection.js +0 -39
  90. package/dist/src/controller/express/Express.js +0 -5
  91. package/dist/src/controller/socket.io/SocketIO.js +0 -5
  92. package/dist/src/env/WabotEnv.js +0 -21
  93. package/dist/src/mindset/metadata/params/@isOptional.js +0 -21
  94. package/dist/src/pre-made/repository/chat/sqlite/SqliteChatMemory.js +0 -23
  95. package/dist/src/pre-made/repository/chat/sqlite/SqliteChatRepository.js +0 -30
  96. package/dist/src/pre-made/repository/user/sqlite/SqliteUserRepository.js +0 -23
  97. package/dist/src/repository/sqlite/SqliteCrudRepository.js +0 -85
  98. package/dist/src/repository/sqlite/SqlitePersistentMapper.js +0 -17
  99. /package/dist/src/channels/{socket-io → socket}/SocketChannelConfig.js +0 -0
@@ -1,12 +1,12 @@
1
- import { ChatMemory } from '../core/chat/repository/IChatMemory.js';
2
- import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
3
- import '../core/user/IUserRepository.js';
4
- import { MessageContext } from '../core/IMessageContext.js';
5
1
  import '../injection/index.js';
6
2
  import 'reflect-metadata';
7
3
  import '../mindset/metadata/MindsetMetadataStore.js';
8
4
  import { Mindset } from '../mindset/IMindset.js';
9
5
  import '../mindset/MindsetOperator.js';
6
+ import { ChatMemory } from '../core/chat/repository/IChatMemory.js';
7
+ import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
8
+ import '../core/user/IUserRepository.js';
9
+ import { MessageContext } from '../core/IMessageContext.js';
10
10
  import 'uuid';
11
11
  import { ChatBotMetadataStore } from '../chatbot/metadata/ChatBotMetadataStore.js';
12
12
  import { ChatBot } from '../chatbot/ChatBot.js';
@@ -19,9 +19,9 @@ async function prepareChatContainer(container, context, mindsetCtor) {
19
19
  useValue: new MessageContext(context.message, context.chat, context.user),
20
20
  });
21
21
  const chatRepository = container.resolve(ChatRepository);
22
- const chatMemory = await chatRepository.findMemory(context.chat.getId());
22
+ const chatMemory = await chatRepository.findMemory(context.chat.id);
23
23
  if (!chatMemory) {
24
- throw new Error('Not found Chat Memory for Chat with Id=' + context.chat.getId());
24
+ throw new Error('Not found Chat Memory for Chat with Id=' + context.chat.id);
25
25
  }
26
26
  chatContainer.register(ChatMemory, { useValue: chatMemory });
27
27
  const chatBotMetadataStore = container.resolve(ChatBotMetadataStore);
@@ -1,18 +1,10 @@
1
- import 'reflect-metadata';
2
1
  import { container } from '../injection/index.js';
3
- import '../mindset/metadata/MindsetMetadataStore.js';
4
- import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
5
- import '../core/user/IUserRepository.js';
6
- import '../mindset/MindsetOperator.js';
7
2
  import 'uuid';
8
3
  import '../chatbot/metadata/ChatBotMetadataStore.js';
9
4
  import { ChatBot } from '../chatbot/ChatBot.js';
10
5
  import { ChatBotAdapter } from '../chatbot/ChatBotAdapter.js';
11
- import '../controller/channel/ChatResolver.js';
12
- import '../controller/channel/UserResolver.js';
13
- import '../controller/metadata/ControllerMetadataStore.js';
14
- import 'express';
15
- import 'socket.io';
6
+ import { ChatRepository } from '../core/chat/repository/IChatRepository.js';
7
+ import '../core/user/IUserRepository.js';
16
8
  import { prepareChatContainer } from './prepareChatContainer.js';
17
9
 
18
10
  function runChannel(props) {
@@ -1,49 +1,10 @@
1
1
  import '../controller/channel/ChatResolver.js';
2
2
  import '../controller/channel/UserResolver.js';
3
3
  import { container } from '../injection/index.js';
4
- import '../core/chat/repository/IChatRepository.js';
5
- import '../core/user/IUserRepository.js';
6
4
  import { ControllerMetadataStore } from '../controller/metadata/ControllerMetadataStore.js';
7
- import { ExpressApp } from '../controller/express/Express.js';
8
- import { SocketIoApp } from '../controller/socket.io/SocketIO.js';
9
5
  import { prepareChatContainer } from './prepareChatContainer.js';
10
- import express from 'express';
11
- import { Server } from 'socket.io';
12
- import http from 'http';
13
- import bodyParser from 'body-parser';
14
- import { Logger } from '../logger/Logger.js';
15
6
 
16
7
  function runServer(config) {
17
- const httpLogger = new Logger('wabot:http');
18
- const socketLogger = new Logger('wabot:socket');
19
- const expressApp = express();
20
- const httpServer = http.createServer(expressApp);
21
- const io = new Server(httpServer, {
22
- cors: {
23
- origin: '*',
24
- },
25
- });
26
- expressApp.use(bodyParser.json());
27
- expressApp.use((req, res, next) => {
28
- const start = process.hrtime();
29
- res.on('finish', () => {
30
- const [seconds, nanoseconds] = process.hrtime(start);
31
- const ms = (seconds * 1000 + nanoseconds / 1e6).toFixed(2);
32
- httpLogger.trace(`${req.method} ${req.originalUrl} ${res.statusCode} - ${ms}ms`);
33
- });
34
- next();
35
- });
36
- io.on('connection', (socket) => {
37
- socketLogger.trace(`socket:${socket.id} connection`);
38
- socket.onAny((event) => {
39
- socketLogger.trace(`socket:${socket.id} emmits ${event}`);
40
- });
41
- socket.on('disconnect', (reason) => {
42
- socketLogger.trace(`socket:${socket.id} disconnect with reason: ${reason}`);
43
- });
44
- });
45
- container.register(ExpressApp, { useValue: expressApp });
46
- container.register(SocketIoApp, { useValue: io });
47
8
  for (const provider of config.providers ?? []) {
48
9
  if (provider.singleton) {
49
10
  container.registerSingleton(provider.replace, provider.with);
@@ -74,10 +35,6 @@ function runServer(config) {
74
35
  channel.connect();
75
36
  }
76
37
  }
77
- const PORT = process.env.PORT || 3000;
78
- httpServer.listen(PORT, () => {
79
- httpLogger.info(`server listenig on port ${PORT}`);
80
- });
81
38
  }
82
39
 
83
40
  export { runServer };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateIsBoolean } from '../validators/validateIsBoolean.js';
4
+
5
+ function isBoolean() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsBoolean,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isBoolean };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { validateIsDate } from '../validators/validateIsDate.js';
3
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
4
+
5
+ function isDate() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsDate,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isDate };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { validateModel } from '../validators/validateModel.js';
3
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
4
+
5
+ function isModel(model) {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateModel,
13
+ validatorOptions: store.getModelValidatorsInfo(model),
14
+ });
15
+ };
16
+ }
17
+
18
+ export { isModel };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateIsNotEmpty } from '../validators/validateIsNotEmpty.js';
4
+
5
+ function isNotEmpty() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsNotEmpty,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isNotEmpty };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { validateIsNumber } from '../validators/validateIsNumber.js';
3
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
4
+
5
+ function isNumber() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsNumber,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isNumber };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../validators/validateIsOptional.js';
4
+
5
+ function isOptional() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: _IS_OPTIONAL_DUMMY_VALIDATOR_,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isOptional };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateIsPresent } from '../validators/validateIsPresent.js';
4
+
5
+ function isPresent() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsPresent,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isPresent };
@@ -0,0 +1,17 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateIsString } from '../validators/validateIsString.js';
4
+
5
+ function isString() {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateIsString,
13
+ });
14
+ };
15
+ }
16
+
17
+ export { isString };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateMax } from '../validators/validateMax.js';
4
+
5
+ function max(limit) {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateMax,
13
+ validatorOptions: { limit },
14
+ });
15
+ };
16
+ }
17
+
18
+ export { max };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../injection/index.js';
2
+ import { ValidationMetadataStore } from './ValidationMetadataStore.js';
3
+ import { validateMin } from '../validators/validateMin.js';
4
+
5
+ function min(limit) {
6
+ return function (target, propertyKey) {
7
+ const propertyName = propertyKey.toString();
8
+ const store = container.resolve(ValidationMetadataStore);
9
+ store.saveValidatorMetadata({
10
+ modelConstructor: target.constructor,
11
+ propertyName,
12
+ validator: validateMin,
13
+ validatorOptions: { limit },
14
+ });
15
+ };
16
+ }
17
+
18
+ export { min };
@@ -0,0 +1,70 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../injection/index.js';
3
+ import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../validators/validateIsOptional.js';
4
+
5
+ function getClassHierarchy(cls) {
6
+ const classes = [];
7
+ let proto = Object.getPrototypeOf(cls.prototype);
8
+ while (proto && proto.constructor !== Object) {
9
+ classes.push(proto.constructor);
10
+ proto = Object.getPrototypeOf(proto);
11
+ }
12
+ return classes;
13
+ }
14
+ let ValidationMetadataStore = class ValidationMetadataStore {
15
+ validators = new Map();
16
+ saveValidatorMetadata(validatorMetadata) {
17
+ let modelValidators = this.validators.get(validatorMetadata.modelConstructor);
18
+ if (!modelValidators) {
19
+ this.validators.set(validatorMetadata.modelConstructor, (modelValidators = new Map()));
20
+ }
21
+ let propertyValidators = modelValidators.get(validatorMetadata.propertyName);
22
+ if (!propertyValidators) {
23
+ propertyValidators = [];
24
+ modelValidators.set(validatorMetadata.propertyName, propertyValidators);
25
+ }
26
+ propertyValidators.unshift(validatorMetadata);
27
+ }
28
+ getModelValidatorsInfo(modelConstructor) {
29
+ const constructors = getClassHierarchy(modelConstructor);
30
+ constructors.unshift(modelConstructor);
31
+ const modelValidators = {
32
+ modelConstructor: modelConstructor,
33
+ properties: Object.assign({}, ...constructors.map((x) => this.getConstructorPropertiesValidatorsInfo(x))),
34
+ };
35
+ return modelValidators;
36
+ }
37
+ getConstructorPropertiesValidatorsInfo(modelConstructor) {
38
+ const properties = {};
39
+ [...(this.validators.get(modelConstructor)?.values() ?? [])].forEach((propertyValidatorsMetadata) => {
40
+ const propertyName = propertyValidatorsMetadata.at(0)?.propertyName;
41
+ if (!propertyName) {
42
+ return;
43
+ }
44
+ let propertyInfo = properties[propertyName];
45
+ if (!propertyInfo) {
46
+ propertyInfo = {};
47
+ properties[propertyName] = propertyInfo;
48
+ }
49
+ let validators = propertyInfo.validators;
50
+ if (!validators) {
51
+ validators = [];
52
+ propertyInfo.validators = validators;
53
+ }
54
+ propertyValidatorsMetadata.forEach((propertyValidatorMetadata) => {
55
+ if (propertyValidatorMetadata.validator === _IS_OPTIONAL_DUMMY_VALIDATOR_) {
56
+ propertyInfo.isOptional = true;
57
+ }
58
+ else {
59
+ validators.push(propertyValidatorMetadata);
60
+ }
61
+ });
62
+ });
63
+ return properties;
64
+ }
65
+ };
66
+ ValidationMetadataStore = __decorate([
67
+ singleton()
68
+ ], ValidationMetadataStore);
69
+
70
+ export { ValidationMetadataStore };
@@ -0,0 +1,11 @@
1
+ import { container } from '../injection/index.js';
2
+ import { ValidationMetadataStore } from './metadata/ValidationMetadataStore.js';
3
+ import { validateModel } from './validators/validateModel.js';
4
+
5
+ function validate(value, modelConstructor) {
6
+ const metadataStore = container.resolve(ValidationMetadataStore);
7
+ const info = metadataStore.getModelValidatorsInfo(modelConstructor);
8
+ return validateModel(value, info);
9
+ }
10
+
11
+ export { validate };
@@ -0,0 +1,12 @@
1
+ function validateIsBoolean(value) {
2
+ if (typeof value !== 'boolean') {
3
+ return {
4
+ error: { description: `boolean value is required` },
5
+ };
6
+ }
7
+ return {
8
+ value,
9
+ };
10
+ }
11
+
12
+ export { validateIsBoolean };
@@ -0,0 +1,16 @@
1
+ function validateIsDate(value) {
2
+ const _value = new Date(value);
3
+ const time = _value.getTime();
4
+ if ((typeof value !== 'number' && typeof value !== 'string' && !(value instanceof Date)) ||
5
+ isNaN(time) ||
6
+ time < 0) {
7
+ return {
8
+ error: { description: `Date value is not valid` },
9
+ };
10
+ }
11
+ return {
12
+ value: _value,
13
+ };
14
+ }
15
+
16
+ export { validateIsDate };
@@ -0,0 +1,12 @@
1
+ function validateIsNotEmpty(value) {
2
+ if (value === '' || (Array.isArray(value) && value.length === 0)) {
3
+ return {
4
+ error: { description: `empty value not allowed` },
5
+ };
6
+ }
7
+ return {
8
+ value,
9
+ };
10
+ }
11
+
12
+ export { validateIsNotEmpty };
@@ -0,0 +1,12 @@
1
+ function validateIsNumber(value) {
2
+ if (typeof value !== 'number') {
3
+ return {
4
+ error: { description: `number value is required` },
5
+ };
6
+ }
7
+ return {
8
+ value,
9
+ };
10
+ }
11
+
12
+ export { validateIsNumber };
@@ -0,0 +1,5 @@
1
+ const _IS_OPTIONAL_DUMMY_VALIDATOR_ = (value) => {
2
+ return { value, errors: [] };
3
+ };
4
+
5
+ export { _IS_OPTIONAL_DUMMY_VALIDATOR_ };
@@ -0,0 +1,12 @@
1
+ function validateIsPresent(value) {
2
+ if (value == null) {
3
+ return {
4
+ error: { description: `not present` },
5
+ };
6
+ }
7
+ return {
8
+ value,
9
+ };
10
+ }
11
+
12
+ export { validateIsPresent };
@@ -0,0 +1,12 @@
1
+ function validateIsString(value) {
2
+ if (typeof value !== 'string') {
3
+ return {
4
+ error: { description: `string value is required` },
5
+ };
6
+ }
7
+ return {
8
+ value,
9
+ };
10
+ }
11
+
12
+ export { validateIsString };
@@ -0,0 +1,17 @@
1
+ function validateMax(value, options) {
2
+ if (value == null) {
3
+ return {
4
+ error: { description: `null or undefined value can't be validated with max` },
5
+ };
6
+ }
7
+ if (Number(value) > Number(options.limit)) {
8
+ return {
9
+ error: { description: `exceeds the established max limit` },
10
+ };
11
+ }
12
+ return {
13
+ value,
14
+ };
15
+ }
16
+
17
+ export { validateMax };
@@ -0,0 +1,17 @@
1
+ function validateMin(value, options) {
2
+ if (value == null) {
3
+ return {
4
+ error: { description: `null or undefined value can't be validated with min` },
5
+ };
6
+ }
7
+ if (Number(value) < Number(options.limit)) {
8
+ return {
9
+ error: { description: `exceeds the established min limit` },
10
+ };
11
+ }
12
+ return {
13
+ value,
14
+ };
15
+ }
16
+
17
+ export { validateMin };
@@ -0,0 +1,34 @@
1
+ function validateModel(value, info) {
2
+ if (typeof value !== 'object' || value === null) {
3
+ return { error: { description: 'Invalid object', properties: {} } };
4
+ }
5
+ let propertiesErrors = {};
6
+ let resultValue = new info.modelConstructor();
7
+ for (const propertyName in info.properties) {
8
+ const propertyInfo = info.properties[propertyName];
9
+ const propertyValidators = propertyInfo.validators ?? [];
10
+ resultValue[propertyName] = value[propertyName] ?? resultValue[propertyName];
11
+ if (resultValue[propertyName] == null && propertyInfo.isOptional) {
12
+ resultValue[propertyName] = undefined;
13
+ continue;
14
+ }
15
+ for (let propertyValidatorInfo of propertyValidators) {
16
+ const propertyValidatorResult = propertyValidatorInfo.validator(resultValue[propertyName], propertyValidatorInfo.validatorOptions);
17
+ resultValue[propertyName] = propertyValidatorResult.value;
18
+ if (propertyValidatorResult.error) {
19
+ let propertyErrors = propertiesErrors[propertyName];
20
+ if (!propertyErrors) {
21
+ propertyErrors = [];
22
+ propertiesErrors[propertyName] = propertyErrors;
23
+ }
24
+ propertyErrors.push(propertyValidatorResult.error.description);
25
+ }
26
+ }
27
+ }
28
+ if (Object.keys(propertiesErrors).length > 0) {
29
+ return { error: { description: 'Invalid properties', properties: propertiesErrors } };
30
+ }
31
+ return { value: resultValue };
32
+ }
33
+
34
+ export { validateModel };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wabot-dev/framework",
3
- "version": "0.1.0-beta.2",
3
+ "version": "0.1.0-beta.21",
4
4
  "description": "Framework for IA Chat Bots",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -16,7 +16,7 @@
16
16
  "fmt": "prettier --write .",
17
17
  "fmt:check": "prettier --check .",
18
18
  "types:check": "tsc --noEmit",
19
- "elia:dev": "yts --import ./dotenv.config.mjs ./test/elia/runElia.ts"
19
+ "elia:dev": "yts --import ./env.mjs ./test/elia/runElia.ts"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@rollup/plugin-alias": "5.1.1",
@@ -24,6 +24,7 @@
24
24
  "@rollup/plugin-json": "6.1.0",
25
25
  "@rollup/plugin-node-resolve": "16.0.1",
26
26
  "@rollup/plugin-typescript": "12.1.2",
27
+ "@types/html-to-text": "^9.0.4",
27
28
  "@types/node": "22.14.1",
28
29
  "@types/react": "^19.1.2",
29
30
  "@yucacodes/ts": "^0.0.4",
@@ -34,25 +35,23 @@
34
35
  "typescript": "5.8.3"
35
36
  },
36
37
  "peerDependencies": {
38
+ "@anthropic-ai/sdk": "^0.60.0",
37
39
  "@types/debug": "^4.1.12",
38
40
  "@types/express": "^5.0.1",
39
41
  "@types/pg": "^8.11.14",
40
42
  "@yucacodes/ts": "^0.0.4",
41
43
  "body-parser": "^2.2.0",
42
- "class-transformer": "^0.5.1",
43
- "class-validator": "^0.14.1",
44
44
  "debug": "^4.4.0",
45
45
  "dotenv": "^16.5.0",
46
46
  "express": "^5.1.0",
47
47
  "grammy": "^1.36.0",
48
+ "html-to-text": "^9.0.5",
48
49
  "openai": "^4.93.0",
49
50
  "pg": "^8.15.6",
50
51
  "reflect-metadata": "^0.2.2",
51
52
  "short-uuid": "^5.2.0",
52
53
  "socket.io": "^4.8.1",
53
54
  "socket.io-client": "^4.8.1",
54
- "sqlite": "^5.1.1",
55
- "sqlite3": "^5.1.7",
56
55
  "tslib": "^2.8.1",
57
56
  "tsyringe": "^4.9.1",
58
57
  "uuid": "^11.1.0"