blendsdk 5.33.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 (538) hide show
  1. package/README.md +125 -0
  2. package/dist/cmdline/cmdline.d.ts +144 -0
  3. package/dist/cmdline/cmdline.d.ts.map +1 -0
  4. package/dist/cmdline/cmdline.js +683 -0
  5. package/dist/cmdline/cmdline.js.map +1 -0
  6. package/dist/cmdline/errors.d.ts +105 -0
  7. package/dist/cmdline/errors.d.ts.map +1 -0
  8. package/dist/cmdline/errors.js +153 -0
  9. package/dist/cmdline/errors.js.map +1 -0
  10. package/dist/cmdline/index.d.ts +5 -0
  11. package/dist/cmdline/index.d.ts.map +1 -0
  12. package/dist/cmdline/index.js +5 -0
  13. package/dist/cmdline/index.js.map +1 -0
  14. package/dist/cmdline/types.d.ts +260 -0
  15. package/dist/cmdline/types.d.ts.map +1 -0
  16. package/dist/cmdline/types.js +9 -0
  17. package/dist/cmdline/types.js.map +1 -0
  18. package/dist/cmdline/validators.d.ts +28 -0
  19. package/dist/cmdline/validators.d.ts.map +1 -0
  20. package/dist/cmdline/validators.js +211 -0
  21. package/dist/cmdline/validators.js.map +1 -0
  22. package/dist/codegen/database/index.d.ts +3 -0
  23. package/dist/codegen/database/index.d.ts.map +1 -0
  24. package/dist/codegen/database/index.js +3 -0
  25. package/dist/codegen/database/index.js.map +1 -0
  26. package/dist/codegen/database/introspect/index.d.ts +3 -0
  27. package/dist/codegen/database/introspect/index.d.ts.map +1 -0
  28. package/dist/codegen/database/introspect/index.js +3 -0
  29. package/dist/codegen/database/introspect/index.js.map +1 -0
  30. package/dist/codegen/database/introspect/introspect-query.d.ts +2 -0
  31. package/dist/codegen/database/introspect/introspect-query.d.ts.map +1 -0
  32. package/dist/codegen/database/introspect/introspect-query.js +416 -0
  33. package/dist/codegen/database/introspect/introspect-query.js.map +1 -0
  34. package/dist/codegen/database/introspect/introspect-types.d.ts +45 -0
  35. package/dist/codegen/database/introspect/introspect-types.d.ts.map +1 -0
  36. package/dist/codegen/database/introspect/introspect-types.js +2 -0
  37. package/dist/codegen/database/introspect/introspect-types.js.map +1 -0
  38. package/dist/codegen/database/introspect/introspect.d.ts +21 -0
  39. package/dist/codegen/database/introspect/introspect.d.ts.map +1 -0
  40. package/dist/codegen/database/introspect/introspect.js +223 -0
  41. package/dist/codegen/database/introspect/introspect.js.map +1 -0
  42. package/dist/codegen/database/schema/check-constraint.d.ts +8 -0
  43. package/dist/codegen/database/schema/check-constraint.d.ts.map +1 -0
  44. package/dist/codegen/database/schema/check-constraint.js +12 -0
  45. package/dist/codegen/database/schema/check-constraint.js.map +1 -0
  46. package/dist/codegen/database/schema/column-schema.d.ts +7 -0
  47. package/dist/codegen/database/schema/column-schema.d.ts.map +1 -0
  48. package/dist/codegen/database/schema/column-schema.js +9 -0
  49. package/dist/codegen/database/schema/column-schema.js.map +1 -0
  50. package/dist/codegen/database/schema/constraint-base.d.ts +13 -0
  51. package/dist/codegen/database/schema/constraint-base.d.ts.map +1 -0
  52. package/dist/codegen/database/schema/constraint-base.js +32 -0
  53. package/dist/codegen/database/schema/constraint-base.js.map +1 -0
  54. package/dist/codegen/database/schema/database-schema.d.ts +19 -0
  55. package/dist/codegen/database/schema/database-schema.d.ts.map +1 -0
  56. package/dist/codegen/database/schema/database-schema.js +48 -0
  57. package/dist/codegen/database/schema/database-schema.js.map +1 -0
  58. package/dist/codegen/database/schema/dataobject-schema.d.ts +9 -0
  59. package/dist/codegen/database/schema/dataobject-schema.d.ts.map +1 -0
  60. package/dist/codegen/database/schema/dataobject-schema.js +18 -0
  61. package/dist/codegen/database/schema/dataobject-schema.js.map +1 -0
  62. package/dist/codegen/database/schema/fkey-constraints.d.ts +21 -0
  63. package/dist/codegen/database/schema/fkey-constraints.d.ts.map +1 -0
  64. package/dist/codegen/database/schema/fkey-constraints.js +58 -0
  65. package/dist/codegen/database/schema/fkey-constraints.js.map +1 -0
  66. package/dist/codegen/database/schema/index-constraint.d.ts +34 -0
  67. package/dist/codegen/database/schema/index-constraint.d.ts.map +1 -0
  68. package/dist/codegen/database/schema/index-constraint.js +79 -0
  69. package/dist/codegen/database/schema/index-constraint.js.map +1 -0
  70. package/dist/codegen/database/schema/index.d.ts +5 -0
  71. package/dist/codegen/database/schema/index.d.ts.map +1 -0
  72. package/dist/codegen/database/schema/index.js +5 -0
  73. package/dist/codegen/database/schema/index.js.map +1 -0
  74. package/dist/codegen/database/schema/primarykey-constraint.d.ts +4 -0
  75. package/dist/codegen/database/schema/primarykey-constraint.d.ts.map +1 -0
  76. package/dist/codegen/database/schema/primarykey-constraint.js +4 -0
  77. package/dist/codegen/database/schema/primarykey-constraint.js.map +1 -0
  78. package/dist/codegen/database/schema/relation-schema.d.ts +16 -0
  79. package/dist/codegen/database/schema/relation-schema.d.ts.map +1 -0
  80. package/dist/codegen/database/schema/relation-schema.js +32 -0
  81. package/dist/codegen/database/schema/relation-schema.js.map +1 -0
  82. package/dist/codegen/database/schema/table-column-schema.d.ts +59 -0
  83. package/dist/codegen/database/schema/table-column-schema.d.ts.map +1 -0
  84. package/dist/codegen/database/schema/table-column-schema.js +137 -0
  85. package/dist/codegen/database/schema/table-column-schema.js.map +1 -0
  86. package/dist/codegen/database/schema/table-schema.d.ts +48 -0
  87. package/dist/codegen/database/schema/table-schema.d.ts.map +1 -0
  88. package/dist/codegen/database/schema/table-schema.js +219 -0
  89. package/dist/codegen/database/schema/table-schema.js.map +1 -0
  90. package/dist/codegen/database/schema/types.d.ts +13 -0
  91. package/dist/codegen/database/schema/types.d.ts.map +1 -0
  92. package/dist/codegen/database/schema/types.js +175 -0
  93. package/dist/codegen/database/schema/types.js.map +1 -0
  94. package/dist/codegen/database/schema/unique-constraint.d.ts +4 -0
  95. package/dist/codegen/database/schema/unique-constraint.d.ts.map +1 -0
  96. package/dist/codegen/database/schema/unique-constraint.js +4 -0
  97. package/dist/codegen/database/schema/unique-constraint.js.map +1 -0
  98. package/dist/codegen/database/schema/view-schema.d.ts +14 -0
  99. package/dist/codegen/database/schema/view-schema.d.ts.map +1 -0
  100. package/dist/codegen/database/schema/view-schema.js +32 -0
  101. package/dist/codegen/database/schema/view-schema.js.map +1 -0
  102. package/dist/codegen/generator/ctype-generator.d.ts +5 -0
  103. package/dist/codegen/generator/ctype-generator.d.ts.map +1 -0
  104. package/dist/codegen/generator/ctype-generator.js +26 -0
  105. package/dist/codegen/generator/ctype-generator.js.map +1 -0
  106. package/dist/codegen/generator/generator.d.ts +17 -0
  107. package/dist/codegen/generator/generator.d.ts.map +1 -0
  108. package/dist/codegen/generator/generator.js +57 -0
  109. package/dist/codegen/generator/generator.js.map +1 -0
  110. package/dist/codegen/generator/index.d.ts +8 -0
  111. package/dist/codegen/generator/index.d.ts.map +1 -0
  112. package/dist/codegen/generator/index.js +8 -0
  113. package/dist/codegen/generator/index.js.map +1 -0
  114. package/dist/codegen/generator/openapi-generator.d.ts +239 -0
  115. package/dist/codegen/generator/openapi-generator.d.ts.map +1 -0
  116. package/dist/codegen/generator/openapi-generator.js +434 -0
  117. package/dist/codegen/generator/openapi-generator.js.map +1 -0
  118. package/dist/codegen/generator/openapi-types.d.ts +263 -0
  119. package/dist/codegen/generator/openapi-types.d.ts.map +1 -0
  120. package/dist/codegen/generator/openapi-types.js +11 -0
  121. package/dist/codegen/generator/openapi-types.js.map +1 -0
  122. package/dist/codegen/generator/postgres-schema-generator.d.ts +48 -0
  123. package/dist/codegen/generator/postgres-schema-generator.d.ts.map +1 -0
  124. package/dist/codegen/generator/postgres-schema-generator.js +339 -0
  125. package/dist/codegen/generator/postgres-schema-generator.js.map +1 -0
  126. package/dist/codegen/generator/type-generator.d.ts +113 -0
  127. package/dist/codegen/generator/type-generator.d.ts.map +1 -0
  128. package/dist/codegen/generator/type-generator.js +249 -0
  129. package/dist/codegen/generator/type-generator.js.map +1 -0
  130. package/dist/codegen/generator/zod-generator.d.ts +15 -0
  131. package/dist/codegen/generator/zod-generator.d.ts.map +1 -0
  132. package/dist/codegen/generator/zod-generator.js +86 -0
  133. package/dist/codegen/generator/zod-generator.js.map +1 -0
  134. package/dist/codegen/generator/zod-to-openapi.d.ts +69 -0
  135. package/dist/codegen/generator/zod-to-openapi.d.ts.map +1 -0
  136. package/dist/codegen/generator/zod-to-openapi.js +480 -0
  137. package/dist/codegen/generator/zod-to-openapi.js.map +1 -0
  138. package/dist/codegen/index.d.ts +4 -0
  139. package/dist/codegen/index.d.ts.map +1 -0
  140. package/dist/codegen/index.js +4 -0
  141. package/dist/codegen/index.js.map +1 -0
  142. package/dist/codegen/schema/any-schema.d.ts +6 -0
  143. package/dist/codegen/schema/any-schema.d.ts.map +1 -0
  144. package/dist/codegen/schema/any-schema.js +12 -0
  145. package/dist/codegen/schema/any-schema.js.map +1 -0
  146. package/dist/codegen/schema/boolean-schema.d.ts +6 -0
  147. package/dist/codegen/schema/boolean-schema.d.ts.map +1 -0
  148. package/dist/codegen/schema/boolean-schema.js +12 -0
  149. package/dist/codegen/schema/boolean-schema.js.map +1 -0
  150. package/dist/codegen/schema/date-schema.d.ts +6 -0
  151. package/dist/codegen/schema/date-schema.d.ts.map +1 -0
  152. package/dist/codegen/schema/date-schema.js +12 -0
  153. package/dist/codegen/schema/date-schema.js.map +1 -0
  154. package/dist/codegen/schema/index.d.ts +10 -0
  155. package/dist/codegen/schema/index.d.ts.map +1 -0
  156. package/dist/codegen/schema/index.js +10 -0
  157. package/dist/codegen/schema/index.js.map +1 -0
  158. package/dist/codegen/schema/object-schema.d.ts +10 -0
  159. package/dist/codegen/schema/object-schema.d.ts.map +1 -0
  160. package/dist/codegen/schema/object-schema.js +21 -0
  161. package/dist/codegen/schema/object-schema.js.map +1 -0
  162. package/dist/codegen/schema/primitive-schema.d.ts +20 -0
  163. package/dist/codegen/schema/primitive-schema.d.ts.map +1 -0
  164. package/dist/codegen/schema/primitive-schema.js +48 -0
  165. package/dist/codegen/schema/primitive-schema.js.map +1 -0
  166. package/dist/codegen/schema/ref-schema.d.ts +6 -0
  167. package/dist/codegen/schema/ref-schema.d.ts.map +1 -0
  168. package/dist/codegen/schema/ref-schema.js +11 -0
  169. package/dist/codegen/schema/ref-schema.js.map +1 -0
  170. package/dist/codegen/schema/schema-container.d.ts +14 -0
  171. package/dist/codegen/schema/schema-container.d.ts.map +1 -0
  172. package/dist/codegen/schema/schema-container.js +38 -0
  173. package/dist/codegen/schema/schema-container.js.map +1 -0
  174. package/dist/codegen/schema/schema-object.d.ts +42 -0
  175. package/dist/codegen/schema/schema-object.d.ts.map +1 -0
  176. package/dist/codegen/schema/schema-object.js +90 -0
  177. package/dist/codegen/schema/schema-object.js.map +1 -0
  178. package/dist/codegen/schema/schema-scope.d.ts +23 -0
  179. package/dist/codegen/schema/schema-scope.d.ts.map +1 -0
  180. package/dist/codegen/schema/schema-scope.js +67 -0
  181. package/dist/codegen/schema/schema-scope.js.map +1 -0
  182. package/dist/codegen/schema/utils.d.ts +17 -0
  183. package/dist/codegen/schema/utils.d.ts.map +1 -0
  184. package/dist/codegen/schema/utils.js +47 -0
  185. package/dist/codegen/schema/utils.js.map +1 -0
  186. package/dist/dbcore/crud-statement.d.ts +67 -0
  187. package/dist/dbcore/crud-statement.d.ts.map +1 -0
  188. package/dist/dbcore/crud-statement.js +75 -0
  189. package/dist/dbcore/crud-statement.js.map +1 -0
  190. package/dist/dbcore/database.d.ts +272 -0
  191. package/dist/dbcore/database.d.ts.map +1 -0
  192. package/dist/dbcore/database.js +53 -0
  193. package/dist/dbcore/database.js.map +1 -0
  194. package/dist/dbcore/dataservice-base.d.ts +18 -0
  195. package/dist/dbcore/dataservice-base.d.ts.map +1 -0
  196. package/dist/dbcore/dataservice-base.js +19 -0
  197. package/dist/dbcore/dataservice-base.js.map +1 -0
  198. package/dist/dbcore/delete-statement.d.ts +29 -0
  199. package/dist/dbcore/delete-statement.d.ts.map +1 -0
  200. package/dist/dbcore/delete-statement.js +30 -0
  201. package/dist/dbcore/delete-statement.js.map +1 -0
  202. package/dist/dbcore/filterable-statement.d.ts +126 -0
  203. package/dist/dbcore/filterable-statement.d.ts.map +1 -0
  204. package/dist/dbcore/filterable-statement.js +178 -0
  205. package/dist/dbcore/filterable-statement.js.map +1 -0
  206. package/dist/dbcore/from-statement.d.ts +120 -0
  207. package/dist/dbcore/from-statement.d.ts.map +1 -0
  208. package/dist/dbcore/from-statement.js +150 -0
  209. package/dist/dbcore/from-statement.js.map +1 -0
  210. package/dist/dbcore/index.d.ts +21 -0
  211. package/dist/dbcore/index.d.ts.map +1 -0
  212. package/dist/dbcore/index.js +21 -0
  213. package/dist/dbcore/index.js.map +1 -0
  214. package/dist/dbcore/insert-statement.d.ts +48 -0
  215. package/dist/dbcore/insert-statement.d.ts.map +1 -0
  216. package/dist/dbcore/insert-statement.js +52 -0
  217. package/dist/dbcore/insert-statement.js.map +1 -0
  218. package/dist/dbcore/query-dataservice.d.ts +144 -0
  219. package/dist/dbcore/query-dataservice.d.ts.map +1 -0
  220. package/dist/dbcore/query-dataservice.js +144 -0
  221. package/dist/dbcore/query-dataservice.js.map +1 -0
  222. package/dist/dbcore/statement.d.ts +133 -0
  223. package/dist/dbcore/statement.d.ts.map +1 -0
  224. package/dist/dbcore/statement.js +138 -0
  225. package/dist/dbcore/statement.js.map +1 -0
  226. package/dist/dbcore/update-statement.d.ts +48 -0
  227. package/dist/dbcore/update-statement.d.ts.map +1 -0
  228. package/dist/dbcore/update-statement.js +52 -0
  229. package/dist/dbcore/update-statement.js.map +1 -0
  230. package/dist/expression/builders/comparison-builder.d.ts +47 -0
  231. package/dist/expression/builders/comparison-builder.d.ts.map +1 -0
  232. package/dist/expression/builders/comparison-builder.js +197 -0
  233. package/dist/expression/builders/comparison-builder.js.map +1 -0
  234. package/dist/expression/builders/query-builder.d.ts +80 -0
  235. package/dist/expression/builders/query-builder.d.ts.map +1 -0
  236. package/dist/expression/builders/query-builder.js +229 -0
  237. package/dist/expression/builders/query-builder.js.map +1 -0
  238. package/dist/expression/compiler/postgresql-compiler.d.ts +56 -0
  239. package/dist/expression/compiler/postgresql-compiler.d.ts.map +1 -0
  240. package/dist/expression/compiler/postgresql-compiler.js +217 -0
  241. package/dist/expression/compiler/postgresql-compiler.js.map +1 -0
  242. package/dist/expression/core/ast-node.d.ts +47 -0
  243. package/dist/expression/core/ast-node.d.ts.map +1 -0
  244. package/dist/expression/core/ast-node.js +154 -0
  245. package/dist/expression/core/ast-node.js.map +1 -0
  246. package/dist/expression/core/parameter-manager.d.ts +84 -0
  247. package/dist/expression/core/parameter-manager.d.ts.map +1 -0
  248. package/dist/expression/core/parameter-manager.js +164 -0
  249. package/dist/expression/core/parameter-manager.js.map +1 -0
  250. package/dist/expression/core/query-builder-interfaces.d.ts +188 -0
  251. package/dist/expression/core/query-builder-interfaces.d.ts.map +1 -0
  252. package/dist/expression/core/query-builder-interfaces.js +6 -0
  253. package/dist/expression/core/query-builder-interfaces.js.map +1 -0
  254. package/dist/expression/core/types.d.ts +239 -0
  255. package/dist/expression/core/types.d.ts.map +1 -0
  256. package/dist/expression/core/types.js +121 -0
  257. package/dist/expression/core/types.js.map +1 -0
  258. package/dist/expression/index.d.ts +11 -0
  259. package/dist/expression/index.d.ts.map +1 -0
  260. package/dist/expression/index.js +11 -0
  261. package/dist/expression/index.js.map +1 -0
  262. package/dist/i18n/content-file-source.d.ts +109 -0
  263. package/dist/i18n/content-file-source.d.ts.map +1 -0
  264. package/dist/i18n/content-file-source.js +218 -0
  265. package/dist/i18n/content-file-source.js.map +1 -0
  266. package/dist/i18n/index.d.ts +19 -0
  267. package/dist/i18n/index.d.ts.map +1 -0
  268. package/dist/i18n/index.js +21 -0
  269. package/dist/i18n/index.js.map +1 -0
  270. package/dist/i18n/json-file-source.d.ts +96 -0
  271. package/dist/i18n/json-file-source.d.ts.map +1 -0
  272. package/dist/i18n/json-file-source.js +258 -0
  273. package/dist/i18n/json-file-source.js.map +1 -0
  274. package/dist/i18n/merge-catalogs.d.ts +20 -0
  275. package/dist/i18n/merge-catalogs.d.ts.map +1 -0
  276. package/dist/i18n/merge-catalogs.js +34 -0
  277. package/dist/i18n/merge-catalogs.js.map +1 -0
  278. package/dist/i18n/node.d.ts +20 -0
  279. package/dist/i18n/node.d.ts.map +1 -0
  280. package/dist/i18n/node.js +19 -0
  281. package/dist/i18n/node.js.map +1 -0
  282. package/dist/i18n/translation-source.d.ts +35 -0
  283. package/dist/i18n/translation-source.d.ts.map +1 -0
  284. package/dist/i18n/translation-source.js +2 -0
  285. package/dist/i18n/translation-source.js.map +1 -0
  286. package/dist/i18n/translator.d.ts +162 -0
  287. package/dist/i18n/translator.d.ts.map +1 -0
  288. package/dist/i18n/translator.js +259 -0
  289. package/dist/i18n/translator.js.map +1 -0
  290. package/dist/i18n/types.d.ts +80 -0
  291. package/dist/i18n/types.d.ts.map +1 -0
  292. package/dist/i18n/types.js +2 -0
  293. package/dist/i18n/types.js.map +1 -0
  294. package/dist/postgresql/database.d.ts +204 -0
  295. package/dist/postgresql/database.d.ts.map +1 -0
  296. package/dist/postgresql/database.js +321 -0
  297. package/dist/postgresql/database.js.map +1 -0
  298. package/dist/postgresql/delete-statement.d.ts +36 -0
  299. package/dist/postgresql/delete-statement.d.ts.map +1 -0
  300. package/dist/postgresql/delete-statement.js +54 -0
  301. package/dist/postgresql/delete-statement.js.map +1 -0
  302. package/dist/postgresql/index.d.ts +12 -0
  303. package/dist/postgresql/index.d.ts.map +1 -0
  304. package/dist/postgresql/index.js +12 -0
  305. package/dist/postgresql/index.js.map +1 -0
  306. package/dist/postgresql/insert-statement.d.ts +34 -0
  307. package/dist/postgresql/insert-statement.d.ts.map +1 -0
  308. package/dist/postgresql/insert-statement.js +48 -0
  309. package/dist/postgresql/insert-statement.js.map +1 -0
  310. package/dist/postgresql/update-statement.d.ts +38 -0
  311. package/dist/postgresql/update-statement.d.ts.map +1 -0
  312. package/dist/postgresql/update-statement.js +75 -0
  313. package/dist/postgresql/update-statement.js.map +1 -0
  314. package/dist/stdlib/formatString.d.ts +52 -0
  315. package/dist/stdlib/formatString.d.ts.map +1 -0
  316. package/dist/stdlib/formatString.js +118 -0
  317. package/dist/stdlib/formatString.js.map +1 -0
  318. package/dist/stdlib/index.d.ts +8 -0
  319. package/dist/stdlib/index.d.ts.map +1 -0
  320. package/dist/stdlib/index.js +8 -0
  321. package/dist/stdlib/index.js.map +1 -0
  322. package/dist/stdlib/isBoolean.d.ts +15 -0
  323. package/dist/stdlib/isBoolean.d.ts.map +1 -0
  324. package/dist/stdlib/isBoolean.js +17 -0
  325. package/dist/stdlib/isBoolean.js.map +1 -0
  326. package/dist/stdlib/isNullOrUndef.d.ts +24 -0
  327. package/dist/stdlib/isNullOrUndef.d.ts.map +1 -0
  328. package/dist/stdlib/isNullOrUndef.js +28 -0
  329. package/dist/stdlib/isNullOrUndef.js.map +1 -0
  330. package/dist/stdlib/isNumeric.d.ts +20 -0
  331. package/dist/stdlib/isNumeric.d.ts.map +1 -0
  332. package/dist/stdlib/isNumeric.js +39 -0
  333. package/dist/stdlib/isNumeric.js.map +1 -0
  334. package/dist/stdlib/isString.d.ts +15 -0
  335. package/dist/stdlib/isString.d.ts.map +1 -0
  336. package/dist/stdlib/isString.js +17 -0
  337. package/dist/stdlib/isString.js.map +1 -0
  338. package/dist/stdlib/isTemplateString.d.ts +18 -0
  339. package/dist/stdlib/isTemplateString.d.ts.map +1 -0
  340. package/dist/stdlib/isTemplateString.js +38 -0
  341. package/dist/stdlib/isTemplateString.js.map +1 -0
  342. package/dist/stdlib/wrapInArray.d.ts +14 -0
  343. package/dist/stdlib/wrapInArray.d.ts.map +1 -0
  344. package/dist/stdlib/wrapInArray.js +17 -0
  345. package/dist/stdlib/wrapInArray.js.map +1 -0
  346. package/dist/webafx/application/application-settings.d.ts +129 -0
  347. package/dist/webafx/application/application-settings.d.ts.map +1 -0
  348. package/dist/webafx/application/application-settings.js +162 -0
  349. package/dist/webafx/application/application-settings.js.map +1 -0
  350. package/dist/webafx/application/base-controller.d.ts +128 -0
  351. package/dist/webafx/application/base-controller.d.ts.map +1 -0
  352. package/dist/webafx/application/base-controller.js +122 -0
  353. package/dist/webafx/application/base-controller.js.map +1 -0
  354. package/dist/webafx/application/console-logger.d.ts +81 -0
  355. package/dist/webafx/application/console-logger.d.ts.map +1 -0
  356. package/dist/webafx/application/console-logger.js +111 -0
  357. package/dist/webafx/application/console-logger.js.map +1 -0
  358. package/dist/webafx/application/controller-registry.d.ts +34 -0
  359. package/dist/webafx/application/controller-registry.d.ts.map +1 -0
  360. package/dist/webafx/application/controller-registry.js +32 -0
  361. package/dist/webafx/application/controller-registry.js.map +1 -0
  362. package/dist/webafx/application/error-handler-middleware.d.ts +22 -0
  363. package/dist/webafx/application/error-handler-middleware.d.ts.map +1 -0
  364. package/dist/webafx/application/error-handler-middleware.js +70 -0
  365. package/dist/webafx/application/error-handler-middleware.js.map +1 -0
  366. package/dist/webafx/application/index.d.ts +13 -0
  367. package/dist/webafx/application/index.d.ts.map +1 -0
  368. package/dist/webafx/application/index.js +13 -0
  369. package/dist/webafx/application/index.js.map +1 -0
  370. package/dist/webafx/application/logger.d.ts +2 -0
  371. package/dist/webafx/application/logger.d.ts.map +1 -0
  372. package/dist/webafx/application/logger.js +2 -0
  373. package/dist/webafx/application/logger.js.map +1 -0
  374. package/dist/webafx/application/plugin.d.ts +73 -0
  375. package/dist/webafx/application/plugin.d.ts.map +1 -0
  376. package/dist/webafx/application/plugin.js +90 -0
  377. package/dist/webafx/application/plugin.js.map +1 -0
  378. package/dist/webafx/application/rate-limiter.d.ts +35 -0
  379. package/dist/webafx/application/rate-limiter.d.ts.map +1 -0
  380. package/dist/webafx/application/rate-limiter.js +74 -0
  381. package/dist/webafx/application/rate-limiter.js.map +1 -0
  382. package/dist/webafx/application/request-context.d.ts +62 -0
  383. package/dist/webafx/application/request-context.d.ts.map +1 -0
  384. package/dist/webafx/application/request-context.js +54 -0
  385. package/dist/webafx/application/request-context.js.map +1 -0
  386. package/dist/webafx/application/request-id-middleware.d.ts +30 -0
  387. package/dist/webafx/application/request-id-middleware.d.ts.map +1 -0
  388. package/dist/webafx/application/request-id-middleware.js +57 -0
  389. package/dist/webafx/application/request-id-middleware.js.map +1 -0
  390. package/dist/webafx/application/route-builder.d.ts +231 -0
  391. package/dist/webafx/application/route-builder.d.ts.map +1 -0
  392. package/dist/webafx/application/route-builder.js +182 -0
  393. package/dist/webafx/application/route-builder.js.map +1 -0
  394. package/dist/webafx/application/service-container.d.ts +144 -0
  395. package/dist/webafx/application/service-container.d.ts.map +1 -0
  396. package/dist/webafx/application/service-container.js +192 -0
  397. package/dist/webafx/application/service-container.js.map +1 -0
  398. package/dist/webafx/application/services.d.ts +27 -0
  399. package/dist/webafx/application/services.d.ts.map +1 -0
  400. package/dist/webafx/application/services.js +33 -0
  401. package/dist/webafx/application/services.js.map +1 -0
  402. package/dist/webafx/application/structured-logger.d.ts +99 -0
  403. package/dist/webafx/application/structured-logger.d.ts.map +1 -0
  404. package/dist/webafx/application/structured-logger.js +132 -0
  405. package/dist/webafx/application/structured-logger.js.map +1 -0
  406. package/dist/webafx/application/type.d.ts +29 -0
  407. package/dist/webafx/application/type.d.ts.map +1 -0
  408. package/dist/webafx/application/type.js +2 -0
  409. package/dist/webafx/application/type.js.map +1 -0
  410. package/dist/webafx/application/web-application.d.ts +257 -0
  411. package/dist/webafx/application/web-application.d.ts.map +1 -0
  412. package/dist/webafx/application/web-application.js +611 -0
  413. package/dist/webafx/application/web-application.js.map +1 -0
  414. package/dist/webafx/errors/api-error.d.ts +21 -0
  415. package/dist/webafx/errors/api-error.d.ts.map +1 -0
  416. package/dist/webafx/errors/api-error.js +38 -0
  417. package/dist/webafx/errors/api-error.js.map +1 -0
  418. package/dist/webafx/errors/http-errors.d.ts +56 -0
  419. package/dist/webafx/errors/http-errors.d.ts.map +1 -0
  420. package/dist/webafx/errors/http-errors.js +74 -0
  421. package/dist/webafx/errors/http-errors.js.map +1 -0
  422. package/dist/webafx/errors/index.d.ts +4 -0
  423. package/dist/webafx/errors/index.d.ts.map +1 -0
  424. package/dist/webafx/errors/index.js +4 -0
  425. package/dist/webafx/errors/index.js.map +1 -0
  426. package/dist/webafx/errors/types.d.ts +42 -0
  427. package/dist/webafx/errors/types.d.ts.map +1 -0
  428. package/dist/webafx/errors/types.js +2 -0
  429. package/dist/webafx/errors/types.js.map +1 -0
  430. package/dist/webafx/index.d.ts +3 -0
  431. package/dist/webafx/index.d.ts.map +1 -0
  432. package/dist/webafx/index.js +3 -0
  433. package/dist/webafx/index.js.map +1 -0
  434. package/dist/webafx-auth/abstract-auth-provider.d.ts +178 -0
  435. package/dist/webafx-auth/abstract-auth-provider.d.ts.map +1 -0
  436. package/dist/webafx-auth/abstract-auth-provider.js +240 -0
  437. package/dist/webafx-auth/abstract-auth-provider.js.map +1 -0
  438. package/dist/webafx-auth/index.d.ts +27 -0
  439. package/dist/webafx-auth/index.d.ts.map +1 -0
  440. package/dist/webafx-auth/index.js +32 -0
  441. package/dist/webafx-auth/index.js.map +1 -0
  442. package/dist/webafx-auth/jwt-auth-provider.d.ts +100 -0
  443. package/dist/webafx-auth/jwt-auth-provider.d.ts.map +1 -0
  444. package/dist/webafx-auth/jwt-auth-provider.js +154 -0
  445. package/dist/webafx-auth/jwt-auth-provider.js.map +1 -0
  446. package/dist/webafx-auth/memory-auth-provider.d.ts +100 -0
  447. package/dist/webafx-auth/memory-auth-provider.d.ts.map +1 -0
  448. package/dist/webafx-auth/memory-auth-provider.js +122 -0
  449. package/dist/webafx-auth/memory-auth-provider.js.map +1 -0
  450. package/dist/webafx-auth/types.d.ts +333 -0
  451. package/dist/webafx-auth/types.d.ts.map +1 -0
  452. package/dist/webafx-auth/types.js +24 -0
  453. package/dist/webafx-auth/types.js.map +1 -0
  454. package/dist/webafx-cache/abstract-cache-provider.d.ts +185 -0
  455. package/dist/webafx-cache/abstract-cache-provider.d.ts.map +1 -0
  456. package/dist/webafx-cache/abstract-cache-provider.js +133 -0
  457. package/dist/webafx-cache/abstract-cache-provider.js.map +1 -0
  458. package/dist/webafx-cache/abstract-pubsub-provider.d.ts +170 -0
  459. package/dist/webafx-cache/abstract-pubsub-provider.d.ts.map +1 -0
  460. package/dist/webafx-cache/abstract-pubsub-provider.js +132 -0
  461. package/dist/webafx-cache/abstract-pubsub-provider.js.map +1 -0
  462. package/dist/webafx-cache/cache-plugin.d.ts +114 -0
  463. package/dist/webafx-cache/cache-plugin.d.ts.map +1 -0
  464. package/dist/webafx-cache/cache-plugin.js +176 -0
  465. package/dist/webafx-cache/cache-plugin.js.map +1 -0
  466. package/dist/webafx-cache/index.d.ts +33 -0
  467. package/dist/webafx-cache/index.d.ts.map +1 -0
  468. package/dist/webafx-cache/index.js +44 -0
  469. package/dist/webafx-cache/index.js.map +1 -0
  470. package/dist/webafx-cache/memory-cache-provider.d.ts +99 -0
  471. package/dist/webafx-cache/memory-cache-provider.d.ts.map +1 -0
  472. package/dist/webafx-cache/memory-cache-provider.js +251 -0
  473. package/dist/webafx-cache/memory-cache-provider.js.map +1 -0
  474. package/dist/webafx-cache/memory-pubsub-provider.d.ts +124 -0
  475. package/dist/webafx-cache/memory-pubsub-provider.d.ts.map +1 -0
  476. package/dist/webafx-cache/memory-pubsub-provider.js +195 -0
  477. package/dist/webafx-cache/memory-pubsub-provider.js.map +1 -0
  478. package/dist/webafx-cache/pubsub-plugin.d.ts +128 -0
  479. package/dist/webafx-cache/pubsub-plugin.d.ts.map +1 -0
  480. package/dist/webafx-cache/pubsub-plugin.js +182 -0
  481. package/dist/webafx-cache/pubsub-plugin.js.map +1 -0
  482. package/dist/webafx-cache/redis-cache-provider.d.ts +81 -0
  483. package/dist/webafx-cache/redis-cache-provider.d.ts.map +1 -0
  484. package/dist/webafx-cache/redis-cache-provider.js +209 -0
  485. package/dist/webafx-cache/redis-cache-provider.js.map +1 -0
  486. package/dist/webafx-cache/redis-pubsub-provider.d.ts +164 -0
  487. package/dist/webafx-cache/redis-pubsub-provider.d.ts.map +1 -0
  488. package/dist/webafx-cache/redis-pubsub-provider.js +329 -0
  489. package/dist/webafx-cache/redis-pubsub-provider.js.map +1 -0
  490. package/dist/webafx-cache/types.d.ts +206 -0
  491. package/dist/webafx-cache/types.d.ts.map +1 -0
  492. package/dist/webafx-cache/types.js +27 -0
  493. package/dist/webafx-cache/types.js.map +1 -0
  494. package/dist/webafx-i18n/i18n-plugin.d.ts +29 -0
  495. package/dist/webafx-i18n/i18n-plugin.d.ts.map +1 -0
  496. package/dist/webafx-i18n/i18n-plugin.js +145 -0
  497. package/dist/webafx-i18n/i18n-plugin.js.map +1 -0
  498. package/dist/webafx-i18n/index.d.ts +12 -0
  499. package/dist/webafx-i18n/index.d.ts.map +1 -0
  500. package/dist/webafx-i18n/index.js +12 -0
  501. package/dist/webafx-i18n/index.js.map +1 -0
  502. package/dist/webafx-i18n/locale-resolver.d.ts +33 -0
  503. package/dist/webafx-i18n/locale-resolver.d.ts.map +1 -0
  504. package/dist/webafx-i18n/locale-resolver.js +67 -0
  505. package/dist/webafx-i18n/locale-resolver.js.map +1 -0
  506. package/dist/webafx-i18n/postgresql-source.d.ts +101 -0
  507. package/dist/webafx-i18n/postgresql-source.d.ts.map +1 -0
  508. package/dist/webafx-i18n/postgresql-source.js +101 -0
  509. package/dist/webafx-i18n/postgresql-source.js.map +1 -0
  510. package/dist/webafx-i18n/types.d.ts +70 -0
  511. package/dist/webafx-i18n/types.d.ts.map +1 -0
  512. package/dist/webafx-i18n/types.js +2 -0
  513. package/dist/webafx-i18n/types.js.map +1 -0
  514. package/dist/webafx-mailer/abstract-mail-provider.d.ts +55 -0
  515. package/dist/webafx-mailer/abstract-mail-provider.d.ts.map +1 -0
  516. package/dist/webafx-mailer/abstract-mail-provider.js +37 -0
  517. package/dist/webafx-mailer/abstract-mail-provider.js.map +1 -0
  518. package/dist/webafx-mailer/index.d.ts +24 -0
  519. package/dist/webafx-mailer/index.d.ts.map +1 -0
  520. package/dist/webafx-mailer/index.js +34 -0
  521. package/dist/webafx-mailer/index.js.map +1 -0
  522. package/dist/webafx-mailer/mail-plugin.d.ts +98 -0
  523. package/dist/webafx-mailer/mail-plugin.d.ts.map +1 -0
  524. package/dist/webafx-mailer/mail-plugin.js +155 -0
  525. package/dist/webafx-mailer/mail-plugin.js.map +1 -0
  526. package/dist/webafx-mailer/memory-mail-provider.d.ts +85 -0
  527. package/dist/webafx-mailer/memory-mail-provider.d.ts.map +1 -0
  528. package/dist/webafx-mailer/memory-mail-provider.js +111 -0
  529. package/dist/webafx-mailer/memory-mail-provider.js.map +1 -0
  530. package/dist/webafx-mailer/smtp-mail-provider.d.ts +65 -0
  531. package/dist/webafx-mailer/smtp-mail-provider.d.ts.map +1 -0
  532. package/dist/webafx-mailer/smtp-mail-provider.js +113 -0
  533. package/dist/webafx-mailer/smtp-mail-provider.js.map +1 -0
  534. package/dist/webafx-mailer/types.d.ts +136 -0
  535. package/dist/webafx-mailer/types.d.ts.map +1 -0
  536. package/dist/webafx-mailer/types.js +13 -0
  537. package/dist/webafx-mailer/types.js.map +1 -0
  538. package/package.json +159 -0
@@ -0,0 +1,144 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ import { ApplicationSettings } from './application-settings.js';
3
+ /**
4
+ * Factory function for creating singleton services.
5
+ * Called once during application startup and the result is cached.
6
+ *
7
+ * @template T - The type of service this factory creates
8
+ */
9
+ export type SingletonFactory<T = unknown> = (container: ServiceContainer, settings: ApplicationSettings) => T | Promise<T>;
10
+ /**
11
+ * Factory function for creating per-request services.
12
+ * Called for each HTTP request with the full request context.
13
+ * The req, res, and next parameters are always provided during
14
+ * request handling — they are required, not optional.
15
+ *
16
+ * @template T - The type of service this factory creates
17
+ */
18
+ export type PerRequestFactory<T = unknown> = (container: ServiceContainer, settings: ApplicationSettings, req: Request, res: Response, next: NextFunction) => T | Promise<T>;
19
+ /**
20
+ * Service definition for dependency injection container.
21
+ *
22
+ * @template T - The type of service this definition creates
23
+ */
24
+ export interface ServiceDefinition<T = unknown> {
25
+ name: string;
26
+ factory: SingletonFactory<T> | PerRequestFactory<T>;
27
+ type: 'singleton' | 'per-request';
28
+ dependencies?: string[];
29
+ /** Optional cleanup function called on application shutdown */
30
+ dispose?: (instance: T) => void | Promise<void>;
31
+ }
32
+ /**
33
+ * Service registry containing service definitions and singleton instances.
34
+ * Each WebApplication instance owns its own registry to prevent state leakage.
35
+ */
36
+ export interface ServiceRegistry {
37
+ /** Service definitions (blueprints) */
38
+ definitions: Record<string, ServiceDefinition>;
39
+ /** Cached singleton instances */
40
+ singletons: Record<string, unknown>;
41
+ }
42
+ /**
43
+ * Dependency injection container for managing service lifecycle.
44
+ * Supports both singleton (application-scoped) and per-request services.
45
+ *
46
+ * @remarks
47
+ * Each ServiceContainer instance is tied to a ServiceRegistry owned by a
48
+ * WebApplication instance. This eliminates global state and ensures proper
49
+ * isolation between application instances and test runs.
50
+ */
51
+ export declare class ServiceContainer {
52
+ protected registry: ServiceRegistry;
53
+ protected settings: ApplicationSettings;
54
+ protected request: Request | undefined;
55
+ protected response: Response | undefined;
56
+ protected next: NextFunction | undefined;
57
+ protected services: Record<string, unknown>;
58
+ protected resolvingServices: Set<string>;
59
+ /**
60
+ * Creates a new ServiceContainer instance.
61
+ *
62
+ * @param registry - Service registry containing definitions and singletons
63
+ * @param settings - Application settings
64
+ * @param req - Optional Express request (for per-request services)
65
+ * @param res - Optional Express response (for per-request services)
66
+ * @param next - Optional Express next function (for per-request services)
67
+ */
68
+ constructor(registry: ServiceRegistry, settings: ApplicationSettings, req?: Request, res?: Response, next?: NextFunction);
69
+ /**
70
+ * Get the authenticated user from the service container.
71
+ * @returns The user object or undefined if not authenticated
72
+ */
73
+ getUser<T = unknown>(): T | undefined;
74
+ /**
75
+ * Get validated request parameters (merged from params, query, and body).
76
+ * @returns The validated parameters object
77
+ */
78
+ getParams<T = unknown>(): T;
79
+ /**
80
+ * Get separated request input sources (params, query, body).
81
+ * Provides type-safe access to individual input sources without merging.
82
+ *
83
+ * @returns Object with separated params, query, and body
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const input = req.services.getInput<{
88
+ * params: { id: string };
89
+ * query: { sort: string };
90
+ * body: { name: string };
91
+ * }>();
92
+ * console.log(input.params.id);
93
+ * console.log(input.query.sort);
94
+ * console.log(input.body.name);
95
+ * ```
96
+ */
97
+ getInput<T = {
98
+ params: Record<string, unknown>;
99
+ query: Record<string, unknown>;
100
+ body: Record<string, unknown>;
101
+ }>(): T;
102
+ /**
103
+ * Manually set a service instance in the container.
104
+ * @param name - Service name
105
+ * @param service - Service instance
106
+ */
107
+ set(name: string, service: unknown): void;
108
+ /**
109
+ * Resolve and return a service instance.
110
+ * Handles dependency resolution and lifecycle management.
111
+ * @param name - Service name
112
+ * @param defaultValue - Optional default value if service not found
113
+ * @returns The resolved service instance
114
+ * @throws Error if service not registered and no default provided
115
+ * @throws Error if circular dependency detected
116
+ * @throws Error if per-request service accessed outside request context
117
+ */
118
+ get<T = unknown>(name: string, defaultValue?: T): Promise<T>;
119
+ /**
120
+ * Register a service definition in this instance's registry.
121
+ * @param service - Service definition to register
122
+ */
123
+ registerService(service: ServiceDefinition): void;
124
+ /**
125
+ * Check if a service is registered in this instance's registry.
126
+ * @param name - Service name
127
+ * @returns True if service is registered
128
+ */
129
+ isRegistered(name: string): boolean;
130
+ /**
131
+ * Get all registered service names from this instance's registry.
132
+ * @returns Array of service names
133
+ */
134
+ getRegisteredServices(): string[];
135
+ /**
136
+ * Dispose all singleton services in the registry.
137
+ * Calls the optional dispose function for each singleton if provided.
138
+ * Typically called during application shutdown.
139
+ *
140
+ * @returns Promise that resolves when all disposals complete
141
+ */
142
+ disposeAll(): Promise<void>;
143
+ }
144
+ //# sourceMappingURL=service-container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-container.d.ts","sourceRoot":"","sources":["../../src/application/service-container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Dependency injection container for managing service lifecycle.
3
+ * Supports both singleton (application-scoped) and per-request services.
4
+ *
5
+ * @remarks
6
+ * Each ServiceContainer instance is tied to a ServiceRegistry owned by a
7
+ * WebApplication instance. This eliminates global state and ensures proper
8
+ * isolation between application instances and test runs.
9
+ */
10
+ export class ServiceContainer {
11
+ registry;
12
+ settings;
13
+ request;
14
+ response;
15
+ next;
16
+ services;
17
+ resolvingServices;
18
+ /**
19
+ * Creates a new ServiceContainer instance.
20
+ *
21
+ * @param registry - Service registry containing definitions and singletons
22
+ * @param settings - Application settings
23
+ * @param req - Optional Express request (for per-request services)
24
+ * @param res - Optional Express response (for per-request services)
25
+ * @param next - Optional Express next function (for per-request services)
26
+ */
27
+ constructor(registry, settings, req, res, next) {
28
+ this.registry = registry;
29
+ this.settings = settings;
30
+ this.request = req;
31
+ this.response = res;
32
+ this.next = next;
33
+ // Pre-populate with existing singletons from registry
34
+ this.services = { ...registry.singletons };
35
+ this.resolvingServices = new Set();
36
+ }
37
+ /**
38
+ * Get the authenticated user from the service container.
39
+ * @returns The user object or undefined if not authenticated
40
+ */
41
+ getUser() {
42
+ return this.services['user'];
43
+ }
44
+ /**
45
+ * Get validated request parameters (merged from params, query, and body).
46
+ * @returns The validated parameters object
47
+ */
48
+ getParams() {
49
+ return (this.services['request-params'] || {});
50
+ }
51
+ /**
52
+ * Get separated request input sources (params, query, body).
53
+ * Provides type-safe access to individual input sources without merging.
54
+ *
55
+ * @returns Object with separated params, query, and body
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const input = req.services.getInput<{
60
+ * params: { id: string };
61
+ * query: { sort: string };
62
+ * body: { name: string };
63
+ * }>();
64
+ * console.log(input.params.id);
65
+ * console.log(input.query.sort);
66
+ * console.log(input.body.name);
67
+ * ```
68
+ */
69
+ getInput() {
70
+ return (this.services['request-input'] || { params: {}, query: {}, body: {} });
71
+ }
72
+ /**
73
+ * Manually set a service instance in the container.
74
+ * @param name - Service name
75
+ * @param service - Service instance
76
+ */
77
+ set(name, service) {
78
+ this.services[name] = service;
79
+ }
80
+ /**
81
+ * Resolve and return a service instance.
82
+ * Handles dependency resolution and lifecycle management.
83
+ * @param name - Service name
84
+ * @param defaultValue - Optional default value if service not found
85
+ * @returns The resolved service instance
86
+ * @throws Error if service not registered and no default provided
87
+ * @throws Error if circular dependency detected
88
+ * @throws Error if per-request service accessed outside request context
89
+ */
90
+ async get(name, defaultValue) {
91
+ // Return already resolved service
92
+ if (this.services[name] !== undefined) {
93
+ return this.services[name];
94
+ }
95
+ // Check if service is registered in this instance's registry
96
+ const serviceDef = this.registry.definitions[name];
97
+ if (!serviceDef) {
98
+ if (arguments.length > 1) {
99
+ return defaultValue;
100
+ }
101
+ throw new Error(`Service "${name}" is not registered`);
102
+ }
103
+ // Detect circular dependencies
104
+ if (this.resolvingServices.has(name)) {
105
+ const chain = Array.from(this.resolvingServices).join(' -> ');
106
+ throw new Error(`Circular dependency detected: ${chain} -> ${name}`);
107
+ }
108
+ // Mark service as being resolved
109
+ this.resolvingServices.add(name);
110
+ try {
111
+ // Resolve dependencies first
112
+ const dependencies = serviceDef.dependencies || [];
113
+ for (const depName of dependencies) {
114
+ await this.get(depName);
115
+ }
116
+ // Create service instance
117
+ let instance;
118
+ if (serviceDef.type === 'singleton') {
119
+ // Check if singleton already exists in registry
120
+ if (this.registry.singletons[name] !== undefined) {
121
+ instance = this.registry.singletons[name];
122
+ }
123
+ else {
124
+ // Safe to cast: we've verified type === 'singleton' so factory is SingletonFactory
125
+ const factory = serviceDef.factory;
126
+ instance = await factory(this, this.settings);
127
+ // Cache in registry for reuse across all containers
128
+ this.registry.singletons[name] = instance;
129
+ }
130
+ this.services[name] = instance;
131
+ }
132
+ else {
133
+ // Per-request service — requires request context
134
+ if (!this.request || !this.response || !this.next) {
135
+ throw new Error(`Service "${name}" is per-request and can only be accessed during HTTP request handling`);
136
+ }
137
+ // Safe to cast: we've verified type === 'per-request' so factory is PerRequestFactory
138
+ const factory = serviceDef.factory;
139
+ instance = await factory(this, this.settings, this.request, this.response, this.next);
140
+ this.services[name] = instance;
141
+ }
142
+ return instance;
143
+ }
144
+ finally {
145
+ // Remove from resolving set
146
+ this.resolvingServices.delete(name);
147
+ }
148
+ }
149
+ /**
150
+ * Register a service definition in this instance's registry.
151
+ * @param service - Service definition to register
152
+ */
153
+ registerService(service) {
154
+ this.registry.definitions[service.name] = service;
155
+ }
156
+ /**
157
+ * Check if a service is registered in this instance's registry.
158
+ * @param name - Service name
159
+ * @returns True if service is registered
160
+ */
161
+ isRegistered(name) {
162
+ return this.registry.definitions[name] !== undefined;
163
+ }
164
+ /**
165
+ * Get all registered service names from this instance's registry.
166
+ * @returns Array of service names
167
+ */
168
+ getRegisteredServices() {
169
+ return Object.keys(this.registry.definitions);
170
+ }
171
+ /**
172
+ * Dispose all singleton services in the registry.
173
+ * Calls the optional dispose function for each singleton if provided.
174
+ * Typically called during application shutdown.
175
+ *
176
+ * @returns Promise that resolves when all disposals complete
177
+ */
178
+ async disposeAll() {
179
+ const disposals = [];
180
+ for (const [name, instance] of Object.entries(this.registry.singletons)) {
181
+ const def = this.registry.definitions[name];
182
+ if (def?.dispose) {
183
+ disposals.push(Promise.resolve(def.dispose(instance)));
184
+ }
185
+ }
186
+ // Wait for all disposals to complete
187
+ await Promise.all(disposals);
188
+ // Clear singletons after disposal
189
+ Object.keys(this.registry.singletons).forEach(key => delete this.registry.singletons[key]);
190
+ }
191
+ }
192
+ //# sourceMappingURL=service-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-container.js","sourceRoot":"","sources":["../../src/application/service-container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Preparse service names
3
+ *
4
+ * @deprecated Use const objects instead of static class properties.
5
+ * This function will be removed in the next major version.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // OLD (deprecated):
10
+ * class MyServiceNames {
11
+ * static LOGGER_SERVICE: string;
12
+ * static SOME_SERVICE: string;
13
+ * }
14
+ * preparseServiceNames(MyServiceNames);
15
+ *
16
+ * // NEW (recommended):
17
+ * export const ServiceNames = {
18
+ * LOGGER_SERVICE: 'LOGGER_SERVICE',
19
+ * SOME_SERVICE: 'SOME_SERVICE',
20
+ * } as const;
21
+ * ```
22
+ *
23
+ * @export
24
+ * @param {*} clazz
25
+ */
26
+ export declare function preparseServiceNames(clazz: any): void;
27
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/application/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,QAQ9C"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Preparse service names
3
+ *
4
+ * @deprecated Use const objects instead of static class properties.
5
+ * This function will be removed in the next major version.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // OLD (deprecated):
10
+ * class MyServiceNames {
11
+ * static LOGGER_SERVICE: string;
12
+ * static SOME_SERVICE: string;
13
+ * }
14
+ * preparseServiceNames(MyServiceNames);
15
+ *
16
+ * // NEW (recommended):
17
+ * export const ServiceNames = {
18
+ * LOGGER_SERVICE: 'LOGGER_SERVICE',
19
+ * SOME_SERVICE: 'SOME_SERVICE',
20
+ * } as const;
21
+ * ```
22
+ *
23
+ * @export
24
+ * @param {*} clazz
25
+ */
26
+ export function preparseServiceNames(clazz) {
27
+ console.warn('[WebAFX DEPRECATION WARNING] preparseServiceNames() is deprecated. ' +
28
+ 'Use const objects instead: const ServiceNames = { KEY: "KEY" } as const;');
29
+ Object.keys(clazz).forEach(key => {
30
+ clazz[key] = key;
31
+ });
32
+ }
33
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/application/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAU;IAC7C,OAAO,CAAC,IAAI,CACV,qEAAqE;QACnE,0EAA0E,CAC7E,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { LogLevel } from './console-logger.js';
2
+ import { Logger } from './type.js';
3
+ /**
4
+ * Structured log entry format for JSON output.
5
+ */
6
+ export interface LogEntry {
7
+ /** ISO 8601 timestamp */
8
+ timestamp: string;
9
+ /** Log level */
10
+ level: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
11
+ /** Log message */
12
+ message: string;
13
+ /** Optional logger prefix */
14
+ prefix?: string;
15
+ /** Optional request ID from async context */
16
+ requestId?: string;
17
+ /** Optional additional data */
18
+ data?: Record<string, unknown>;
19
+ /** Any additional context from contextFn */
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Structured JSON logger implementation.
24
+ * Outputs logs as JSON objects for production environments with log aggregation.
25
+ *
26
+ * @remarks
27
+ * This logger is ideal for:
28
+ * - Production environments with centralized logging (e.g., ELK, CloudWatch)
29
+ * - Log parsing and filtering by log aggregation systems
30
+ * - Structured querying of logs
31
+ *
32
+ * Use ConsoleLogger for development where human-readable output is preferred.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const logger = new StructuredLogger('API', 'INFO');
37
+ * await logger.info('User login', { userId: 123 });
38
+ * // Output: {"timestamp":"2026-02-08T18:30:00.000Z","level":"INFO","message":"User login","prefix":"API","data":{"userId":123}}
39
+ * ```
40
+ */
41
+ export declare class StructuredLogger implements Logger {
42
+ protected prefix: string | undefined;
43
+ protected level: number;
44
+ protected contextFn?: () => Record<string, unknown>;
45
+ /**
46
+ * Creates a new StructuredLogger instance.
47
+ *
48
+ * @param prefix - Optional prefix for log messages (e.g., 'APP', 'Plugin:Auth')
49
+ * @param logLevel - Optional log level (defaults to process.env.LOG_LEVEL or 'ERROR')
50
+ * @param contextFn - Optional function to add dynamic context to every log entry (e.g., request ID)
51
+ */
52
+ constructor(prefix?: string, logLevel?: LogLevel, contextFn?: () => Record<string, unknown>);
53
+ /**
54
+ * Logs an error message as JSON.
55
+ *
56
+ * @param message - Error message
57
+ * @param data - Optional additional data to include in log entry
58
+ */
59
+ error(message: string, data?: Record<string, unknown>): Promise<void>;
60
+ /**
61
+ * Logs a warning message as JSON.
62
+ *
63
+ * @param message - Warning message
64
+ * @param data - Optional additional data to include in log entry
65
+ */
66
+ warn(message: string, data?: Record<string, unknown>): Promise<void>;
67
+ /**
68
+ * Logs an informational message as JSON.
69
+ *
70
+ * @param message - Info message
71
+ * @param data - Optional additional data to include in log entry
72
+ */
73
+ info(message: string, data?: Record<string, unknown>): Promise<void>;
74
+ /**
75
+ * Logs a debug message as JSON.
76
+ *
77
+ * @param message - Debug message
78
+ * @param data - Optional additional data to include in log entry
79
+ */
80
+ debug(message: string, data?: Record<string, unknown>): Promise<void>;
81
+ /**
82
+ * Determines if a message at the given level should be logged.
83
+ *
84
+ * @param level - Log level of the message (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)
85
+ * @returns True if message should be logged
86
+ * @internal
87
+ */
88
+ protected shouldLog(level: number): boolean;
89
+ /**
90
+ * Writes a structured log entry as JSON to stdout or stderr.
91
+ *
92
+ * @param level - Log level string
93
+ * @param message - Log message
94
+ * @param data - Optional additional data
95
+ * @internal
96
+ */
97
+ protected write(level: string, message: string, data?: Record<string, unknown>): void;
98
+ }
99
+ //# sourceMappingURL=structured-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-logger.d.ts","sourceRoot":"","sources":["../../src/application/structured-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAanC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpD;;;;;;OAMG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ3F;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E;;;;;;OAMG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAsBtF"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Map log level names to numeric values for comparison.
3
+ * Lower numbers = higher priority (ERROR is highest).
4
+ */
5
+ const LOG_LEVEL_MAP = {
6
+ ERROR: 1,
7
+ WARN: 2,
8
+ INFO: 3,
9
+ DEBUG: 4,
10
+ };
11
+ /**
12
+ * Structured JSON logger implementation.
13
+ * Outputs logs as JSON objects for production environments with log aggregation.
14
+ *
15
+ * @remarks
16
+ * This logger is ideal for:
17
+ * - Production environments with centralized logging (e.g., ELK, CloudWatch)
18
+ * - Log parsing and filtering by log aggregation systems
19
+ * - Structured querying of logs
20
+ *
21
+ * Use ConsoleLogger for development where human-readable output is preferred.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const logger = new StructuredLogger('API', 'INFO');
26
+ * await logger.info('User login', { userId: 123 });
27
+ * // Output: {"timestamp":"2026-02-08T18:30:00.000Z","level":"INFO","message":"User login","prefix":"API","data":{"userId":123}}
28
+ * ```
29
+ */
30
+ export class StructuredLogger {
31
+ prefix;
32
+ level;
33
+ contextFn;
34
+ /**
35
+ * Creates a new StructuredLogger instance.
36
+ *
37
+ * @param prefix - Optional prefix for log messages (e.g., 'APP', 'Plugin:Auth')
38
+ * @param logLevel - Optional log level (defaults to process.env.LOG_LEVEL or 'ERROR')
39
+ * @param contextFn - Optional function to add dynamic context to every log entry (e.g., request ID)
40
+ */
41
+ constructor(prefix, logLevel, contextFn) {
42
+ this.prefix = prefix;
43
+ // Use provided log level, fall back to process.env.LOG_LEVEL, then default to ERROR
44
+ const levelFromEnv = (process.env.LOG_LEVEL || 'ERROR').toUpperCase();
45
+ this.level = LOG_LEVEL_MAP[logLevel || levelFromEnv] ?? 1;
46
+ this.contextFn = contextFn;
47
+ }
48
+ /**
49
+ * Logs an error message as JSON.
50
+ *
51
+ * @param message - Error message
52
+ * @param data - Optional additional data to include in log entry
53
+ */
54
+ async error(message, data) {
55
+ if (this.shouldLog(1)) {
56
+ this.write('ERROR', message, data);
57
+ }
58
+ }
59
+ /**
60
+ * Logs a warning message as JSON.
61
+ *
62
+ * @param message - Warning message
63
+ * @param data - Optional additional data to include in log entry
64
+ */
65
+ async warn(message, data) {
66
+ if (this.shouldLog(2)) {
67
+ this.write('WARN', message, data);
68
+ }
69
+ }
70
+ /**
71
+ * Logs an informational message as JSON.
72
+ *
73
+ * @param message - Info message
74
+ * @param data - Optional additional data to include in log entry
75
+ */
76
+ async info(message, data) {
77
+ if (this.shouldLog(3)) {
78
+ this.write('INFO', message, data);
79
+ }
80
+ }
81
+ /**
82
+ * Logs a debug message as JSON.
83
+ *
84
+ * @param message - Debug message
85
+ * @param data - Optional additional data to include in log entry
86
+ */
87
+ async debug(message, data) {
88
+ if (this.shouldLog(4) || process.env.DEBUG === 'true') {
89
+ this.write('DEBUG', message, data);
90
+ }
91
+ }
92
+ /**
93
+ * Determines if a message at the given level should be logged.
94
+ *
95
+ * @param level - Log level of the message (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)
96
+ * @returns True if message should be logged
97
+ * @internal
98
+ */
99
+ shouldLog(level) {
100
+ return level <= this.level;
101
+ }
102
+ /**
103
+ * Writes a structured log entry as JSON to stdout or stderr.
104
+ *
105
+ * @param level - Log level string
106
+ * @param message - Log message
107
+ * @param data - Optional additional data
108
+ * @internal
109
+ */
110
+ write(level, message, data) {
111
+ const entry = {
112
+ timestamp: new Date().toISOString(),
113
+ level: level,
114
+ message,
115
+ // Add prefix if set
116
+ ...(this.prefix && { prefix: this.prefix }),
117
+ // Add dynamic context from contextFn if provided
118
+ ...(this.contextFn && this.contextFn()),
119
+ // Add additional data if provided
120
+ ...(data && { data }),
121
+ };
122
+ const output = JSON.stringify(entry);
123
+ // Use console.error for ERROR level, console.log for all others
124
+ if (level === 'ERROR') {
125
+ console.error(output);
126
+ }
127
+ else {
128
+ console.log(output);
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=structured-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-logger.js","sourceRoot":"","sources":["../../src/application/structured-logger.ts"],"names":[],"mappings":"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"}