cadenlane-cli-2 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -0
  4. package/bin.js +2 -0
  5. package/dist/application/config/config.manager.d.ts +62 -0
  6. package/dist/application/config/config.manager.d.ts.map +1 -0
  7. package/dist/application/config/config.manager.js +146 -0
  8. package/dist/application/config/config.manager.js.map +1 -0
  9. package/dist/application/services/application.service.d.ts +35 -0
  10. package/dist/application/services/application.service.d.ts.map +1 -0
  11. package/dist/application/services/application.service.js +174 -0
  12. package/dist/application/services/application.service.js.map +1 -0
  13. package/dist/application/services/download.service.d.ts +27 -0
  14. package/dist/application/services/download.service.d.ts.map +1 -0
  15. package/dist/application/services/download.service.js +197 -0
  16. package/dist/application/services/download.service.js.map +1 -0
  17. package/dist/application/services/file-naming.service.d.ts +34 -0
  18. package/dist/application/services/file-naming.service.d.ts.map +1 -0
  19. package/dist/application/services/file-naming.service.js +142 -0
  20. package/dist/application/services/file-naming.service.js.map +1 -0
  21. package/dist/application/services/queue.service.d.ts +53 -0
  22. package/dist/application/services/queue.service.d.ts.map +1 -0
  23. package/dist/application/services/queue.service.js +82 -0
  24. package/dist/application/services/queue.service.js.map +1 -0
  25. package/dist/cli/commands/start.command.d.ts +39 -0
  26. package/dist/cli/commands/start.command.d.ts.map +1 -0
  27. package/dist/cli/commands/start.command.js +196 -0
  28. package/dist/cli/commands/start.command.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +86 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/domain/constants/config.constants.d.ts +54 -0
  34. package/dist/domain/constants/config.constants.d.ts.map +1 -0
  35. package/dist/domain/constants/config.constants.js +142 -0
  36. package/dist/domain/constants/config.constants.js.map +1 -0
  37. package/dist/domain/dtos/index.d.ts +4 -0
  38. package/dist/domain/dtos/index.d.ts.map +1 -0
  39. package/dist/domain/dtos/index.js +10 -0
  40. package/dist/domain/dtos/index.js.map +1 -0
  41. package/dist/domain/dtos/log-entry.dto.d.ts +15 -0
  42. package/dist/domain/dtos/log-entry.dto.d.ts.map +1 -0
  43. package/dist/domain/dtos/log-entry.dto.js +64 -0
  44. package/dist/domain/dtos/log-entry.dto.js.map +1 -0
  45. package/dist/domain/dtos/message.dto.d.ts +27 -0
  46. package/dist/domain/dtos/message.dto.d.ts.map +1 -0
  47. package/dist/domain/dtos/message.dto.js +140 -0
  48. package/dist/domain/dtos/message.dto.js.map +1 -0
  49. package/dist/domain/dtos/queue-message.dto.d.ts +10 -0
  50. package/dist/domain/dtos/queue-message.dto.d.ts.map +1 -0
  51. package/dist/domain/dtos/queue-message.dto.js +39 -0
  52. package/dist/domain/dtos/queue-message.dto.js.map +1 -0
  53. package/dist/domain/entities/cli-instance.entity.d.ts +55 -0
  54. package/dist/domain/entities/cli-instance.entity.d.ts.map +1 -0
  55. package/dist/domain/entities/cli-instance.entity.js +132 -0
  56. package/dist/domain/entities/cli-instance.entity.js.map +1 -0
  57. package/dist/domain/entities/index.d.ts +3 -0
  58. package/dist/domain/entities/index.d.ts.map +1 -0
  59. package/dist/domain/entities/index.js +8 -0
  60. package/dist/domain/entities/index.js.map +1 -0
  61. package/dist/domain/entities/log-entry.entity.d.ts +60 -0
  62. package/dist/domain/entities/log-entry.entity.d.ts.map +1 -0
  63. package/dist/domain/entities/log-entry.entity.js +101 -0
  64. package/dist/domain/entities/log-entry.entity.js.map +1 -0
  65. package/dist/domain/entities/message.entity.d.ts +64 -0
  66. package/dist/domain/entities/message.entity.d.ts.map +1 -0
  67. package/dist/domain/entities/message.entity.js +110 -0
  68. package/dist/domain/entities/message.entity.js.map +1 -0
  69. package/dist/domain/enums/error-category.enum.d.ts +11 -0
  70. package/dist/domain/enums/error-category.enum.d.ts.map +1 -0
  71. package/dist/domain/enums/error-category.enum.js +15 -0
  72. package/dist/domain/enums/error-category.enum.js.map +1 -0
  73. package/dist/domain/enums/index.d.ts +4 -0
  74. package/dist/domain/enums/index.d.ts.map +1 -0
  75. package/dist/domain/enums/index.js +10 -0
  76. package/dist/domain/enums/index.js.map +1 -0
  77. package/dist/domain/enums/log-level.enum.d.ts +11 -0
  78. package/dist/domain/enums/log-level.enum.d.ts.map +1 -0
  79. package/dist/domain/enums/log-level.enum.js +15 -0
  80. package/dist/domain/enums/log-level.enum.js.map +1 -0
  81. package/dist/domain/enums/message-status.enum.d.ts +11 -0
  82. package/dist/domain/enums/message-status.enum.d.ts.map +1 -0
  83. package/dist/domain/enums/message-status.enum.js +15 -0
  84. package/dist/domain/enums/message-status.enum.js.map +1 -0
  85. package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts +34 -0
  86. package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts.map +1 -0
  87. package/dist/domain/interfaces/adapters/ifilesystem.adapter.js +3 -0
  88. package/dist/domain/interfaces/adapters/ifilesystem.adapter.js.map +1 -0
  89. package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts +22 -0
  90. package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts.map +1 -0
  91. package/dist/domain/interfaces/adapters/ihttp.adapter.js +3 -0
  92. package/dist/domain/interfaces/adapters/ihttp.adapter.js.map +1 -0
  93. package/dist/domain/interfaces/adapters/index.d.ts +4 -0
  94. package/dist/domain/interfaces/adapters/index.d.ts.map +1 -0
  95. package/dist/domain/interfaces/adapters/index.js +3 -0
  96. package/dist/domain/interfaces/adapters/index.js.map +1 -0
  97. package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts +27 -0
  98. package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts.map +1 -0
  99. package/dist/domain/interfaces/adapters/isupabase.adapter.js +3 -0
  100. package/dist/domain/interfaces/adapters/isupabase.adapter.js.map +1 -0
  101. package/dist/domain/interfaces/repositories/ilog.repository.d.ts +32 -0
  102. package/dist/domain/interfaces/repositories/ilog.repository.d.ts.map +1 -0
  103. package/dist/domain/interfaces/repositories/ilog.repository.js +3 -0
  104. package/dist/domain/interfaces/repositories/ilog.repository.js.map +1 -0
  105. package/dist/domain/interfaces/repositories/imessage.repository.d.ts +39 -0
  106. package/dist/domain/interfaces/repositories/imessage.repository.d.ts.map +1 -0
  107. package/dist/domain/interfaces/repositories/imessage.repository.js +3 -0
  108. package/dist/domain/interfaces/repositories/imessage.repository.js.map +1 -0
  109. package/dist/domain/interfaces/repositories/index.d.ts +4 -0
  110. package/dist/domain/interfaces/repositories/index.d.ts.map +1 -0
  111. package/dist/domain/interfaces/repositories/index.js +3 -0
  112. package/dist/domain/interfaces/repositories/index.js.map +1 -0
  113. package/dist/domain/interfaces/repositories/iqueue.repository.d.ts +75 -0
  114. package/dist/domain/interfaces/repositories/iqueue.repository.d.ts.map +1 -0
  115. package/dist/domain/interfaces/repositories/iqueue.repository.js +3 -0
  116. package/dist/domain/interfaces/repositories/iqueue.repository.js.map +1 -0
  117. package/dist/domain/interfaces/services/idownload.service.d.ts +28 -0
  118. package/dist/domain/interfaces/services/idownload.service.d.ts.map +1 -0
  119. package/dist/domain/interfaces/services/idownload.service.js +3 -0
  120. package/dist/domain/interfaces/services/idownload.service.js.map +1 -0
  121. package/dist/domain/interfaces/services/iqueue.service.d.ts +35 -0
  122. package/dist/domain/interfaces/services/iqueue.service.d.ts.map +1 -0
  123. package/dist/domain/interfaces/services/iqueue.service.js +3 -0
  124. package/dist/domain/interfaces/services/iqueue.service.js.map +1 -0
  125. package/dist/domain/services/path-resolver.service.d.ts +94 -0
  126. package/dist/domain/services/path-resolver.service.d.ts.map +1 -0
  127. package/dist/domain/services/path-resolver.service.js +332 -0
  128. package/dist/domain/services/path-resolver.service.js.map +1 -0
  129. package/dist/domain/validators/index.d.ts +4 -0
  130. package/dist/domain/validators/index.d.ts.map +1 -0
  131. package/dist/domain/validators/index.js +10 -0
  132. package/dist/domain/validators/index.js.map +1 -0
  133. package/dist/domain/validators/message.validator.d.ts +20 -0
  134. package/dist/domain/validators/message.validator.d.ts.map +1 -0
  135. package/dist/domain/validators/message.validator.js +31 -0
  136. package/dist/domain/validators/message.validator.js.map +1 -0
  137. package/dist/domain/validators/path.validator.d.ts +44 -0
  138. package/dist/domain/validators/path.validator.d.ts.map +1 -0
  139. package/dist/domain/validators/path.validator.js +156 -0
  140. package/dist/domain/validators/path.validator.js.map +1 -0
  141. package/dist/domain/validators/url.validator.d.ts +19 -0
  142. package/dist/domain/validators/url.validator.d.ts.map +1 -0
  143. package/dist/domain/validators/url.validator.js +46 -0
  144. package/dist/domain/validators/url.validator.js.map +1 -0
  145. package/dist/index.d.ts +11 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +27 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/infrastructure/adapters/filesystem.adapter.d.ts +35 -0
  150. package/dist/infrastructure/adapters/filesystem.adapter.d.ts.map +1 -0
  151. package/dist/infrastructure/adapters/filesystem.adapter.js +103 -0
  152. package/dist/infrastructure/adapters/filesystem.adapter.js.map +1 -0
  153. package/dist/infrastructure/adapters/http.adapter.d.ts +15 -0
  154. package/dist/infrastructure/adapters/http.adapter.d.ts.map +1 -0
  155. package/dist/infrastructure/adapters/http.adapter.js +80 -0
  156. package/dist/infrastructure/adapters/http.adapter.js.map +1 -0
  157. package/dist/infrastructure/adapters/index.d.ts +4 -0
  158. package/dist/infrastructure/adapters/index.d.ts.map +1 -0
  159. package/dist/infrastructure/adapters/index.js +10 -0
  160. package/dist/infrastructure/adapters/index.js.map +1 -0
  161. package/dist/infrastructure/adapters/pgmq.adapter.d.ts +29 -0
  162. package/dist/infrastructure/adapters/pgmq.adapter.d.ts.map +1 -0
  163. package/dist/infrastructure/adapters/pgmq.adapter.js +84 -0
  164. package/dist/infrastructure/adapters/pgmq.adapter.js.map +1 -0
  165. package/dist/infrastructure/adapters/supabase.adapter.d.ts +79 -0
  166. package/dist/infrastructure/adapters/supabase.adapter.d.ts.map +1 -0
  167. package/dist/infrastructure/adapters/supabase.adapter.js +97 -0
  168. package/dist/infrastructure/adapters/supabase.adapter.js.map +1 -0
  169. package/dist/infrastructure/database/supabase.client.d.ts +20 -0
  170. package/dist/infrastructure/database/supabase.client.d.ts.map +1 -0
  171. package/dist/infrastructure/database/supabase.client.js +36 -0
  172. package/dist/infrastructure/database/supabase.client.js.map +1 -0
  173. package/dist/infrastructure/di/container.d.ts +18 -0
  174. package/dist/infrastructure/di/container.d.ts.map +1 -0
  175. package/dist/infrastructure/di/container.js +103 -0
  176. package/dist/infrastructure/di/container.js.map +1 -0
  177. package/dist/infrastructure/repositories/cli-instance.repository.d.ts +64 -0
  178. package/dist/infrastructure/repositories/cli-instance.repository.d.ts.map +1 -0
  179. package/dist/infrastructure/repositories/cli-instance.repository.js +154 -0
  180. package/dist/infrastructure/repositories/cli-instance.repository.js.map +1 -0
  181. package/dist/infrastructure/repositories/config.repository.d.ts +52 -0
  182. package/dist/infrastructure/repositories/config.repository.d.ts.map +1 -0
  183. package/dist/infrastructure/repositories/config.repository.js +130 -0
  184. package/dist/infrastructure/repositories/config.repository.js.map +1 -0
  185. package/dist/infrastructure/repositories/index.d.ts +4 -0
  186. package/dist/infrastructure/repositories/index.d.ts.map +1 -0
  187. package/dist/infrastructure/repositories/index.js +10 -0
  188. package/dist/infrastructure/repositories/index.js.map +1 -0
  189. package/dist/infrastructure/repositories/log.repository.d.ts +44 -0
  190. package/dist/infrastructure/repositories/log.repository.d.ts.map +1 -0
  191. package/dist/infrastructure/repositories/log.repository.js +108 -0
  192. package/dist/infrastructure/repositories/log.repository.js.map +1 -0
  193. package/dist/infrastructure/repositories/message.repository.d.ts +51 -0
  194. package/dist/infrastructure/repositories/message.repository.d.ts.map +1 -0
  195. package/dist/infrastructure/repositories/message.repository.js +161 -0
  196. package/dist/infrastructure/repositories/message.repository.js.map +1 -0
  197. package/dist/infrastructure/repositories/queue.repository.d.ts +69 -0
  198. package/dist/infrastructure/repositories/queue.repository.d.ts.map +1 -0
  199. package/dist/infrastructure/repositories/queue.repository.js +130 -0
  200. package/dist/infrastructure/repositories/queue.repository.js.map +1 -0
  201. package/dist/infrastructure/utils/connection-health.util.d.ts +23 -0
  202. package/dist/infrastructure/utils/connection-health.util.d.ts.map +1 -0
  203. package/dist/infrastructure/utils/connection-health.util.js +64 -0
  204. package/dist/infrastructure/utils/connection-health.util.js.map +1 -0
  205. package/package.json +105 -0
  206. package/pm2.config.js +104 -0
@@ -0,0 +1,97 @@
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
+ exports.SupabaseAdapter = void 0;
13
+ const supabase_js_1 = require("@supabase/supabase-js");
14
+ const tsyringe_1 = require("tsyringe");
15
+ /**
16
+ * Supabase Adapter
17
+ * Wraps Supabase client and provides abstraction for database operations
18
+ */
19
+ let SupabaseAdapter = class SupabaseAdapter {
20
+ client;
21
+ constructor(client) {
22
+ this.client = client;
23
+ }
24
+ /**
25
+ * Gets the Supabase client instance
26
+ * @returns SupabaseClient
27
+ */
28
+ getClient() {
29
+ return this.client;
30
+ }
31
+ /**
32
+ * Calls a Supabase RPC function
33
+ * @param functionName - Name of the RPC function
34
+ * @param params - Function parameters
35
+ * @returns Function result
36
+ */
37
+ async rpc(functionName, params) {
38
+ return (await this.client.rpc(functionName, params));
39
+ }
40
+ /**
41
+ * Executes a raw SQL query (not implemented - use RPC instead)
42
+ * @param _query - SQL query to execute
43
+ * @param _params - Query parameters
44
+ * @returns Query result
45
+ */
46
+ async executeQuery(_query, _params) {
47
+ throw new Error('executeQuery not implemented. Use RPC functions instead.');
48
+ }
49
+ /**
50
+ * Inserts data into a table
51
+ * @param tableName - Name of the table
52
+ * @param data - Data to insert
53
+ * @returns Insert result
54
+ */
55
+ async insert(tableName, data) {
56
+ return await this.client.from(tableName).insert(data).select();
57
+ }
58
+ /**
59
+ * Updates data in a table
60
+ * @param tableName - Name of the table
61
+ * @param data - Data to update
62
+ * @param filter - Filter to apply
63
+ * @returns Update result
64
+ */
65
+ async update(tableName, data, filter) {
66
+ return await this.client.from(tableName).update(data).eq(filter.column, filter.value).select();
67
+ }
68
+ /**
69
+ * Selects data from a table
70
+ * @param tableName - Name of the table
71
+ * @param columns - Columns to select
72
+ * @param filter - Optional filter to apply
73
+ * @returns Select result
74
+ */
75
+ async select(tableName, columns = '*', filter) {
76
+ let query = this.client.from(tableName).select(columns);
77
+ if (filter) {
78
+ query = query.eq(filter.column, filter.value);
79
+ }
80
+ return (await query);
81
+ }
82
+ /**
83
+ * Deletes data from a table
84
+ * @param tableName - Name of the table
85
+ * @param filter - Filter to apply
86
+ * @returns Delete result
87
+ */
88
+ async delete(tableName, filter) {
89
+ return await this.client.from(tableName).delete().eq(filter.column, filter.value);
90
+ }
91
+ };
92
+ exports.SupabaseAdapter = SupabaseAdapter;
93
+ exports.SupabaseAdapter = SupabaseAdapter = __decorate([
94
+ (0, tsyringe_1.injectable)(),
95
+ __metadata("design:paramtypes", [supabase_js_1.SupabaseClient])
96
+ ], SupabaseAdapter);
97
+ //# sourceMappingURL=supabase.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.adapter.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/supabase.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAuD;AAEvD,uCAAsC;AAUtC;;;GAGG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IACN;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAU,YAAoB,EAAE,MAA4B;QACnE,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAM,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAU,MAAc,EAAE,OAAe;QACzD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAU,SAAiB,EAAE,IAAS;QAChD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAS,EACT,MAAmB;QAEnB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IACjG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,UAAkB,GAAG,EACrB,MAAoB;QAEpB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,MAAM,KAAK,CAAqC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,MAAmB;QACjD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;CACF,CAAA;AAtFY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,qBAAU,GAAE;qCAEiB,4BAAc;GAD/B,eAAe,CAsF3B"}
@@ -0,0 +1,20 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ /**
3
+ * Supabase Client Factory
4
+ * Creates and configures Supabase client instance
5
+ */
6
+ export declare class SupabaseClientFactory {
7
+ private static instance;
8
+ /**
9
+ * Gets or creates a Supabase client instance
10
+ * @param url - Supabase URL
11
+ * @param serviceRoleKey - Service role key for authentication
12
+ * @returns SupabaseClient instance
13
+ */
14
+ static getClient(url: string, serviceRoleKey: string): SupabaseClient;
15
+ /**
16
+ * Resets the client instance (useful for testing)
17
+ */
18
+ static reset(): void;
19
+ }
20
+ //# sourceMappingURL=supabase.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.client.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/supabase.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IAEtD;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc;IAYrE;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseClientFactory = void 0;
4
+ const supabase_js_1 = require("@supabase/supabase-js");
5
+ /**
6
+ * Supabase Client Factory
7
+ * Creates and configures Supabase client instance
8
+ */
9
+ class SupabaseClientFactory {
10
+ static instance = null;
11
+ /**
12
+ * Gets or creates a Supabase client instance
13
+ * @param url - Supabase URL
14
+ * @param serviceRoleKey - Service role key for authentication
15
+ * @returns SupabaseClient instance
16
+ */
17
+ static getClient(url, serviceRoleKey) {
18
+ if (!this.instance) {
19
+ this.instance = (0, supabase_js_1.createClient)(url, serviceRoleKey, {
20
+ auth: {
21
+ autoRefreshToken: false,
22
+ persistSession: false,
23
+ },
24
+ });
25
+ }
26
+ return this.instance;
27
+ }
28
+ /**
29
+ * Resets the client instance (useful for testing)
30
+ */
31
+ static reset() {
32
+ this.instance = null;
33
+ }
34
+ }
35
+ exports.SupabaseClientFactory = SupabaseClientFactory;
36
+ //# sourceMappingURL=supabase.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.client.js","sourceRoot":"","sources":["../../../src/infrastructure/database/supabase.client.ts"],"names":[],"mappings":";;;AAAA,uDAAqE;AAErE;;;GAGG;AACH,MAAa,qBAAqB;IACxB,MAAM,CAAC,QAAQ,GAA0B,IAAI,CAAC;IAEtD;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,GAAW,EAAE,cAAsB;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,0BAAY,EAAC,GAAG,EAAE,cAAc,EAAE;gBAChD,IAAI,EAAE;oBACJ,gBAAgB,EAAE,KAAK;oBACvB,cAAc,EAAE,KAAK;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;;AA1BH,sDA2BC"}
@@ -0,0 +1,18 @@
1
+ import 'reflect-metadata';
2
+ import { container } from 'tsyringe';
3
+ /**
4
+ * Dependency Injection Container Setup
5
+ * Configures all dependencies for the application
6
+ */
7
+ export declare class DIContainer {
8
+ /**
9
+ * Initializes and configures the DI container
10
+ * @returns Configured container
11
+ */
12
+ static setup(): Promise<typeof container>;
13
+ /**
14
+ * Resets the container (useful for testing)
15
+ */
16
+ static reset(): void;
17
+ }
18
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAqBrC;;;GAGG;AACH,qBAAa,WAAW;IACtB;;;OAGG;WACU,KAAK,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC;IAoF/C;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAIrB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DIContainer = void 0;
4
+ require("reflect-metadata");
5
+ const tsyringe_1 = require("tsyringe");
6
+ const supabase_client_1 = require("../database/supabase.client");
7
+ const supabase_adapter_1 = require("../adapters/supabase.adapter");
8
+ const pgmq_adapter_1 = require("../adapters/pgmq.adapter");
9
+ const http_adapter_1 = require("../adapters/http.adapter");
10
+ const filesystem_adapter_1 = require("../adapters/filesystem.adapter");
11
+ const message_repository_1 = require("../repositories/message.repository");
12
+ const log_repository_1 = require("../repositories/log.repository");
13
+ const queue_repository_1 = require("../repositories/queue.repository");
14
+ const config_repository_1 = require("../repositories/config.repository");
15
+ const url_validator_1 = require("../../domain/validators/url.validator");
16
+ const path_validator_1 = require("../../domain/validators/path.validator");
17
+ const message_validator_1 = require("../../domain/validators/message.validator");
18
+ const config_manager_1 = require("../../application/config/config.manager");
19
+ const download_service_1 = require("../../application/services/download.service");
20
+ const queue_service_1 = require("../../application/services/queue.service");
21
+ const application_service_1 = require("../../application/services/application.service");
22
+ const file_naming_service_1 = require("../../application/services/file-naming.service");
23
+ const connection_health_util_1 = require("../utils/connection-health.util");
24
+ /**
25
+ * Dependency Injection Container Setup
26
+ * Configures all dependencies for the application
27
+ */
28
+ class DIContainer {
29
+ /**
30
+ * Initializes and configures the DI container
31
+ * @returns Configured container
32
+ */
33
+ static async setup() {
34
+ // Validate required environment variables
35
+ if (!process.env.SUPABASE_URL || !process.env.SUPABASE_SERVICE_ROLE_KEY) {
36
+ throw new Error('Missing required environment variables: SUPABASE_URL and/or SUPABASE_SERVICE_ROLE_KEY');
37
+ }
38
+ // Register Supabase client first (needed for ConfigRepository)
39
+ const tempClient = supabase_client_1.SupabaseClientFactory.getClient(process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY);
40
+ tsyringe_1.container.register('SupabaseClient', { useValue: tempClient });
41
+ // Validate database connection before proceeding (with shorter timeout for tests)
42
+ console.log('[DIContainer] Validating database connection...');
43
+ const isHealthy = await connection_health_util_1.ConnectionHealthUtil.waitForHealthy(tempClient, 2, 500);
44
+ if (!isHealthy) {
45
+ console.warn('[DIContainer] Database connection check failed, proceeding anyway...');
46
+ // Don't throw in test environment - let tests fail naturally if DB is down
47
+ if (process.env.NODE_ENV === 'production') {
48
+ throw new Error('Failed to connect to Supabase. Please ensure:\n' +
49
+ '1. Supabase is running (run: supabase start)\n' +
50
+ '2. SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct\n' +
51
+ '3. Database migrations are applied');
52
+ }
53
+ }
54
+ else {
55
+ console.log('[DIContainer] Database connection validated successfully');
56
+ }
57
+ // Register SupabaseAdapter (needed for ConfigRepository)
58
+ tsyringe_1.container.register(supabase_adapter_1.SupabaseAdapter, {
59
+ useFactory: (c) => {
60
+ const client = c.resolve('SupabaseClient');
61
+ return new supabase_adapter_1.SupabaseAdapter(client);
62
+ },
63
+ });
64
+ // Register ConfigRepository
65
+ tsyringe_1.container.registerSingleton(config_repository_1.ConfigRepository, config_repository_1.ConfigRepository);
66
+ // Load configuration from database
67
+ const configRepository = tsyringe_1.container.resolve(config_repository_1.ConfigRepository);
68
+ const configManager = new config_manager_1.ConfigManager(configRepository);
69
+ const config = await configManager.load();
70
+ // Register configuration
71
+ tsyringe_1.container.register('AppConfig', { useValue: config });
72
+ // Register Supabase client
73
+ const supabaseClient = supabase_client_1.SupabaseClientFactory.getClient(config.supabase.url, config.supabase.serviceRoleKey);
74
+ tsyringe_1.container.register('SupabaseClient', { useValue: supabaseClient });
75
+ // Adapters already registered above
76
+ tsyringe_1.container.registerSingleton(pgmq_adapter_1.PgmqAdapter, pgmq_adapter_1.PgmqAdapter);
77
+ tsyringe_1.container.registerSingleton(http_adapter_1.HttpAdapter, http_adapter_1.HttpAdapter);
78
+ tsyringe_1.container.registerSingleton(filesystem_adapter_1.FileSystemAdapter, filesystem_adapter_1.FileSystemAdapter);
79
+ // Register validators
80
+ tsyringe_1.container.registerSingleton(url_validator_1.UrlValidator, url_validator_1.UrlValidator);
81
+ tsyringe_1.container.registerSingleton(path_validator_1.PathValidator, path_validator_1.PathValidator);
82
+ tsyringe_1.container.registerSingleton(message_validator_1.MessageValidator, message_validator_1.MessageValidator);
83
+ // Register repositories (ConfigRepository already registered above)
84
+ tsyringe_1.container.registerSingleton(message_repository_1.MessageRepository, message_repository_1.MessageRepository);
85
+ tsyringe_1.container.registerSingleton(log_repository_1.LogRepository, log_repository_1.LogRepository);
86
+ tsyringe_1.container.registerSingleton(queue_repository_1.QueueRepository, queue_repository_1.QueueRepository);
87
+ // Register services
88
+ tsyringe_1.container.registerSingleton(file_naming_service_1.FileNamingService, file_naming_service_1.FileNamingService);
89
+ tsyringe_1.container.registerSingleton(download_service_1.DownloadService, download_service_1.DownloadService);
90
+ tsyringe_1.container.registerSingleton(queue_service_1.QueueService, queue_service_1.QueueService);
91
+ tsyringe_1.container.registerSingleton(application_service_1.ApplicationService, application_service_1.ApplicationService);
92
+ return tsyringe_1.container;
93
+ }
94
+ /**
95
+ * Resets the container (useful for testing)
96
+ */
97
+ static reset() {
98
+ tsyringe_1.container.clearInstances();
99
+ supabase_client_1.SupabaseClientFactory.reset();
100
+ }
101
+ }
102
+ exports.DIContainer = DIContainer;
103
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/infrastructure/di/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { SupabaseAdapter } from '../../infrastructure/adapters/supabase.adapter';
2
+ import { CliInstanceEntity } from '../../domain/entities/cli-instance.entity';
3
+ /**
4
+ * CLI Instance Repository
5
+ * Manages CLI instance registration and tracking
6
+ */
7
+ export declare class CliInstanceRepository {
8
+ private supabase;
9
+ constructor(supabase: SupabaseAdapter);
10
+ /**
11
+ * Get or create a CLI instance
12
+ * @param instanceInfo - Instance information from system
13
+ * @returns Instance ID
14
+ */
15
+ getOrCreate(instanceInfo: {
16
+ instanceName: string;
17
+ hostname: string;
18
+ platform: string;
19
+ platformVersion: string;
20
+ nodeVersion: string;
21
+ appVersion: string;
22
+ downloadDefaultPath: string;
23
+ downloadFallbackPath: string | null;
24
+ }): Promise<string>;
25
+ /**
26
+ * Update heartbeat for an instance
27
+ * @param instanceId - Instance ID
28
+ */
29
+ updateHeartbeat(instanceId: string): Promise<void>;
30
+ /**
31
+ * Record job completion for an instance
32
+ * @param instanceId - Instance ID
33
+ * @param success - Whether job succeeded
34
+ * @param bytesDownloaded - Bytes downloaded (if successful)
35
+ */
36
+ recordJobCompletion(instanceId: string, success: boolean, bytesDownloaded?: number): Promise<void>;
37
+ /**
38
+ * Get instance by ID
39
+ * @param instanceId - Instance ID
40
+ * @returns Instance entity or null
41
+ */
42
+ getById(instanceId: string): Promise<CliInstanceEntity | null>;
43
+ /**
44
+ * Get all active instances
45
+ * @returns Array of instance entities
46
+ */
47
+ getAllActive(): Promise<CliInstanceEntity[]>;
48
+ /**
49
+ * Get instance health status
50
+ * @returns Array of instance health info
51
+ */
52
+ getHealthStatus(): Promise<any[]>;
53
+ /**
54
+ * Update instance status
55
+ * @param instanceId - Instance ID
56
+ * @param status - New status
57
+ */
58
+ updateStatus(instanceId: string, status: 'active' | 'inactive' | 'maintenance'): Promise<void>;
59
+ /**
60
+ * Map database row to entity
61
+ */
62
+ private mapToEntity;
63
+ }
64
+ //# sourceMappingURL=cli-instance.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-instance.repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/cli-instance.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E;;;GAGG;AACH,qBACa,qBAAqB;IACK,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEtE;;;;OAIG;IACG,WAAW,CAAC,YAAY,EAAE;QAC9B,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB;;;OAGG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;;;;OAKG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,eAAe,GAAE,MAAU,GAC1B,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;OAIG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgBpE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAelD;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAavC;;;;OAIG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAC5C,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACH,OAAO,CAAC,WAAW;CAqBpB"}
@@ -0,0 +1,154 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CliInstanceRepository = void 0;
16
+ const tsyringe_1 = require("tsyringe");
17
+ const supabase_adapter_1 = require("../../infrastructure/adapters/supabase.adapter");
18
+ const cli_instance_entity_1 = require("../../domain/entities/cli-instance.entity");
19
+ /**
20
+ * CLI Instance Repository
21
+ * Manages CLI instance registration and tracking
22
+ */
23
+ let CliInstanceRepository = class CliInstanceRepository {
24
+ supabase;
25
+ constructor(supabase) {
26
+ this.supabase = supabase;
27
+ }
28
+ /**
29
+ * Get or create a CLI instance
30
+ * @param instanceInfo - Instance information from system
31
+ * @returns Instance ID
32
+ */
33
+ async getOrCreate(instanceInfo) {
34
+ const { data, error } = await this.supabase.rpc('get_or_create_cli_instance', {
35
+ p_instance_name: instanceInfo.instanceName,
36
+ p_hostname: instanceInfo.hostname,
37
+ p_platform: instanceInfo.platform,
38
+ p_platform_version: instanceInfo.platformVersion,
39
+ p_node_version: instanceInfo.nodeVersion,
40
+ p_app_version: instanceInfo.appVersion,
41
+ p_download_default_path: instanceInfo.downloadDefaultPath,
42
+ p_download_fallback_path: instanceInfo.downloadFallbackPath,
43
+ });
44
+ if (error) {
45
+ throw new Error(`Failed to get or create CLI instance: ${error.message}`);
46
+ }
47
+ return data;
48
+ }
49
+ /**
50
+ * Update heartbeat for an instance
51
+ * @param instanceId - Instance ID
52
+ */
53
+ async updateHeartbeat(instanceId) {
54
+ const { error } = await this.supabase.rpc('update_instance_heartbeat', {
55
+ p_instance_id: instanceId,
56
+ });
57
+ if (error) {
58
+ throw new Error(`Failed to update heartbeat: ${error.message}`);
59
+ }
60
+ }
61
+ /**
62
+ * Record job completion for an instance
63
+ * @param instanceId - Instance ID
64
+ * @param success - Whether job succeeded
65
+ * @param bytesDownloaded - Bytes downloaded (if successful)
66
+ */
67
+ async recordJobCompletion(instanceId, success, bytesDownloaded = 0) {
68
+ const { error } = await this.supabase.rpc('record_instance_job_completion', {
69
+ p_instance_id: instanceId,
70
+ p_success: success,
71
+ p_bytes_downloaded: bytesDownloaded,
72
+ });
73
+ if (error) {
74
+ throw new Error(`Failed to record job completion: ${error.message}`);
75
+ }
76
+ }
77
+ /**
78
+ * Get instance by ID
79
+ * @param instanceId - Instance ID
80
+ * @returns Instance entity or null
81
+ */
82
+ async getById(instanceId) {
83
+ const { data, error } = await this.supabase
84
+ .getClient()
85
+ .from('cli_instances')
86
+ .select('*')
87
+ .eq('id', instanceId)
88
+ .single();
89
+ if (error) {
90
+ if (error.code === 'PGRST116')
91
+ return null; // Not found
92
+ throw new Error(`Failed to get instance: ${error.message}`);
93
+ }
94
+ return this.mapToEntity(data);
95
+ }
96
+ /**
97
+ * Get all active instances
98
+ * @returns Array of instance entities
99
+ */
100
+ async getAllActive() {
101
+ const { data, error } = await this.supabase
102
+ .getClient()
103
+ .from('cli_instances')
104
+ .select('*')
105
+ .eq('status', 'active')
106
+ .order('last_heartbeat_at', { ascending: false });
107
+ if (error) {
108
+ throw new Error(`Failed to get active instances: ${error.message}`);
109
+ }
110
+ return (data || []).map((row) => this.mapToEntity(row));
111
+ }
112
+ /**
113
+ * Get instance health status
114
+ * @returns Array of instance health info
115
+ */
116
+ async getHealthStatus() {
117
+ const { data, error } = await this.supabase
118
+ .getClient()
119
+ .from('cli_instances_health')
120
+ .select('*');
121
+ if (error) {
122
+ throw new Error(`Failed to get health status: ${error.message}`);
123
+ }
124
+ return data || [];
125
+ }
126
+ /**
127
+ * Update instance status
128
+ * @param instanceId - Instance ID
129
+ * @param status - New status
130
+ */
131
+ async updateStatus(instanceId, status) {
132
+ const { error } = await this.supabase
133
+ .getClient()
134
+ .from('cli_instances')
135
+ .update({ status, updated_at: new Date().toISOString() })
136
+ .eq('id', instanceId);
137
+ if (error) {
138
+ throw new Error(`Failed to update instance status: ${error.message}`);
139
+ }
140
+ }
141
+ /**
142
+ * Map database row to entity
143
+ */
144
+ mapToEntity(row) {
145
+ return new cli_instance_entity_1.CliInstanceEntity(row.id, row.instance_name, row.hostname, row.platform, row.platform_version, row.node_version, row.app_version, row.download_default_path, row.download_fallback_path, row.status, row.last_heartbeat_at ? new Date(row.last_heartbeat_at) : null, row.last_job_at ? new Date(row.last_job_at) : null, row.total_jobs_processed || 0, row.total_jobs_failed || 0, row.total_bytes_downloaded || 0, new Date(row.created_at), new Date(row.updated_at));
146
+ }
147
+ };
148
+ exports.CliInstanceRepository = CliInstanceRepository;
149
+ exports.CliInstanceRepository = CliInstanceRepository = __decorate([
150
+ (0, tsyringe_1.injectable)(),
151
+ __param(0, (0, tsyringe_1.inject)(supabase_adapter_1.SupabaseAdapter)),
152
+ __metadata("design:paramtypes", [supabase_adapter_1.SupabaseAdapter])
153
+ ], CliInstanceRepository);
154
+ //# sourceMappingURL=cli-instance.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-instance.repository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/cli-instance.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { SupabaseAdapter } from '../../infrastructure/adapters/supabase.adapter';
2
+ /**
3
+ * Configuration entry from database
4
+ */
5
+ export interface ConfigEntry {
6
+ id: string;
7
+ config_key: string;
8
+ config_value: string;
9
+ config_type: 'string' | 'number' | 'boolean';
10
+ description?: string;
11
+ is_sensitive: boolean;
12
+ created_at: Date;
13
+ updated_at: Date;
14
+ }
15
+ /**
16
+ * Parsed configuration value
17
+ */
18
+ export type ConfigValue = string | number | boolean;
19
+ /**
20
+ * Configuration Repository
21
+ * Manages application configuration stored in the database
22
+ */
23
+ export declare class ConfigRepository {
24
+ private adapter;
25
+ private readonly TABLE_NAME;
26
+ constructor(adapter: SupabaseAdapter);
27
+ /**
28
+ * Get a single configuration value by key
29
+ */
30
+ get(key: string): Promise<ConfigValue | null>;
31
+ /**
32
+ * Get all configuration entries
33
+ */
34
+ getAll(): Promise<Record<string, ConfigValue>>;
35
+ /**
36
+ * Get configuration entries by prefix (e.g., 'queue.' returns all queue configs)
37
+ */
38
+ getByPrefix(prefix: string): Promise<Record<string, ConfigValue>>;
39
+ /**
40
+ * Set a configuration value
41
+ */
42
+ set(key: string, value: ConfigValue): Promise<void>;
43
+ /**
44
+ * Delete a configuration entry
45
+ */
46
+ delete(key: string): Promise<void>;
47
+ /**
48
+ * Parse configuration value based on its type
49
+ */
50
+ private parseValue;
51
+ }
52
+ //# sourceMappingURL=config.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/config.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD;;;GAGG;AACH,qBACa,gBAAgB;IAGU,OAAO,CAAC,OAAO;IAFpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAEE,OAAO,EAAE,eAAe;IAErE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAcnD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IA6BpD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAsBvE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BzD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACH,OAAO,CAAC,UAAU;CAWnB"}