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,611 @@
1
+ import cookieParser from 'cookie-parser';
2
+ import cors from 'cors';
3
+ import express from 'express';
4
+ import helmet from 'helmet';
5
+ import path from 'node:path';
6
+ import { ForbiddenError, NotFoundError, UnauthorizedError, ValidationError } from '../errors/http-errors.js';
7
+ import { ApplicationSettings } from './application-settings.js';
8
+ import { ConsoleLogger } from './console-logger.js';
9
+ import { ControllerRegistry } from './controller-registry.js';
10
+ import { errorHandlerMiddleware } from './error-handler-middleware.js';
11
+ import { PluginRegistry } from './plugin.js';
12
+ import { requestIdMiddleware } from './request-id-middleware.js';
13
+ import { ServiceContainer, } from './service-container.js';
14
+ /**
15
+ * Main application class for building Express-based web applications.
16
+ * Provides a structured framework with dependency injection, routing, plugins,
17
+ * middleware, and error handling.
18
+ *
19
+ * @remarks
20
+ * WebApplication manages the complete lifecycle of an Express application including:
21
+ * - Configuration management via ApplicationSettings
22
+ * - Dependency injection via ServiceContainer
23
+ * - Plugin system for extensibility
24
+ * - Controller-based routing
25
+ * - Built-in middleware (CORS, body parsing, request ID, error handling)
26
+ * - Graceful shutdown handling
27
+ */
28
+ export class WebApplication {
29
+ settings;
30
+ expressApp;
31
+ server;
32
+ started;
33
+ serviceRegistry;
34
+ services;
35
+ plugins;
36
+ controllers;
37
+ logger;
38
+ lifecycleHooks;
39
+ signalHandlers;
40
+ /**
41
+ * Creates a new WebApplication instance.
42
+ *
43
+ * @param config - Optional application configuration
44
+ */
45
+ constructor(config) {
46
+ this.settings = new ApplicationSettings(config);
47
+ this.expressApp = express();
48
+ this.started = false;
49
+ // Create service registry owned by this application instance
50
+ this.serviceRegistry = { definitions: {}, singletons: {} };
51
+ this.services = new ServiceContainer(this.serviceRegistry, this.getSettings());
52
+ this.plugins = new PluginRegistry();
53
+ this.controllers = new ControllerRegistry();
54
+ // Pass log level from settings to logger constructor
55
+ const logLevel = this.settings.get('LOG_LEVEL', 'ERROR');
56
+ this.logger = new ConsoleLogger('APP', logLevel);
57
+ // Initialize lifecycle hooks
58
+ this.lifecycleHooks = {
59
+ beforeStart: [],
60
+ afterStart: [],
61
+ beforeShutdown: [],
62
+ afterShutdown: [],
63
+ };
64
+ this.signalHandlers = [];
65
+ }
66
+ /**
67
+ * Registers a lifecycle hook.
68
+ *
69
+ * @param event - The lifecycle event to hook into
70
+ * @param hook - The hook function to execute
71
+ * @returns This application instance for method chaining
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * app
76
+ * .on('beforeStart', async () => {
77
+ * await initializeDatabase();
78
+ * })
79
+ * .on('afterStart', () => {
80
+ * console.log('Server is ready!');
81
+ * });
82
+ * ```
83
+ */
84
+ on(event, hook) {
85
+ this.lifecycleHooks[event].push(hook);
86
+ return this;
87
+ }
88
+ /**
89
+ * Runs all hooks registered for a specific lifecycle event.
90
+ *
91
+ * @param event - The lifecycle event to run hooks for
92
+ * @internal
93
+ */
94
+ async runHooks(event) {
95
+ for (const hook of this.lifecycleHooks[event]) {
96
+ await hook();
97
+ }
98
+ }
99
+ /**
100
+ * Registers a service in the dependency injection container.
101
+ *
102
+ * @param service - Service definition to register
103
+ * @returns This application instance for method chaining
104
+ */
105
+ registerService(service) {
106
+ this.services.registerService(service);
107
+ return this;
108
+ }
109
+ /**
110
+ * Gets all application settings.
111
+ *
112
+ * @returns Application settings object
113
+ * @template T - Extended ApplicationSettings type
114
+ */
115
+ getSettings() {
116
+ return this.settings.getAll();
117
+ }
118
+ /**
119
+ * Loads configuration from .env.js and .env.local.js files in the current working directory.
120
+ *
121
+ * @internal
122
+ */
123
+ async loadConfiguration() {
124
+ const configFiles = [
125
+ path.join(process.cwd(), '.env.js'),
126
+ path.join(process.cwd(), '.env.local.js'),
127
+ ];
128
+ for (const f of configFiles) {
129
+ await this.settings.loadFromFile(f);
130
+ }
131
+ }
132
+ /**
133
+ * Sets up core Express middleware including trust proxy, CORS, body parsers,
134
+ * request ID, and security headers.
135
+ *
136
+ * @internal
137
+ */
138
+ async setupCoreMiddleware() {
139
+ // Trust proxy (required for nginx, load balancers)
140
+ // Enables proper IP detection, secure cookies, etc.
141
+ const { TRUST_PROXY = true, ENV_MODE, BODY_LIMIT = '10mb', CORS } = this.settings.getAll();
142
+ if (TRUST_PROXY) {
143
+ this.expressApp.set('trust proxy', 1);
144
+ await this.logger.info('Setting trust proxy to true');
145
+ }
146
+ this.expressApp.set('x-powered-by', false);
147
+ await this.logger.info(`Setting ENV to ${ENV_MODE}`);
148
+ this.expressApp.set('env', ENV_MODE);
149
+ // CORS middleware (if enabled)
150
+ if (CORS !== false && CORS !== undefined) {
151
+ const corsOptions = this.buildCorsOptions(CORS);
152
+ this.expressApp.use(cors(corsOptions));
153
+ await this.logger.info('CORS is enabled');
154
+ }
155
+ this.expressApp.use(cookieParser());
156
+ // Body parsers with configurable size limits
157
+ this.expressApp.use(express.json({ limit: BODY_LIMIT }));
158
+ this.expressApp.use(express.urlencoded({ extended: true, limit: BODY_LIMIT }));
159
+ await this.logger.info(`Request BODY_LIMIT is set to ${BODY_LIMIT}`);
160
+ this.expressApp.use(requestIdMiddleware());
161
+ // Request timing middleware - logs request duration after response completes
162
+ this.expressApp.use((req, res, next) => {
163
+ const start = Date.now();
164
+ // Log after response finishes
165
+ res.on('finish', () => {
166
+ const duration = Date.now() - start;
167
+ this.logger.info(`${req.method} ${req.originalUrl} ${res.statusCode} ${duration}ms`, {
168
+ method: req.method,
169
+ url: req.originalUrl,
170
+ statusCode: res.statusCode,
171
+ duration,
172
+ requestId: req.id,
173
+ });
174
+ });
175
+ next();
176
+ });
177
+ // Security headers via helmet (comprehensive, production-ready)
178
+ // Disable CSP and COEP to allow applications to configure them as needed
179
+ this.expressApp.use(helmet({
180
+ contentSecurityPolicy: false, // Let apps configure CSP themselves
181
+ crossOriginEmbedderPolicy: false, // May break APIs and embedded resources
182
+ }));
183
+ await this.logger.info('Security headers enabled via helmet');
184
+ }
185
+ /**
186
+ * Builds CORS options for the cors package from WebAFX CORS configuration.
187
+ *
188
+ * @param config - CORS configuration (true for defaults or custom config object)
189
+ * @returns Options object compatible with the cors package
190
+ * @internal
191
+ */
192
+ buildCorsOptions(config) {
193
+ if (config === true) {
194
+ // Sensible defaults: allow all origins with wildcard
195
+ return {
196
+ origin: '*', // Wildcard - returns '*' in Access-Control-Allow-Origin header
197
+ credentials: true,
198
+ optionsSuccessStatus: 204, // Respond with 204 for OPTIONS preflight
199
+ preflightContinue: false, // Let cors handle OPTIONS
200
+ };
201
+ }
202
+ // Map WebAFX CorsConfig to cors.CorsOptions
203
+ // Only include properties that are actually defined to avoid passing undefined to cors package
204
+ const corsOptions = {
205
+ optionsSuccessStatus: 204, // Respond with 204 for OPTIONS preflight
206
+ preflightContinue: false, // Let cors handle OPTIONS
207
+ };
208
+ // Handle origin configuration
209
+ if (config.origin !== undefined) {
210
+ // The cors package behavior with strings is to set them directly without validation
211
+ // We need to convert single strings to validation functions for proper origin checking
212
+ if (typeof config.origin === 'string') {
213
+ const allowedOrigin = config.origin;
214
+ corsOptions.origin = (requestOrigin, callback) => {
215
+ // Allow if request origin matches the configured origin
216
+ if (requestOrigin === allowedOrigin) {
217
+ callback(null, true);
218
+ }
219
+ else {
220
+ callback(null, false);
221
+ }
222
+ };
223
+ }
224
+ else {
225
+ // Arrays and functions can be passed through directly
226
+ corsOptions.origin = config.origin;
227
+ }
228
+ }
229
+ else {
230
+ // If no origin specified in config, default to wildcard (allow all)
231
+ corsOptions.origin = '*';
232
+ }
233
+ if (config.methods !== undefined) {
234
+ corsOptions.methods = config.methods;
235
+ }
236
+ if (config.allowedHeaders !== undefined) {
237
+ corsOptions.allowedHeaders = config.allowedHeaders;
238
+ }
239
+ if (config.exposedHeaders !== undefined) {
240
+ corsOptions.exposedHeaders = config.exposedHeaders;
241
+ }
242
+ if (config.credentials !== undefined) {
243
+ corsOptions.credentials = config.credentials;
244
+ }
245
+ if (config.maxAge !== undefined) {
246
+ corsOptions.maxAge = config.maxAge;
247
+ }
248
+ return corsOptions;
249
+ }
250
+ /**
251
+ * Sets up global error handling middleware.
252
+ *
253
+ * @internal
254
+ */
255
+ setupErrorHandling() {
256
+ this.expressApp.use(errorHandlerMiddleware(async (req, err, data) => {
257
+ const logger = await req.services.get('logger', this.logger);
258
+ await logger.error(data.error, data);
259
+ }, !this.settings.isProduction()));
260
+ }
261
+ /**
262
+ * Attaches the service container to each request.
263
+ *
264
+ * @internal
265
+ */
266
+ setupServiceContainer() {
267
+ this.expressApp.use((req, res, next) => {
268
+ // Create per-request container with shared registry
269
+ req.services = new ServiceContainer(this.serviceRegistry, this.getSettings(), req, res, next);
270
+ next();
271
+ });
272
+ }
273
+ /**
274
+ * Validates request data against a Zod schema.
275
+ *
276
+ * @param schema - Zod validation schema
277
+ * @param merged - Merged request data (params, query, body)
278
+ * @returns Validated data
279
+ * @throws {ValidationError} If validation fails
280
+ * @internal
281
+ */
282
+ async validateRequest(schema, merged) {
283
+ try {
284
+ // Note: Zod schemas should be defined with .strip() if you want to remove unknown properties
285
+ // Calling strip() here has no effect on already-created schemas
286
+ return await schema.parseAsync(merged);
287
+ }
288
+ catch (error) {
289
+ // Zod errors have 'issues' property, format them for the response
290
+ const zodError = error;
291
+ const formattedErrors = zodError.issues?.map(issue => ({
292
+ path: issue.path.join('.'),
293
+ message: issue.message,
294
+ code: issue.code,
295
+ })) || [];
296
+ await this.logger.debug(`[ERROR]`, formattedErrors);
297
+ throw new ValidationError('Validation failed', formattedErrors);
298
+ }
299
+ }
300
+ /**
301
+ * Wraps a route handler with authentication, authorization, and validation logic.
302
+ *
303
+ * @param controller - Controller instance
304
+ * @param route - Route definition
305
+ * @returns Express request handler
306
+ * @internal
307
+ */
308
+ wrapRouteHandler(controller, route) {
309
+ return async (req, res, next) => {
310
+ try {
311
+ // 1. Check authentication - resolve user service if secure route
312
+ if (route.secure) {
313
+ const user = await req.services.get('user', undefined);
314
+ if (!user) {
315
+ throw new UnauthorizedError('Authentication required');
316
+ }
317
+ }
318
+ // 2. Check authorization
319
+ if (route.authorize) {
320
+ const user = await req.services.get('user', undefined);
321
+ const authorized = await route.authorize(req, user);
322
+ if (!authorized) {
323
+ throw new ForbiddenError('Access denied');
324
+ }
325
+ }
326
+ // Separate input sources for type-safe access
327
+ const requestInput = {
328
+ params: req.params || {},
329
+ query: req.query || {},
330
+ body: req.body || {},
331
+ };
332
+ // Merged parameters for validation (backward compatible)
333
+ let parameters = {
334
+ ...requestInput.params,
335
+ ...requestInput.query,
336
+ ...requestInput.body,
337
+ };
338
+ // 3. Validate request
339
+ if (route.validation) {
340
+ parameters = await this.validateRequest(route.validation, parameters);
341
+ }
342
+ // Store both merged and separated input
343
+ req.services.set('request-params', parameters);
344
+ req.services.set('request-input', requestInput);
345
+ // 4. Call controller method
346
+ await route.handler.call(controller, req, res, next);
347
+ }
348
+ catch (error) {
349
+ next(error);
350
+ }
351
+ };
352
+ }
353
+ /**
354
+ * Registers all controllers and their routes with Express.
355
+ * Logs per-controller route count and a final total for clarity.
356
+ *
357
+ * @internal
358
+ */
359
+ async setupControllers() {
360
+ const controllers = this.controllers.getAll();
361
+ let totalRouteCount = 0;
362
+ for (const { basePath, ControllerClass } of controllers) {
363
+ const router = express.Router();
364
+ // Create controller instance with settings and services
365
+ const controller = new ControllerClass(this.settings, this.services);
366
+ // Get routes from controller
367
+ const routes = controller.routes();
368
+ // Register each route
369
+ for (const route of routes) {
370
+ const handler = this.wrapRouteHandler(controller, route);
371
+ // Combine route-level middleware with the handler
372
+ const handlers = [
373
+ ...(route.middleware || []),
374
+ handler,
375
+ ];
376
+ // Type-safe route registration with middleware support
377
+ switch (route.method) {
378
+ case 'get':
379
+ router.get(route.path, ...handlers);
380
+ break;
381
+ case 'post':
382
+ router.post(route.path, ...handlers);
383
+ break;
384
+ case 'put':
385
+ router.put(route.path, ...handlers);
386
+ break;
387
+ case 'patch':
388
+ router.patch(route.path, ...handlers);
389
+ break;
390
+ case 'delete':
391
+ router.delete(route.path, ...handlers);
392
+ break;
393
+ }
394
+ this.logger.debug(`Routing ${basePath}/${route.path} through ${route.method}->${ControllerClass.name}->${route.handler.name}`
395
+ .replace(/\/\//g, '/')
396
+ .replace(/\/\//g, '/'));
397
+ }
398
+ // Log per-controller route count for debugging
399
+ const controllerRouteCount = routes.length;
400
+ totalRouteCount += controllerRouteCount;
401
+ this.logger.info(`${controllerRouteCount} route${controllerRouteCount !== 1 ? 's' : ''} registered for ${ControllerClass.name}.`);
402
+ this.expressApp.use(basePath, router);
403
+ }
404
+ // Log total across all controllers
405
+ if (controllers.length > 0) {
406
+ this.logger.info(`Total: ${totalRouteCount} route${totalRouteCount !== 1 ? 's' : ''} registered.`);
407
+ }
408
+ }
409
+ /**
410
+ * Installs all registered plugins.
411
+ *
412
+ * @internal
413
+ */
414
+ async setupPlugins() {
415
+ await this.plugins.install(this, this.expressApp);
416
+ }
417
+ /**
418
+ * Initializes the application by setting up middleware, plugins, controllers, and error handling.
419
+ *
420
+ * @internal
421
+ */
422
+ async initialize() {
423
+ await this.loadConfiguration();
424
+ await this.runHooks('beforeStart');
425
+ await this.setupCoreMiddleware();
426
+ this.setupServiceContainer();
427
+ await this.setupPlugins();
428
+ await this.setupControllers();
429
+ this.setupHealth();
430
+ this.setup404Handler();
431
+ this.setupErrorHandling();
432
+ }
433
+ /**
434
+ * Registers a plugin with the application.
435
+ *
436
+ * @param plugin - Plugin definition
437
+ * @returns This application instance for method chaining
438
+ */
439
+ use(plugin) {
440
+ this.plugins.register(plugin);
441
+ return this;
442
+ }
443
+ /**
444
+ * Registers a controller with a base path.
445
+ *
446
+ * @param basePath - Base URL path for all controller routes
447
+ * @param ControllerClass - Controller class constructor
448
+ */
449
+ registerController(basePath, ControllerClass) {
450
+ this.controllers.register(basePath, ControllerClass);
451
+ }
452
+ /**
453
+ * Performs graceful shutdown of the application and all plugins.
454
+ * Disposes all singleton services before shutting down plugins.
455
+ *
456
+ * @internal
457
+ */
458
+ async shutdown() {
459
+ if (this.started) {
460
+ this.started = false;
461
+ await this.runHooks('beforeShutdown');
462
+ // Dispose services before plugin shutdown
463
+ await this.services.disposeAll();
464
+ await this.plugins.shutdown();
465
+ await this.runHooks('afterShutdown');
466
+ }
467
+ }
468
+ /**
469
+ * Sets up the /health endpoint for health checks.
470
+ *
471
+ * @internal
472
+ */
473
+ setupHealth() {
474
+ this.expressApp.get('/health', async (req, res) => {
475
+ const health = await this.plugins.health();
476
+ res.status(health ? 200 : 503).json({
477
+ health,
478
+ timestamp: Date.now(),
479
+ });
480
+ });
481
+ }
482
+ /**
483
+ * Sets up 404 catch-all handler for unknown routes.
484
+ * Must be called after setupControllers() but before setupErrorHandling().
485
+ *
486
+ * @internal
487
+ */
488
+ setup404Handler() {
489
+ this.expressApp.use((req, res, next) => {
490
+ next(new NotFoundError(`Cannot ${req.method} ${req.path}`));
491
+ });
492
+ }
493
+ /**
494
+ * Access the underlying Express application instance.
495
+ * Use this for features not directly exposed by WebApplication,
496
+ * such as static file serving, view engines, or WebSocket integration.
497
+ *
498
+ * @returns The Express application instance
499
+ *
500
+ * @example
501
+ * ```typescript
502
+ * const app = new WebApplication();
503
+ * // Add static file serving
504
+ * app.express.use(express.static('public'));
505
+ * ```
506
+ */
507
+ get express() {
508
+ return this.expressApp;
509
+ }
510
+ /**
511
+ * Sets up signal handlers (SIGTERM, SIGINT) for graceful shutdown.
512
+ *
513
+ * @param shutdown - The shutdown function to call when signal is received
514
+ * @internal
515
+ */
516
+ setupSignalHandlers(shutdown) {
517
+ const createHandler = (signal) => {
518
+ const handler = () => {
519
+ shutdown();
520
+ };
521
+ process.on(signal, handler);
522
+ this.signalHandlers.push({ signal, handler });
523
+ };
524
+ createHandler('SIGTERM');
525
+ createHandler('SIGINT');
526
+ }
527
+ /**
528
+ * Cleans up registered signal handlers.
529
+ * This prevents memory leaks and duplicate handler execution.
530
+ *
531
+ * @internal
532
+ */
533
+ cleanupSignalHandlers() {
534
+ for (const { signal, handler } of this.signalHandlers) {
535
+ process.removeListener(signal, handler);
536
+ }
537
+ this.signalHandlers = [];
538
+ }
539
+ /**
540
+ * Creates a shutdown function for graceful application termination.
541
+ *
542
+ * @param server - The HTTP server instance
543
+ * @param shutdownDelay - Maximum time to wait before forcing shutdown (milliseconds)
544
+ * @returns Shutdown function that performs graceful shutdown
545
+ * @internal
546
+ */
547
+ createShutdownFn(server, shutdownDelay) {
548
+ let shuttingDown = false;
549
+ return async () => {
550
+ if (shuttingDown) {
551
+ return;
552
+ }
553
+ shuttingDown = true;
554
+ await this.logger.info(`Shutting down gracefully (timeout: ${shutdownDelay / 1000}s)...`);
555
+ // Stop accepting new connections and wait for completion
556
+ await new Promise((resolve) => {
557
+ server.close(async () => {
558
+ await this.shutdown();
559
+ await this.logger.info('Shutdown complete.');
560
+ resolve();
561
+ });
562
+ // Force-close connections after timeout
563
+ setTimeout(() => {
564
+ server.closeIdleConnections();
565
+ server.closeAllConnections();
566
+ }, shutdownDelay);
567
+ });
568
+ // Clean up signal handlers to prevent duplicate calls
569
+ this.cleanupSignalHandlers();
570
+ };
571
+ }
572
+ /**
573
+ * Starts the web server and begins listening for requests.
574
+ * Sets up graceful shutdown handlers for SIGTERM and SIGINT signals.
575
+ *
576
+ * @returns Promise that resolves to a shutdown function that performs graceful shutdown
577
+ * @throws {Error} If application is already started
578
+ *
579
+ * @example
580
+ * ```typescript
581
+ * const app = new WebApplication({ PORT: 3000 });
582
+ * const shutdown = await app.start();
583
+ *
584
+ * // Later, to shutdown:
585
+ * await shutdown();
586
+ * ```
587
+ */
588
+ async start() {
589
+ if (this.started) {
590
+ throw new Error('Application already started');
591
+ }
592
+ const { PORT = 4000, SHUTDOWN_TIMEOUT = 7, ENV_MODE } = this.settings.getAll();
593
+ const shutdownDelay = this.settings.isProduction() ? SHUTDOWN_TIMEOUT * 1000 : 1000;
594
+ await this.initialize();
595
+ return new Promise((resolve, reject) => {
596
+ const server = this.expressApp.listen(PORT, async (err) => {
597
+ if (err) {
598
+ return reject(err);
599
+ }
600
+ this.server = server;
601
+ this.started = true;
602
+ await this.logger.info(`Server listening on http://localhost:${PORT} (${ENV_MODE})`);
603
+ await this.runHooks('afterStart');
604
+ const shutdown = this.createShutdownFn(server, shutdownDelay);
605
+ this.setupSignalHandlers(shutdown);
606
+ resolve(shutdown);
607
+ });
608
+ });
609
+ }
610
+ }
611
+ //# sourceMappingURL=web-application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-application.js","sourceRoot":"","sources":["../../src/application/web-application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { StandardErrorResponse } from './types.js';
2
+ /**
3
+ * Base API error class
4
+ * All custom errors should extend this class
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * throw new ApiError(400, 'INVALID_INPUT', 'Invalid user input', { field: 'email' });
9
+ * ```
10
+ */
11
+ export declare class ApiError extends Error {
12
+ statusCode: number;
13
+ code: string;
14
+ details?: any | undefined;
15
+ constructor(statusCode: number, code: string, message: string, details?: any | undefined);
16
+ /**
17
+ * Convert error to standard JSON response format
18
+ */
19
+ toJSON(): StandardErrorResponse;
20
+ }
21
+ //# sourceMappingURL=api-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../src/errors/api-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;GAQG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,UAAU,EAAE,MAAM;IAClB,IAAI,EAAE,MAAM;IAEZ,OAAO,CAAC,EAAE,GAAG;gBAHb,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,GAAG,YAAA;IAOtB;;OAEG;IACH,MAAM,IAAI,qBAAqB;CAYhC"}