@zintrust/core 0.1.22 → 0.1.23

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 (229) hide show
  1. package/bin/z.d.ts +1 -1
  2. package/bin/z.js +1 -1
  3. package/bin/zin.d.ts +1 -1
  4. package/bin/zin.js +1 -1
  5. package/bin/zintrust-main.d.ts +1 -1
  6. package/bin/zintrust-main.js +2 -2
  7. package/bin/zintrust-microservices.d.ts +1 -1
  8. package/bin/zintrust-microservices.js +1 -1
  9. package/bin/zintrust.d.ts +1 -1
  10. package/bin/zintrust.js +1 -1
  11. package/bin/zt.d.ts +1 -1
  12. package/bin/zt.js +1 -1
  13. package/package.json +2 -3
  14. package/public/index.html +3 -3
  15. package/routes/api.js +1 -1
  16. package/routes/health.d.ts +3 -4
  17. package/routes/health.d.ts.map +1 -1
  18. package/routes/health.js +3 -125
  19. package/src/boot/Application.d.ts.map +1 -1
  20. package/src/boot/Application.js +11 -22
  21. package/src/boot/bootstrap.d.ts +1 -1
  22. package/src/boot/bootstrap.js +48 -7
  23. package/src/builder/BundleOptimizer.d.ts +1 -1
  24. package/src/builder/BundleOptimizer.js +1 -1
  25. package/src/cache/drivers/KVRemoteDriver.d.ts +1 -1
  26. package/src/cache/drivers/KVRemoteDriver.js +1 -1
  27. package/src/cli/CLI.d.ts.map +1 -1
  28. package/src/cli/CLI.js +15 -1
  29. package/src/cli/ErrorHandler.js +3 -3
  30. package/src/cli/commands/AddCommand.d.ts +1 -1
  31. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  32. package/src/cli/commands/AddCommand.js +1 -1
  33. package/src/cli/commands/DbSeedCommand.js +1 -1
  34. package/src/cli/commands/MakeMailTemplateCommand.js +2 -1
  35. package/src/cli/commands/MakeNotificationTemplateCommand.js +2 -1
  36. package/src/cli/commands/MigrateWorkerCommand.d.ts +9 -0
  37. package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -0
  38. package/src/cli/commands/MigrateWorkerCommand.js +182 -0
  39. package/src/cli/commands/NewCommand.d.ts +1 -1
  40. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  41. package/src/cli/commands/NewCommand.js +21 -7
  42. package/src/cli/commands/PublishCommand.d.ts +5 -0
  43. package/src/cli/commands/PublishCommand.d.ts.map +1 -0
  44. package/src/cli/commands/PublishCommand.js +54 -0
  45. package/src/cli/commands/QACommand.js +4 -4
  46. package/src/cli/commands/ResourceControlCommand.d.ts +6 -0
  47. package/src/cli/commands/ResourceControlCommand.d.ts.map +1 -0
  48. package/src/cli/commands/ResourceControlCommand.js +43 -0
  49. package/src/cli/commands/SimulateCommand.d.ts +1 -1
  50. package/src/cli/commands/SimulateCommand.js +4 -4
  51. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  52. package/src/cli/commands/StartCommand.js +19 -7
  53. package/src/cli/commands/UpgradeCommand.d.ts +1 -1
  54. package/src/cli/commands/UpgradeCommand.js +2 -2
  55. package/src/cli/commands/WorkerCommands.d.ts +17 -0
  56. package/src/cli/commands/WorkerCommands.d.ts.map +1 -0
  57. package/src/cli/commands/WorkerCommands.js +264 -0
  58. package/src/cli/commands/index.d.ts +2 -0
  59. package/src/cli/commands/index.d.ts.map +1 -1
  60. package/src/cli/commands/index.js +2 -0
  61. package/src/cli/config/ConfigSchema.d.ts +1 -1
  62. package/src/cli/config/ConfigSchema.d.ts.map +1 -1
  63. package/src/cli/config/ConfigSchema.js +4 -3
  64. package/src/cli/scaffolding/ProjectScaffolder.js +5 -5
  65. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  66. package/src/cli/scaffolding/RouteGenerator.js +21 -2
  67. package/src/cli/scaffolding/TemplateEngine.js +1 -1
  68. package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
  69. package/src/common/ExternalServiceUtils.d.ts +63 -0
  70. package/src/common/ExternalServiceUtils.d.ts.map +1 -0
  71. package/src/common/ExternalServiceUtils.js +116 -0
  72. package/src/common/HealthRoutes.d.ts +10 -0
  73. package/src/common/HealthRoutes.d.ts.map +1 -0
  74. package/src/common/HealthRoutes.js +114 -0
  75. package/src/config/SecretsManager.d.ts.map +1 -1
  76. package/src/config/SecretsManager.js +2 -1
  77. package/src/config/app.d.ts +2 -1
  78. package/src/config/app.d.ts.map +1 -1
  79. package/src/config/app.js +98 -52
  80. package/src/config/broadcast.d.ts.map +1 -1
  81. package/src/config/broadcast.js +1 -1
  82. package/src/config/cache.d.ts.map +1 -1
  83. package/src/config/cache.js +2 -2
  84. package/src/config/database.d.ts.map +1 -1
  85. package/src/config/database.js +24 -5
  86. package/src/config/env.d.ts +43 -1
  87. package/src/config/env.d.ts.map +1 -1
  88. package/src/config/env.js +68 -21
  89. package/src/config/index.d.ts +10 -1
  90. package/src/config/index.d.ts.map +1 -1
  91. package/src/config/index.js +1 -0
  92. package/src/config/mail.d.ts.map +1 -1
  93. package/src/config/mail.js +3 -3
  94. package/src/config/middleware.d.ts.map +1 -1
  95. package/src/config/middleware.js +1 -1
  96. package/src/config/notification.d.ts.map +1 -1
  97. package/src/config/notification.js +2 -2
  98. package/src/config/queue.d.ts +14 -0
  99. package/src/config/queue.d.ts.map +1 -1
  100. package/src/config/queue.js +61 -36
  101. package/src/config/security.js +2 -2
  102. package/src/config/storage.d.ts.map +1 -1
  103. package/src/config/storage.js +1 -1
  104. package/src/config/type.d.ts +111 -0
  105. package/src/config/type.d.ts.map +1 -1
  106. package/src/config/workers.d.ts +13 -0
  107. package/src/config/workers.d.ts.map +1 -0
  108. package/src/config/workers.js +173 -0
  109. package/src/database/Paginator.d.ts +37 -0
  110. package/src/database/Paginator.d.ts.map +1 -0
  111. package/src/database/Paginator.js +81 -0
  112. package/src/exceptions/ZintrustError.d.ts +5 -2
  113. package/src/exceptions/ZintrustError.d.ts.map +1 -1
  114. package/src/exceptions/ZintrustError.js +6 -2
  115. package/src/features/Auth.d.ts +1 -1
  116. package/src/features/Auth.d.ts.map +1 -1
  117. package/src/features/Auth.js +3 -2
  118. package/src/features/Queue.d.ts.map +1 -1
  119. package/src/features/Queue.js +0 -2
  120. package/src/index.d.ts +15 -5
  121. package/src/index.d.ts.map +1 -1
  122. package/src/index.js +24 -3
  123. package/src/microservices/MicroserviceBootstrap.d.ts.map +1 -1
  124. package/src/microservices/MicroserviceBootstrap.js +3 -1
  125. package/src/microservices/MicroserviceGenerator.js +4 -4
  126. package/src/microservices/MicroserviceManager.d.ts +1 -1
  127. package/src/microservices/MicroserviceManager.js +1 -1
  128. package/src/middleware/RateLimiter.d.ts.map +1 -1
  129. package/src/middleware/RateLimiter.js +4 -3
  130. package/src/node-singletons/crypto.d.ts +1 -1
  131. package/src/node-singletons/crypto.d.ts.map +1 -1
  132. package/src/node-singletons/crypto.js +1 -1
  133. package/src/node-singletons/os.d.ts +10 -1
  134. package/src/node-singletons/os.d.ts.map +1 -1
  135. package/src/node-singletons/os.js +10 -1
  136. package/src/openapi/OpenApiGenerator.js +2 -2
  137. package/src/orm/ConnectionManager.d.ts +1 -1
  138. package/src/orm/ConnectionManager.d.ts.map +1 -1
  139. package/src/orm/ConnectionManager.js +37 -19
  140. package/src/orm/Model.d.ts +8 -1
  141. package/src/orm/Model.d.ts.map +1 -1
  142. package/src/orm/Model.js +85 -24
  143. package/src/orm/QueryBuilder.d.ts +12 -2
  144. package/src/orm/QueryBuilder.d.ts.map +1 -1
  145. package/src/orm/QueryBuilder.js +438 -38
  146. package/src/orm/Relationships.d.ts +61 -1
  147. package/src/orm/Relationships.d.ts.map +1 -1
  148. package/src/orm/Relationships.js +190 -0
  149. package/src/orm/adapters/D1RemoteAdapter.d.ts +1 -1
  150. package/src/orm/adapters/D1RemoteAdapter.js +1 -1
  151. package/src/performance/Optimizer.d.ts.map +1 -1
  152. package/src/performance/Optimizer.js +2 -4
  153. package/src/routing/CoreRoutes.d.ts +1 -1
  154. package/src/routing/CoreRoutes.d.ts.map +1 -1
  155. package/src/routing/CoreRoutes.js +2 -116
  156. package/src/routing/error.d.ts.map +1 -1
  157. package/src/routing/error.js +3 -2
  158. package/src/routing/publicRoot.d.ts.map +1 -1
  159. package/src/routing/publicRoot.js +4 -2
  160. package/src/runtime/PluginAutoImports.d.ts.map +1 -1
  161. package/src/runtime/PluginAutoImports.js +20 -4
  162. package/src/runtime/PluginManager.d.ts.map +1 -1
  163. package/src/runtime/PluginManager.js +23 -6
  164. package/src/runtime/RuntimeAdapter.d.ts +3 -3
  165. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  166. package/src/runtime/StartupConfigFileRegistry.d.ts +2 -1
  167. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
  168. package/src/runtime/StartupConfigFileRegistry.js +2 -1
  169. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  170. package/src/runtime/adapters/CloudflareAdapter.js +1 -1
  171. package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
  172. package/src/runtime/adapters/DenoAdapter.js +1 -1
  173. package/src/runtime/adapters/FargateAdapter.d.ts +2 -2
  174. package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
  175. package/src/runtime/adapters/FargateAdapter.js +1 -1
  176. package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
  177. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  178. package/src/runtime/adapters/LambdaAdapter.js +6 -4
  179. package/src/runtime/adapters/NodeServerAdapter.js +1 -1
  180. package/src/scripts/GenerateEnvArtifacts.js +1 -1
  181. package/src/security/SignedRequest.js +1 -1
  182. package/src/security/StartupSecretValidation.d.ts.map +1 -1
  183. package/src/security/StartupSecretValidation.js +7 -1
  184. package/src/start.d.ts.map +1 -1
  185. package/src/start.js +0 -2
  186. package/src/templates/features/Auth.ts.tpl +4 -4
  187. package/src/templates/project/basic/README.md.tpl +1 -1
  188. package/src/templates/project/basic/app/Middleware/index.ts.tpl +1 -1
  189. package/src/templates/project/basic/config/notification.ts.tpl +1 -1
  190. package/src/templates/project/basic/routes/api.ts.tpl +1 -3
  191. package/src/templates/project/basic/src/index.ts.tpl +1 -1
  192. package/src/templates/project/basic/src/zintrust.plugins.ts.tpl +1 -1
  193. package/src/templates/project/basic/template.json +1 -1
  194. package/src/toolkit/Secrets/index.d.ts.map +1 -1
  195. package/src/toolkit/Secrets/index.js +13 -9
  196. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -1
  197. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +20 -7
  198. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -1
  199. package/src/toolkit/Secrets/providers/CloudflareKv.js +19 -6
  200. package/src/tools/http/Http.js +1 -1
  201. package/src/tools/mail/drivers/Ses.d.ts.map +1 -1
  202. package/src/tools/mail/drivers/Ses.js +5 -4
  203. package/src/tools/mail/templates/index.js +2 -2
  204. package/src/tools/notification/drivers/Termii.d.ts.map +1 -1
  205. package/src/tools/notification/drivers/Termii.js +6 -17
  206. package/src/tools/notification/testingHelpers.d.ts.map +1 -1
  207. package/src/tools/queue/Queue.d.ts.map +1 -1
  208. package/src/tools/queue/Queue.js +3 -5
  209. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  210. package/src/tools/queue/drivers/Redis.js +7 -1
  211. package/src/tools/storage/drivers/S3.d.ts.map +1 -1
  212. package/src/tools/storage/drivers/S3.js +16 -3
  213. package/src/routes/health.d.ts +0 -2
  214. package/src/routes/health.d.ts.map +0 -1
  215. package/src/routes/health.js +0 -1
  216. package/src/runtime/RuntimeDetector.d.ts +0 -15
  217. package/src/runtime/RuntimeDetector.d.ts.map +0 -1
  218. package/src/runtime/RuntimeDetector.js +0 -271
  219. package/src/templates/project/basic/routes/health.ts.tpl +0 -143
  220. package/src/templates/project/basic/routes/metrics.ts.tpl +0 -22
  221. package/src/workers/BroadcastWorker.d.ts +0 -22
  222. package/src/workers/BroadcastWorker.d.ts.map +0 -1
  223. package/src/workers/BroadcastWorker.js +0 -24
  224. package/src/workers/NotificationWorker.d.ts +0 -22
  225. package/src/workers/NotificationWorker.d.ts.map +0 -1
  226. package/src/workers/NotificationWorker.js +0 -23
  227. package/src/workers/createQueueWorker.d.ts +0 -24
  228. package/src/workers/createQueueWorker.d.ts.map +0 -1
  229. package/src/workers/createQueueWorker.js +0 -114
@@ -1 +1 @@
1
- {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/queue/drivers/Redis.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAevD,eAAO,MAAM,UAAU;uBAuDL,CAAC,mBAAmB,MAAM,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;uBAQxD,CAAC,mBAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;2BAY7D,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;6BAMjC,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;4BAKzB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAKzC,CAAC;AAEL,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/queue/drivers/Redis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAoBvD,eAAO,MAAM,UAAU;uBAuDL,CAAC,mBAAmB,MAAM,WAAW,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;uBAQxD,CAAC,mBAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;2BAY7D,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;6BAMjC,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;4BAKzB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAKzC,CAAC;AAEL,eAAe,UAAU,CAAC"}
@@ -1,7 +1,13 @@
1
1
  import { generateUuid } from '../../../common/utility.js';
2
+ import { Env } from '../../../config/env.js';
2
3
  import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
3
4
  const getRedisUrl = () => {
4
- const url = (process.env['REDIS_URL'] ?? '').trim();
5
+ const anyEnv = Env;
6
+ const fromEnv = typeof anyEnv.get === 'function' ? anyEnv.get('REDIS_URL', '') : '';
7
+ const hasProcess = typeof process === 'object' && process !== null;
8
+ const fallback = hasProcess ? (process.env?.['REDIS_URL'] ?? '') : '';
9
+ const trimmed = fromEnv.trim();
10
+ const url = (trimmed.length > 0 ? fromEnv : String(fallback)).trim();
5
11
  return url.length > 0 ? url : null;
6
12
  };
7
13
  export const RedisQueue = (() => {
@@ -1 +1 @@
1
- {"version":3,"file":"S3.d.ts","sourceRoot":"","sources":["../../../../../src/tools/storage/drivers/S3.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAAC;AAwGF,eAAO,MAAM,QAAQ;gBACD,QAAQ,OAAO,MAAM,WAAW,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBA8CjE,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;mBA0CpC,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAkCxC,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAoC9C,QAAQ,OAAO,MAAM,GAAG,MAAM;oBAOhC,QAAQ,OACX,MAAM,YACD;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;KAAE,GACvD,MAAM;EAqDT,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"S3.d.ts","sourceRoot":"","sources":["../../../../../src/tools/storage/drivers/S3.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAAC;AAqHF,eAAO,MAAM,QAAQ;gBACD,QAAQ,OAAO,MAAM,WAAW,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBA8CjE,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;mBA0CpC,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAkCxC,QAAQ,OAAO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAoC9C,QAAQ,OAAO,MAAM,GAAG,MAAM;oBAOhC,QAAQ,OACX,MAAM,YACD;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;KAAE,GACvD,MAAM;EAqDT,CAAC;AAEH,eAAe,QAAQ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { AwsSigV4 } from '../../../common/index.js';
2
+ import { Env } from '../../../config/env.js';
2
3
  import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
3
4
  import { createHash, createHmac } from '../../../node-singletons/crypto.js';
4
5
  const sha256Hex = (data) => createHash('sha256').update(data).digest('hex');
@@ -51,9 +52,21 @@ const buildCanonicalQueryString = (params) => {
51
52
  return entries.map(([k, v]) => `${k}=${v}`).join('&');
52
53
  };
53
54
  const getCredentials = (config) => {
54
- const accessKeyId = config.accessKeyId ?? process.env['AWS_ACCESS_KEY_ID'] ?? '';
55
- const secretAccessKey = config.secretAccessKey ?? process.env['AWS_SECRET_ACCESS_KEY'] ?? '';
56
- const sessionToken = process.env['AWS_SESSION_TOKEN'] ?? undefined;
55
+ const readEnvString = (key) => {
56
+ const anyEnv = Env;
57
+ const fromEnv = typeof anyEnv.get === 'function' ? anyEnv.get(key, '') : '';
58
+ if (typeof fromEnv === 'string' && fromEnv.trim() !== '')
59
+ return fromEnv;
60
+ if (typeof process !== 'undefined') {
61
+ const raw = process.env?.[key];
62
+ if (typeof raw === 'string')
63
+ return raw;
64
+ }
65
+ return fromEnv ?? '';
66
+ };
67
+ const accessKeyId = config.accessKeyId || readEnvString('AWS_ACCESS_KEY_ID') || Env.AWS_ACCESS_KEY_ID;
68
+ const secretAccessKey = config.secretAccessKey || readEnvString('AWS_SECRET_ACCESS_KEY') || Env.AWS_SECRET_ACCESS_KEY;
69
+ const sessionToken = readEnvString('AWS_SESSION_TOKEN') || Env.AWS_SESSION_TOKEN || undefined;
57
70
  if (accessKeyId.trim() === '' || secretAccessKey.trim() === '') {
58
71
  throw ErrorFactory.createConfigError('S3: missing AWS credentials');
59
72
  }
@@ -1,2 +0,0 @@
1
- export { registerHealthRoutes } from '../../routes/health';
2
- //# sourceMappingURL=health.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +0,0 @@
1
- export { registerHealthRoutes } from '../../routes/health.js';
@@ -1,15 +0,0 @@
1
- import type { AdapterConfig, RuntimeAdapter, ZintrustHandler } from './RuntimeAdapter';
2
- export declare const RuntimeDetector: Readonly<{
3
- RUNTIME_VAR: "RUNTIME";
4
- AUTO: "auto";
5
- detectRuntime: () => string;
6
- createAdapter: (config: AdapterConfig) => RuntimeAdapter;
7
- createAdapterForRuntime: (runtime: string, config: AdapterConfig) => RuntimeAdapter;
8
- getRuntimeInfo: () => Record<string, unknown>;
9
- }>;
10
- export declare const ApplicationBootstrap: Readonly<{
11
- initialize: (handler: ZintrustHandler) => Promise<void>;
12
- shutdown: (signal?: string) => Promise<void>;
13
- setupGracefulShutdown: () => void;
14
- }>;
15
- //# sourceMappingURL=RuntimeDetector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RuntimeDetector.d.ts","sourceRoot":"","sources":["../../../src/runtime/RuntimeDetector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAkK9F,eAAO,MAAM,eAAe;;;yBA9GF,MAAM;4BAyBD,aAAa,KAAG,cAAc;uCAQnB,MAAM,UAAU,aAAa,KAAG,cAAc;0BAuD7D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA6BhD,CAAC;AA8IH,eAAO,MAAM,oBAAoB;0BAtGE,eAAe,KAAG,OAAO,CAAC,IAAI,CAAC;wBA0DlC,MAAM,KAAe,OAAO,CAAC,IAAI,CAAC;iCAmChC,IAAI;EAapC,CAAC"}
@@ -1,271 +0,0 @@
1
- import { Env } from '../config/env.js';
2
- import Logger from '../config/logger.js';
3
- import { ErrorFactory } from '../exceptions/ZintrustError.js';
4
- import { CloudflareAdapter } from './adapters/CloudflareAdapter.js';
5
- import { DenoAdapter } from './adapters/DenoAdapter.js';
6
- import { FargateAdapter } from './adapters/FargateAdapter.js';
7
- import { LambdaAdapter } from './adapters/LambdaAdapter.js';
8
- import { NodeServerAdapter } from './adapters/NodeServerAdapter.js';
9
- /**
10
- * Runtime detector - automatically selects appropriate adapter based on environment
11
- * Supports: Lambda, Fargate, Cloudflare Workers, Deno, and standard Node.js
12
- */
13
- const RUNTIME_VAR = 'RUNTIME';
14
- const AUTO = 'auto';
15
- function ensureInstanceOfCompat(adapterExport) {
16
- if (typeof adapterExport === 'function' || adapterExport === null)
17
- return;
18
- if (typeof adapterExport !== 'object')
19
- return;
20
- const obj = adapterExport;
21
- if (obj[Symbol.hasInstance] !== undefined)
22
- return;
23
- // Adapters are typically exported as sealed/frozen namespaces.
24
- // Some tests mock adapters as plain extensible objects and still assert via `instanceof`.
25
- // Only patch mocks; never attempt to mutate a sealed export.
26
- if (Object.isExtensible(obj) === false)
27
- return;
28
- try {
29
- Object.defineProperty(obj, Symbol.hasInstance, {
30
- value: (instance) => typeof instance === 'object' && instance !== null,
31
- configurable: true,
32
- });
33
- }
34
- catch {
35
- // Best-effort only; never crash runtime detection because of test-compat shims.
36
- }
37
- }
38
- // Some tests mock adapters as plain factory objects (not constructors) but still
39
- // assert via `instanceof`. Adding Symbol.hasInstance avoids a TypeError.
40
- ensureInstanceOfCompat(LambdaAdapter);
41
- ensureInstanceOfCompat(FargateAdapter);
42
- ensureInstanceOfCompat(CloudflareAdapter);
43
- ensureInstanceOfCompat(DenoAdapter);
44
- ensureInstanceOfCompat(NodeServerAdapter);
45
- function hasEnvValue(key) {
46
- return Env.get(key).trim() !== '';
47
- }
48
- /**
49
- * Detect current runtime environment
50
- */
51
- const detectRuntime = () => {
52
- const explicit = Env.get('RUNTIME').trim();
53
- if (explicit !== '' && explicit !== 'auto')
54
- return explicit;
55
- // Auto-detection logic
56
- if (isLambda() === true) {
57
- return 'lambda';
58
- }
59
- if (isCloudflare() === true) {
60
- return 'cloudflare';
61
- }
62
- if (isDeno() === true) {
63
- return 'deno';
64
- }
65
- // Default to nodejs for containers (Fargate, Docker, Cloud Run)
66
- return 'nodejs';
67
- };
68
- /**
69
- * Create appropriate adapter for detected runtime
70
- */
71
- const createAdapter = (config) => {
72
- const runtime = detectRuntime();
73
- return createAdapterForRuntime(runtime, config);
74
- };
75
- /**
76
- * Create adapter for specific runtime
77
- */
78
- const createAdapterForRuntime = (runtime, config) => {
79
- const logger = config.logger ?? createDefaultLogger();
80
- switch (runtime.toLowerCase()) {
81
- case 'lambda':
82
- logger.info('Using Lambda adapter');
83
- return LambdaAdapter.create(config);
84
- case 'fargate':
85
- logger.info('Using Fargate adapter');
86
- return FargateAdapter.create(config);
87
- case 'cloudflare':
88
- logger.info('Using Cloudflare Workers adapter');
89
- return CloudflareAdapter.create(config);
90
- case 'deno':
91
- logger.info('Using Deno adapter');
92
- return DenoAdapter.create(config);
93
- case 'nodejs':
94
- default:
95
- logger.info('Using Node.js HTTP server adapter');
96
- return NodeServerAdapter.create(config);
97
- }
98
- };
99
- /**
100
- * Check if running on AWS Lambda
101
- */
102
- function isLambda() {
103
- return (hasEnvValue('LAMBDA_TASK_ROOT') === true ||
104
- hasEnvValue('AWS_LAMBDA_FUNCTION_NAME') === true ||
105
- hasEnvValue('AWS_EXECUTION_ENV') === true);
106
- }
107
- /**
108
- * Check if running on Cloudflare Workers
109
- */
110
- function isCloudflare() {
111
- return globalThis.CF !== undefined;
112
- }
113
- /**
114
- * Check if running on Deno
115
- */
116
- function isDeno() {
117
- return globalThis.Deno !== undefined;
118
- }
119
- /**
120
- * Get runtime information for logging/debugging
121
- */
122
- const getRuntimeInfo = () => {
123
- const runtime = detectRuntime();
124
- const info = {
125
- detected_runtime: runtime,
126
- node_env: Env.NODE_ENV,
127
- node_version: process.version,
128
- };
129
- if (runtime === 'lambda') {
130
- info['lambda_function_name'] = Env.get('AWS_LAMBDA_FUNCTION_NAME', '');
131
- info['lambda_function_version'] = Env.get('AWS_LAMBDA_FUNCTION_VERSION', '');
132
- info['aws_region'] = Env.get('AWS_REGION', '');
133
- }
134
- else if (runtime === 'deno') {
135
- // @ts-expect-error - Deno global
136
- info.deno_version = globalThis['Deno']?.version?.deno;
137
- }
138
- return info;
139
- };
140
- export const RuntimeDetector = Object.freeze({
141
- RUNTIME_VAR,
142
- AUTO,
143
- detectRuntime,
144
- createAdapter,
145
- createAdapterForRuntime,
146
- getRuntimeInfo,
147
- });
148
- const runtimeState = {
149
- isShuttingDown: false,
150
- };
151
- const withTimeout = async (promise, timeoutMs, label) => {
152
- if (timeoutMs <= 0)
153
- return promise;
154
- let timeoutId;
155
- try {
156
- const timeoutPromise = new Promise((_, reject) => {
157
- timeoutId = globalThis.setTimeout(() => {
158
- reject(ErrorFactory.createGeneralError(label, { timeoutMs }));
159
- }, timeoutMs);
160
- });
161
- return await Promise.race([promise, timeoutPromise]);
162
- }
163
- finally {
164
- if (timeoutId !== undefined)
165
- globalThis.clearTimeout(timeoutId);
166
- }
167
- };
168
- /**
169
- * Application bootstrap factory
170
- * Creates and configures runtime-appropriate HTTP handler
171
- */
172
- /**
173
- * Initialize application for current runtime
174
- */
175
- const initialize = async (handler) => {
176
- const config = {
177
- handler,
178
- logger: createDefaultLogger(),
179
- timeout: Env.REQUEST_TIMEOUT,
180
- maxBodySize: Env.MAX_BODY_SIZE,
181
- };
182
- const runtime = detectRuntime();
183
- const adapter = createAdapterForRuntime(runtime, config);
184
- runtimeState.adapter = adapter;
185
- runtimeState.runtime = runtime;
186
- const logger = adapter.getLogger();
187
- const runtimeInfo = getRuntimeInfo();
188
- logger.info('Application initializing', runtimeInfo);
189
- // Start appropriate server based on runtime
190
- switch (runtime) {
191
- case 'fargate':
192
- case 'nodejs': {
193
- const port = Env.PORT;
194
- const host = Env.HOST;
195
- const serverAdapter = adapter;
196
- if (serverAdapter.startServer !== undefined) {
197
- await serverAdapter.startServer(port, host);
198
- }
199
- return;
200
- }
201
- case 'deno': {
202
- const port = Env.PORT;
203
- const host = '0.0.0.0';
204
- const serverAdapter = adapter;
205
- if (serverAdapter.startServer !== undefined) {
206
- await serverAdapter.startServer(port, host);
207
- }
208
- return;
209
- }
210
- case 'lambda':
211
- case 'cloudflare':
212
- // These platforms handle request routing externally
213
- logger.info('Adapter initialized, ready for events');
214
- return;
215
- }
216
- };
217
- /**
218
- * Handle graceful shutdown
219
- */
220
- const shutdown = async (signal = 'SIGTERM') => {
221
- const logger = createDefaultLogger();
222
- logger.info(`Received ${signal}, gracefully shutting down...`);
223
- if (runtimeState.isShuttingDown) {
224
- process.exit(0);
225
- return;
226
- }
227
- runtimeState.isShuttingDown = true;
228
- const timeoutMs = Number(Env.SHUTDOWN_TIMEOUT);
229
- try {
230
- const adapter = runtimeState.adapter;
231
- if (typeof adapter?.stop === 'function') {
232
- await withTimeout(adapter.stop(), timeoutMs, 'Runtime adapter shutdown timed out');
233
- }
234
- process.exit(0);
235
- }
236
- catch (error) {
237
- logger.error('Graceful shutdown failed', error);
238
- process.exit(1);
239
- }
240
- finally {
241
- // In real runtimes `process.exit(...)` ends execution, but in tests it's mocked.
242
- runtimeState.isShuttingDown = false;
243
- }
244
- };
245
- /**
246
- * Setup graceful shutdown handlers
247
- */
248
- const setupGracefulShutdown = () => {
249
- const signals = ['SIGTERM', 'SIGINT'];
250
- signals.forEach((signal) => {
251
- process.on(signal, async () => {
252
- await shutdown(signal);
253
- });
254
- });
255
- };
256
- export const ApplicationBootstrap = Object.freeze({
257
- initialize,
258
- shutdown,
259
- setupGracefulShutdown,
260
- });
261
- function createDefaultLogger() {
262
- return {
263
- debug: (msg, data) => Logger.debug(`[Runtime] ${msg}`, data === undefined ? undefined : data),
264
- info: (msg, data) => Logger.info(`[Runtime] ${msg}`, data === undefined ? undefined : data),
265
- warn: (msg, data) => Logger.warn(`[Runtime] ${msg}`, data === undefined ? undefined : data),
266
- error: (msg, err) => {
267
- const message = err instanceof Error ? err.message : String(err);
268
- Logger.error(`[Runtime] ${msg}`, { error: message });
269
- },
270
- };
271
- }
@@ -1,143 +0,0 @@
1
- /**
2
- * Health Routes
3
- * Provides health, liveness, and readiness endpoints.
4
- */
5
-
6
- import { useDatabase, appConfig, Env , Logger, RuntimeHealthProbes, QueryBuilder} from '@zintrust/core';
7
- import { type IRouter, Router } from '@zintrust/core';
8
-
9
- export function registerHealthRoutes(router: IRouter): void {
10
- registerHealthRoute(router);
11
- registerHealthLiveRoute(router);
12
- registerHealthReadyRoute(router);
13
- }
14
-
15
- function registerHealthRoute(router: IRouter): void {
16
- Router.get(router, '/health', async (_req, res) => {
17
- const environment = Env.NODE_ENV ?? 'development';
18
-
19
- try {
20
- const db = useDatabase();
21
- const maybeIsConnected = (db as unknown as { isConnected?: unknown }).isConnected;
22
- const maybeConnect = (db as unknown as { connect?: unknown }).connect;
23
- if (typeof maybeIsConnected === 'function' && maybeIsConnected.call(db) === false) {
24
- if (typeof maybeConnect === 'function') {
25
- await maybeConnect.call(db);
26
- }
27
- }
28
- await QueryBuilder.ping(db);
29
-
30
- const uptime =
31
- typeof process !== 'undefined' && typeof process.uptime === 'function'
32
- ? process.uptime()
33
- : 0;
34
-
35
- res.json({
36
- status: 'healthy',
37
- timestamp: new Date().toISOString(),
38
- uptime,
39
- database: 'connected',
40
- environment,
41
- });
42
- } catch (error) {
43
- Logger.error('Health check failed:', error);
44
-
45
- const isProd = environment === 'production' || environment === 'prod';
46
-
47
- res.setStatus(503).json({
48
- status: 'unhealthy',
49
- timestamp: new Date().toISOString(),
50
- database: 'disconnected',
51
- error: isProd ? 'Service unavailable' : (error as Error).message,
52
- });
53
- }
54
- });
55
- }
56
-
57
- function registerHealthLiveRoute(router: IRouter): void {
58
- Router.get(router, '/health/live', async (_req, res) => {
59
- const uptime =
60
- typeof process !== 'undefined' && typeof process.uptime === 'function' ? process.uptime() : 0;
61
-
62
- res.json({
63
- status: 'alive',
64
- timestamp: new Date().toISOString(),
65
- uptime,
66
- });
67
- });
68
- }
69
-
70
- function registerHealthReadyRoute(router: IRouter): void {
71
- Router.get(router, '/health/ready', async (_req, res) => {
72
- const startTime = Date.now();
73
- const environment = appConfig.environment;
74
-
75
- let databaseResponseTime: number | null = null;
76
- let cacheResponseTime: number | null = null;
77
-
78
- try {
79
- const db = useDatabase();
80
- const maybeIsConnected = (db as unknown as { isConnected?: unknown }).isConnected;
81
- const maybeConnect = (db as unknown as { connect?: unknown }).connect;
82
- if (typeof maybeIsConnected === 'function' && maybeIsConnected.call(db) === false) {
83
- if (typeof maybeConnect === 'function') {
84
- await maybeConnect.call(db);
85
- }
86
- }
87
- await QueryBuilder.ping(db);
88
-
89
- databaseResponseTime = Date.now() - startTime;
90
-
91
- // Only probe KV at runtime when explicitly configured.
92
- cacheResponseTime = await RuntimeHealthProbes.pingKvCache(2000);
93
-
94
- res.json({
95
- status: 'ready',
96
- timestamp: new Date().toISOString(),
97
- environment,
98
- dependencies: {
99
- database: {
100
- status: 'ready',
101
- responseTime: databaseResponseTime,
102
- },
103
- ...(cacheResponseTime === null
104
- ? {}
105
- : {
106
- cache: {
107
- status: 'ready',
108
- responseTime: cacheResponseTime,
109
- },
110
- }),
111
- },
112
- });
113
- } catch (error) {
114
- Logger.error('Readiness check failed:', error);
115
-
116
- const isProd = environment === 'production';
117
-
118
- const responseTime = Date.now() - startTime;
119
-
120
- const dependencies: Record<string, unknown> = {
121
- database: {
122
- status: databaseResponseTime === null ? 'unavailable' : 'ready',
123
- responseTime: databaseResponseTime ?? responseTime,
124
- },
125
- };
126
-
127
- if (RuntimeHealthProbes.getCacheDriverName() === 'kv') {
128
- dependencies['cache'] = {
129
- status: 'unavailable',
130
- responseTime: cacheResponseTime ?? responseTime,
131
- };
132
- }
133
-
134
- res.setStatus(503).json({
135
- status: 'not_ready',
136
- timestamp: new Date().toISOString(),
137
- environment,
138
- dependencies,
139
- error: isProd ? 'Service unavailable' : (error as Error).message,
140
- });
141
- }
142
- });
143
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * Metrics Routes
3
- *
4
- * Exposes Prometheus metrics when enabled.
5
- */
6
-
7
- import { Env, PrometheusMetrics, type IRouter, Router } from '@zintrust/core';
8
-
9
- export function registerMetricsRoutes(router: IRouter): void {
10
- if (Env.getBool('METRICS_ENABLED', false) === false) return;
11
-
12
- const pathFromEnv = Env.get('METRICS_PATH', '/metrics').trim();
13
- const path = pathFromEnv === '' ? '/metrics' : pathFromEnv;
14
-
15
- Router.get(router, path, async (_req, res) => {
16
- const { contentType, body } = await PrometheusMetrics.getMetricsText();
17
- res.setHeader('Content-Type', contentType);
18
- res.send(body);
19
- });
20
- }
21
-
22
- export default registerMetricsRoutes;
@@ -1,22 +0,0 @@
1
- /**
2
- * BroadcastWorker - Processes queued broadcasts
3
- *
4
- * This worker dequeues broadcast messages and sends them using the Broadcast service.
5
- * Use with Queue.dequeue() in a background process or cron job.
6
- */
7
- export declare const BroadcastWorker: Readonly<{
8
- processOne: (queueName?: string, driverName?: string) => Promise<boolean>;
9
- processAll: (queueName?: string, driverName?: string) => Promise<number>;
10
- runOnce: (opts?: {
11
- queueName?: string;
12
- driverName?: string;
13
- maxItems?: number;
14
- }) => Promise<number>;
15
- startWorker: (opts?: {
16
- queueName?: string;
17
- driverName?: string;
18
- signal?: AbortSignal;
19
- }) => Promise<number>;
20
- }>;
21
- export default BroadcastWorker;
22
- //# sourceMappingURL=BroadcastWorker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BroadcastWorker.d.ts","sourceRoot":"","sources":["../../../src/workers/BroadcastWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,eAAO,MAAM,eAAe;0BAbrB,CAAC,oBAAoB,CAAC;0BAGf,CAAC,oBAAoB,CAAC;kBACnB,CAAC;iBAAiB,CAAC;kBAE3B,CAAC;gBACC,CAAA;;sBAGE,CAAC;iBAGP,CAAA;kBAAwB,CAAC;cAC3B,CAAC;;EAaJ,CAAC;AAEH,eAAe,eAAe,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * BroadcastWorker - Processes queued broadcasts
3
- *
4
- * This worker dequeues broadcast messages and sends them using the Broadcast service.
5
- * Use with Queue.dequeue() in a background process or cron job.
6
- */
7
- import { createQueueWorker } from '../workers/createQueueWorker.js';
8
- import { Broadcast } from '../tools/broadcast/Broadcast.js';
9
- export const BroadcastWorker = Object.freeze({
10
- ...createQueueWorker({
11
- kindLabel: 'broadcast',
12
- defaultQueueName: 'broadcasts',
13
- maxAttempts: 3,
14
- getLogFields: (payload) => ({
15
- channel: payload.channel,
16
- event: payload.event,
17
- queuedAt: payload.timestamp,
18
- }),
19
- handle: async (payload) => {
20
- await Broadcast.send(payload.channel, payload.event, payload.data);
21
- },
22
- }),
23
- });
24
- export default BroadcastWorker;
@@ -1,22 +0,0 @@
1
- /**
2
- * NotificationWorker - Processes queued notifications
3
- *
4
- * This worker dequeues notification messages and sends them using the Notification service.
5
- * Use with Queue.dequeue() in a background process or cron job.
6
- */
7
- export declare const NotificationWorker: Readonly<{
8
- processOne: (queueName?: string, driverName?: string) => Promise<boolean>;
9
- processAll: (queueName?: string, driverName?: string) => Promise<number>;
10
- runOnce: (opts?: {
11
- queueName?: string;
12
- driverName?: string;
13
- maxItems?: number;
14
- }) => Promise<number>;
15
- startWorker: (opts?: {
16
- queueName?: string;
17
- driverName?: string;
18
- signal?: AbortSignal;
19
- }) => Promise<number>;
20
- }>;
21
- export default NotificationWorker;
22
- //# sourceMappingURL=NotificationWorker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NotificationWorker.d.ts","sourceRoot":"","sources":["../../../src/workers/NotificationWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,eAAO,MAAM,kBAAkB;0BAdyD,CAAC,oBACzE,CAAC;0BAGf,CAAC,oBAAoB,CAAC;kBACnB,CAAC;iBAAkB,CAAA;kBAAwB,CAAC;gBAEtC,CAAC;;sBAGV,CAAC;iBAAiB,CAAC;kBACZ,CAAC;cAGL,CAAC;;EAaJ,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * NotificationWorker - Processes queued notifications
3
- *
4
- * This worker dequeues notification messages and sends them using the Notification service.
5
- * Use with Queue.dequeue() in a background process or cron job.
6
- */
7
- import { createQueueWorker } from '../workers/createQueueWorker.js';
8
- import { Notification } from '../tools/notification/Notification.js';
9
- export const NotificationWorker = Object.freeze({
10
- ...createQueueWorker({
11
- kindLabel: 'notification',
12
- defaultQueueName: 'notifications',
13
- maxAttempts: 3,
14
- getLogFields: (payload) => ({
15
- recipient: payload.recipient,
16
- queuedAt: payload.timestamp,
17
- }),
18
- handle: async (payload) => {
19
- await Notification.send(payload.recipient, payload.message, payload.options);
20
- },
21
- }),
22
- });
23
- export default NotificationWorker;
@@ -1,24 +0,0 @@
1
- type QueueWorker = {
2
- processOne: (queueName?: string, driverName?: string) => Promise<boolean>;
3
- processAll: (queueName?: string, driverName?: string) => Promise<number>;
4
- runOnce: (opts?: {
5
- queueName?: string;
6
- driverName?: string;
7
- maxItems?: number;
8
- }) => Promise<number>;
9
- startWorker: (opts?: {
10
- queueName?: string;
11
- driverName?: string;
12
- signal?: AbortSignal;
13
- }) => Promise<number>;
14
- };
15
- export type CreateQueueWorkerOptions<TPayload> = {
16
- kindLabel: string;
17
- defaultQueueName: string;
18
- maxAttempts: number;
19
- getLogFields: (payload: TPayload) => Record<string, unknown>;
20
- handle: (payload: TPayload) => Promise<void>;
21
- };
22
- export declare function createQueueWorker<TPayload>(options: CreateQueueWorkerOptions<TPayload>): QueueWorker;
23
- export {};
24
- //# sourceMappingURL=createQueueWorker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createQueueWorker.d.ts","sourceRoot":"","sources":["../../../src/workers/createQueueWorker.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,QAAQ,IAAI;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AA4IF,wBAAgB,iBAAiB,CAAC,QAAQ,EACxC,OAAO,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAC1C,WAAW,CAOb"}