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,258 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { basename, resolve, dirname } from "node:path";
3
+ /**
4
+ * Translation source that loads from JSON files.
5
+ *
6
+ * Supports two file formats:
7
+ * 1. Multi-locale: `{ key: { locale: value } }` — all locales in one file
8
+ * 2. Single-locale: `{ key: value }` — one file per locale, locale from filename
9
+ *
10
+ * Format is auto-detected per file based on the structure of the first value.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const source = new JsonFileSource({
15
+ * paths: ["./translations/*.json"],
16
+ * });
17
+ * const catalog = await source.load();
18
+ * ```
19
+ */
20
+ export class JsonFileSource {
21
+ /** @inheritdoc */
22
+ name = "JsonFileSource";
23
+ /** Source configuration */
24
+ config;
25
+ /**
26
+ * Create a new JsonFileSource.
27
+ *
28
+ * @param config - File paths or glob patterns configuration
29
+ */
30
+ constructor(config) {
31
+ this.config = config;
32
+ }
33
+ /**
34
+ * Load all translations from configured JSON file paths.
35
+ *
36
+ * 1. Resolves all glob patterns to file paths
37
+ * 2. Reads and parses each JSON file
38
+ * 3. Auto-detects format (multi-locale vs single-locale)
39
+ * 4. Normalizes into TranslationCatalog entries
40
+ * 5. Merges all entries (later files override earlier for same key+locale)
41
+ *
42
+ * @returns The complete translation catalog from all matched files
43
+ * @throws Error if a file cannot be read or parsed
44
+ */
45
+ async load() {
46
+ const catalog = {};
47
+ // Resolve all glob patterns to file paths
48
+ const filePaths = await resolveGlobs(this.config.paths);
49
+ for (const filePath of filePaths) {
50
+ const content = await readFile(filePath, "utf-8");
51
+ let data;
52
+ try {
53
+ data = JSON.parse(content);
54
+ }
55
+ catch (error) {
56
+ throw new Error(`Failed to parse JSON file "${filePath}": ${error instanceof Error ? error.message : String(error)}`);
57
+ }
58
+ // Auto-detect format and normalize into catalog
59
+ const format = detectFormat(data);
60
+ if (format === "multi-locale") {
61
+ // Multi-locale: { key: { locale: value } }
62
+ mergeMultiLocale(catalog, data);
63
+ }
64
+ else {
65
+ // Single-locale: { key: value }, locale from filename
66
+ const locale = extractLocaleFromFilename(basename(filePath));
67
+ mergeSingleLocale(catalog, data, locale);
68
+ }
69
+ }
70
+ return catalog;
71
+ }
72
+ }
73
+ /**
74
+ * Create a JsonFileSource instance. Convenience factory for plugin configuration.
75
+ *
76
+ * @param config - JSON file source configuration
77
+ * @returns A new JsonFileSource instance
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * app.use(createI18nPlugin({
82
+ * sources: [
83
+ * jsonFileSource({ paths: ["./translations/*.json"] }),
84
+ * ],
85
+ * }));
86
+ * ```
87
+ */
88
+ export function jsonFileSource(config) {
89
+ return new JsonFileSource(config);
90
+ }
91
+ /**
92
+ * Detect if a JSON file is multi-locale or single-locale format.
93
+ *
94
+ * Heuristic: Look at the first value in the object.
95
+ * - If it's a string or array → single-locale (flat key→value)
96
+ * - If it's a plain object → multi-locale (key→{locale: value})
97
+ * - Empty object → defaults to multi-locale (no keys to process anyway)
98
+ *
99
+ * @param data - Parsed JSON object
100
+ * @returns "multi-locale" or "single-locale"
101
+ */
102
+ function detectFormat(data) {
103
+ const firstValue = Object.values(data)[0];
104
+ // Empty file — treat as multi-locale (no entries either way)
105
+ if (firstValue === undefined) {
106
+ return "multi-locale";
107
+ }
108
+ // String or array → single-locale format
109
+ if (typeof firstValue === "string" || Array.isArray(firstValue)) {
110
+ return "single-locale";
111
+ }
112
+ // Object → multi-locale format
113
+ if (typeof firstValue === "object" && firstValue !== null) {
114
+ return "multi-locale";
115
+ }
116
+ // Fallback: treat as single-locale
117
+ return "single-locale";
118
+ }
119
+ /**
120
+ * Extract locale from a filename.
121
+ *
122
+ * Supports patterns:
123
+ * - "en.json" → "en"
124
+ * - "nl_NL.json" → "nl_NL"
125
+ * - "translations.en.json" → "en"
126
+ * - "strings.nl.json" → "nl"
127
+ *
128
+ * Uses the last segment before the final .json extension.
129
+ *
130
+ * @param filename - The file name (without directory path)
131
+ * @returns The extracted locale string
132
+ * @throws Error if no locale can be determined from the filename
133
+ */
134
+ function extractLocaleFromFilename(filename) {
135
+ // Remove the .json extension
136
+ const withoutExt = filename.replace(/\.json$/i, "");
137
+ // Split by dots and take the last segment
138
+ const segments = withoutExt.split(".");
139
+ const locale = segments[segments.length - 1];
140
+ if (!locale) {
141
+ throw new Error(`Cannot determine locale from filename "${filename}"`);
142
+ }
143
+ return locale;
144
+ }
145
+ /**
146
+ * Merge a multi-locale file's data into an existing catalog.
147
+ *
148
+ * Multi-locale format: { key: { locale: value } }
149
+ *
150
+ * @param catalog - The target catalog to merge into (mutated)
151
+ * @param data - The multi-locale file data
152
+ */
153
+ function mergeMultiLocale(catalog, data) {
154
+ for (const [key, localeMap] of Object.entries(data)) {
155
+ if (!catalog[key]) {
156
+ catalog[key] = {};
157
+ }
158
+ for (const [locale, value] of Object.entries(localeMap)) {
159
+ // Normalize the value to TranslationValue
160
+ catalog[key][locale] = normalizeValue(value);
161
+ }
162
+ }
163
+ }
164
+ /**
165
+ * Merge a single-locale file's data into an existing catalog.
166
+ *
167
+ * Single-locale format: { key: value } with locale from filename.
168
+ *
169
+ * @param catalog - The target catalog to merge into (mutated)
170
+ * @param data - The single-locale file data
171
+ * @param locale - The locale extracted from the filename
172
+ */
173
+ function mergeSingleLocale(catalog, data, locale) {
174
+ for (const [key, value] of Object.entries(data)) {
175
+ if (!catalog[key]) {
176
+ catalog[key] = {};
177
+ }
178
+ catalog[key][locale] = normalizeValue(value);
179
+ }
180
+ }
181
+ /**
182
+ * Normalize a raw JSON value to a TranslationValue.
183
+ *
184
+ * - Strings pass through as-is
185
+ * - Arrays of exactly 2 strings become [singular, plural] tuples
186
+ * - Other values are converted to string via String()
187
+ *
188
+ * @param value - The raw value from JSON
189
+ * @returns Normalized TranslationValue
190
+ */
191
+ function normalizeValue(value) {
192
+ if (typeof value === "string") {
193
+ return value;
194
+ }
195
+ // Check for plural array [singular, plural]
196
+ if (Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "string") {
197
+ return value;
198
+ }
199
+ // Fallback: convert to string
200
+ return String(value);
201
+ }
202
+ /**
203
+ * Resolve glob patterns to file paths.
204
+ *
205
+ * Supports simple glob patterns like "dir/*.json" by listing the
206
+ * directory and filtering by extension. Non-glob paths are returned
207
+ * as-is (resolved to absolute).
208
+ *
209
+ * @param patterns - Array of file paths or glob patterns
210
+ * @returns Array of resolved file paths, sorted for deterministic ordering
211
+ */
212
+ async function resolveGlobs(patterns) {
213
+ const allPaths = [];
214
+ for (const pattern of patterns) {
215
+ // Check if it's a glob pattern (contains * or ?)
216
+ if (pattern.includes("*") || pattern.includes("?")) {
217
+ const matches = await expandSimpleGlob(pattern);
218
+ allPaths.push(...matches);
219
+ }
220
+ else {
221
+ // Plain file path — resolve to absolute
222
+ allPaths.push(resolve(pattern));
223
+ }
224
+ }
225
+ // Sort for deterministic file ordering
226
+ return allPaths.sort();
227
+ }
228
+ /**
229
+ * Expand a simple glob pattern like "dir/*.json" into matching file paths.
230
+ *
231
+ * Supports only `*` wildcards in the filename part (not recursive `**`).
232
+ * This covers the primary use case for translation files without needing
233
+ * an external glob library.
234
+ *
235
+ * @param pattern - A glob pattern (e.g., "./translations/*.json")
236
+ * @returns Array of matching absolute file paths
237
+ */
238
+ async function expandSimpleGlob(pattern) {
239
+ const dir = dirname(pattern);
240
+ const filePattern = basename(pattern);
241
+ // Convert glob pattern to regex: * → [^/]*, ? → [^/]
242
+ const regexStr = filePattern
243
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&") // Escape regex special chars (except * and ?)
244
+ .replace(/\*/g, "[^/]*")
245
+ .replace(/\?/g, "[^/]");
246
+ const regex = new RegExp(`^${regexStr}$`);
247
+ try {
248
+ const entries = await readdir(resolve(dir));
249
+ return entries
250
+ .filter((entry) => regex.test(entry))
251
+ .map((entry) => resolve(dir, entry));
252
+ }
253
+ catch {
254
+ // Directory doesn't exist — return empty (no matches)
255
+ return [];
256
+ }
257
+ }
258
+ //# sourceMappingURL=json-file-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-file-source.js","sourceRoot":"","sources":["../src/json-file-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { TranslationCatalog } from "./types.js";
2
+ /**
3
+ * Merge multiple translation catalogs into one.
4
+ *
5
+ * Catalogs are merged in array order. For duplicate key+locale pairs,
6
+ * the later source wins (predictable override order). This allows
7
+ * layered translation loading where database overrides can sit on top
8
+ * of file-based defaults.
9
+ *
10
+ * @param catalogs - Array of catalogs to merge (in priority order, last wins)
11
+ * @returns The merged catalog containing all keys from all sources
12
+ *
13
+ * @example
14
+ * const base = { greeting: { en: "Hello", nl: "Hallo" } };
15
+ * const overrides = { greeting: { en: "Hi" } };
16
+ * mergeCatalogs([base, overrides]);
17
+ * // → { greeting: { en: "Hi", nl: "Hallo" } }
18
+ */
19
+ export declare function mergeCatalogs(catalogs: TranslationCatalog[]): TranslationCatalog;
20
+ //# sourceMappingURL=merge-catalogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-catalogs.d.ts","sourceRoot":"","sources":["../src/merge-catalogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,CAgBhF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Merge multiple translation catalogs into one.
3
+ *
4
+ * Catalogs are merged in array order. For duplicate key+locale pairs,
5
+ * the later source wins (predictable override order). This allows
6
+ * layered translation loading where database overrides can sit on top
7
+ * of file-based defaults.
8
+ *
9
+ * @param catalogs - Array of catalogs to merge (in priority order, last wins)
10
+ * @returns The merged catalog containing all keys from all sources
11
+ *
12
+ * @example
13
+ * const base = { greeting: { en: "Hello", nl: "Hallo" } };
14
+ * const overrides = { greeting: { en: "Hi" } };
15
+ * mergeCatalogs([base, overrides]);
16
+ * // → { greeting: { en: "Hi", nl: "Hallo" } }
17
+ */
18
+ export function mergeCatalogs(catalogs) {
19
+ const result = {};
20
+ for (const catalog of catalogs) {
21
+ for (const [key, entry] of Object.entries(catalog)) {
22
+ if (!result[key]) {
23
+ // First occurrence of this key — copy the entry
24
+ result[key] = { ...entry };
25
+ }
26
+ else {
27
+ // Merge locale entries — later sources override earlier
28
+ Object.assign(result[key], entry);
29
+ }
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ //# sourceMappingURL=merge-catalogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-catalogs.js","sourceRoot":"","sources":["../src/merge-catalogs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,QAA8B;IACxD,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,gDAAgD;gBAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,wDAAwD;gBACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Node.js entry point for @blendsdk/i18n.
3
+ *
4
+ * This module re-exports the entire browser-safe core (Translator, mergeCatalogs,
5
+ * types, TranslationSource) plus the Node.js-only file-based translation sources
6
+ * (JsonFileSource, ContentFileSource) that depend on `node:fs` and `node:path`.
7
+ *
8
+ * **Import paths:**
9
+ * - `@blendsdk/i18n` — Browser-safe core (works everywhere)
10
+ * - `@blendsdk/i18n/node` — Full package including file-based sources (Node.js only)
11
+ *
12
+ * @module @blendsdk/i18n/node
13
+ */
14
+ export { Translator, mergeCatalogs, } from "./index.js";
15
+ export type { TranslationValue, TranslationEntry, TranslationCatalog, TranslatorConfig, LocaleParts, TranslationSource, } from "./index.js";
16
+ export { JsonFileSource, jsonFileSource } from "./json-file-source.js";
17
+ export type { JsonFileSourceConfig } from "./json-file-source.js";
18
+ export { ContentFileSource, contentFileSource } from "./content-file-source.js";
19
+ export type { ContentFileSourceConfig } from "./content-file-source.js";
20
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACH,UAAU,EACV,aAAa,GAChB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Node.js entry point for @blendsdk/i18n.
3
+ *
4
+ * This module re-exports the entire browser-safe core (Translator, mergeCatalogs,
5
+ * types, TranslationSource) plus the Node.js-only file-based translation sources
6
+ * (JsonFileSource, ContentFileSource) that depend on `node:fs` and `node:path`.
7
+ *
8
+ * **Import paths:**
9
+ * - `@blendsdk/i18n` — Browser-safe core (works everywhere)
10
+ * - `@blendsdk/i18n/node` — Full package including file-based sources (Node.js only)
11
+ *
12
+ * @module @blendsdk/i18n/node
13
+ */
14
+ // Re-export everything from the browser-safe core
15
+ export { Translator, mergeCatalogs, } from "./index.js";
16
+ // Node.js-only sources
17
+ export { JsonFileSource, jsonFileSource } from "./json-file-source.js";
18
+ export { ContentFileSource, contentFileSource } from "./content-file-source.js";
19
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kDAAkD;AAClD,OAAO,EACH,UAAU,EACV,aAAa,GAChB,MAAM,YAAY,CAAC;AAWpB,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { TranslationCatalog } from "./types.js";
2
+ /**
3
+ * Abstract interface for translation data sources.
4
+ *
5
+ * A TranslationSource loads translations from an external backend
6
+ * (JSON files, database, remote API, etc.) and returns them as a
7
+ * TranslationCatalog. Sources are composable — multiple sources
8
+ * can be loaded and merged into a single catalog.
9
+ *
10
+ * Each source implementation is responsible for:
11
+ * 1. Connecting to its backend (file system, database, etc.)
12
+ * 2. Reading translation data
13
+ * 3. Normalizing data into the TranslationCatalog format
14
+ *
15
+ * Sources are loaded at application startup and optionally re-loaded
16
+ * when a reload is triggered (e.g., via pub/sub).
17
+ */
18
+ export interface TranslationSource {
19
+ /**
20
+ * Human-readable name for logging (e.g., "JsonFileSource", "PostgreSQLSource").
21
+ */
22
+ readonly name: string;
23
+ /**
24
+ * Load all translations from this source.
25
+ *
26
+ * Called at application startup and on reload events.
27
+ * Must return a complete TranslationCatalog.
28
+ * If the source is unavailable, should throw with a descriptive error.
29
+ *
30
+ * @returns The complete translation catalog from this source
31
+ * @throws Error if the source cannot be read
32
+ */
33
+ load(): Promise<TranslationCatalog>;
34
+ }
35
+ //# sourceMappingURL=translation-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation-source.d.ts","sourceRoot":"","sources":["../src/translation-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;OASG;IACH,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=translation-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation-source.js","sourceRoot":"","sources":["../src/translation-source.ts"],"names":[],"mappings":""}
@@ -0,0 +1,162 @@
1
+ import type { TranslationCatalog, TranslationEntry, TranslationValue, TranslatorConfig, LocaleParts } from "./types.js";
2
+ /**
3
+ * Core translation engine.
4
+ *
5
+ * Provides translation lookup with locale fallback, plural support,
6
+ * and string interpolation via `formatString`. The catalog is treated
7
+ * as immutable after construction — use `setCatalog()` for atomic
8
+ * replacement (e.g., on reload).
9
+ *
10
+ * Runtime-agnostic: no Node.js or browser-specific APIs.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const translator = new Translator({
15
+ * defaultLocale: "en",
16
+ * catalog: {
17
+ * greeting: { en: "Hello ${name}", nl: "Hallo ${name}" },
18
+ * book: { en: ["${count} book", "${count} books"] },
19
+ * },
20
+ * });
21
+ *
22
+ * translator.translate("greeting", "en", { name: "Alice" });
23
+ * // → "Hello Alice"
24
+ *
25
+ * translator.translate("book", "en", { count: 5 });
26
+ * // → "5 books"
27
+ * ```
28
+ */
29
+ export declare class Translator {
30
+ /** The default locale used when none is specified */
31
+ protected defaultLocale: string;
32
+ /** The translation catalog (atomic reference for reload safety) */
33
+ protected catalog: TranslationCatalog;
34
+ /** Cache for parsed locale parts to avoid repeated parsing */
35
+ protected localeCache: Map<string, LocaleParts>;
36
+ /** Optional callback for missing translations */
37
+ protected onMissingTranslation?: (key: string, locale: string) => void;
38
+ /**
39
+ * Create a new Translator instance.
40
+ *
41
+ * @param config - Optional configuration (defaults to "en" locale, empty catalog)
42
+ */
43
+ constructor(config?: TranslatorConfig);
44
+ /**
45
+ * Translate a key for a given locale with optional parameter interpolation.
46
+ *
47
+ * Locale fallback chain: exact locale → language only → key as-is.
48
+ * Plural selection: if the translation value is a [singular, plural] tuple
49
+ * and params contains a `count` property, the appropriate form is selected.
50
+ *
51
+ * @param key - Translation key (e.g., "greeting", "auth.login")
52
+ * @param locale - Target locale (e.g., "en_GB", "nl"). Uses defaultLocale if omitted.
53
+ * @param params - Optional interpolation parameters
54
+ * @returns The translated, interpolated string
55
+ *
56
+ * @example
57
+ * translator.translate("greeting", "en", { name: "Alice" })
58
+ * // → "Hello Alice"
59
+ *
60
+ * translator.translate("book", "en", { count: 1 })
61
+ * // → "1 book"
62
+ *
63
+ * translator.translate("book", "en", { count: 5 })
64
+ * // → "5 books"
65
+ *
66
+ * translator.translate("unknown.key", "en")
67
+ * // → "unknown.key" (key returned as-is)
68
+ */
69
+ translate(key: string, locale?: string, params?: Record<string, unknown>): string;
70
+ /**
71
+ * Get all translations for a specific locale as a flat key-value map.
72
+ *
73
+ * Resolves each key using the locale fallback chain (exact → language).
74
+ * Plural values are returned as-is (the array form) since the client
75
+ * needs both forms for dynamic count-based selection.
76
+ *
77
+ * Primarily used to serve translations to frontend clients.
78
+ *
79
+ * @param locale - Target locale (e.g., "en", "nl_NL")
80
+ * @returns Flat map of { key: resolvedValue } for the locale
81
+ *
82
+ * @example
83
+ * translator.getTranslationsForLocale("nl")
84
+ * // → { greeting: "Hallo ${name}", book: ["${count} boek", "${count} boeken"] }
85
+ */
86
+ getTranslationsForLocale(locale: string): Record<string, TranslationValue>;
87
+ /**
88
+ * Check if a translation key exists, optionally for a specific locale.
89
+ *
90
+ * @param key - Translation key
91
+ * @param locale - Optional: check for this specific locale (with fallback)
92
+ * @returns true if the key exists (and has a value for the locale if specified)
93
+ */
94
+ hasKey(key: string, locale?: string): boolean;
95
+ /**
96
+ * Atomically replace the translation catalog.
97
+ *
98
+ * Used by the reload mechanism to swap in a new catalog without
99
+ * affecting ongoing translations. The old catalog serves current
100
+ * requests; the new catalog serves subsequent ones.
101
+ *
102
+ * @param catalog - The new translation catalog
103
+ */
104
+ setCatalog(catalog: TranslationCatalog): void;
105
+ /**
106
+ * Get the current translation catalog.
107
+ * Primarily useful for testing and debugging.
108
+ *
109
+ * @returns The current TranslationCatalog
110
+ */
111
+ getCatalog(): TranslationCatalog;
112
+ /**
113
+ * Get the configured default locale.
114
+ * @returns The default locale string
115
+ */
116
+ getDefaultLocale(): string;
117
+ /**
118
+ * Parse and cache a locale string into its component parts.
119
+ *
120
+ * Handles formats like:
121
+ * - "en" → { full: "en", language: "en" }
122
+ * - "en_GB" → { full: "en_GB", language: "en", region: "GB" }
123
+ * - "en-GB" → { full: "en_GB", language: "en", region: "GB" } (normalizes dash to underscore)
124
+ * - "en_GB.UTF-8" → { full: "en_GB", language: "en", region: "GB" } (strips encoding)
125
+ *
126
+ * Results are cached in a Map for O(1) subsequent lookups.
127
+ *
128
+ * @param locale - The locale string to parse
129
+ * @returns Parsed LocaleParts
130
+ */
131
+ protected parseLocale(locale: string): LocaleParts;
132
+ /**
133
+ * Resolve the best translation value from an entry for a given locale.
134
+ *
135
+ * Fallback chain:
136
+ * 1. Exact match: entry[locale_full] (e.g., entry["en_GB"])
137
+ * 2. Language match: entry[language] (e.g., entry["en"])
138
+ * 3. undefined (not found)
139
+ *
140
+ * @param entry - The translation entry for a key
141
+ * @param localeParts - Parsed locale parts
142
+ * @returns The resolved value, or undefined if no match
143
+ */
144
+ protected resolveValue(entry: TranslationEntry, localeParts: LocaleParts): TranslationValue | undefined;
145
+ /**
146
+ * Select singular or plural form based on the `count` parameter.
147
+ *
148
+ * If the value is a [singular, plural] tuple and params.count exists
149
+ * and is a number:
150
+ * - count === 1 → singular (index 0)
151
+ * - count !== 1 → plural (index 1)
152
+ *
153
+ * If the value is a simple string, returns it unchanged.
154
+ * If count is not a valid number, defaults to singular.
155
+ *
156
+ * @param value - The translation value (string or [singular, plural])
157
+ * @param params - Parameters that may contain a `count` property
158
+ * @returns The selected string form
159
+ */
160
+ protected selectPlural(value: TranslationValue, params?: Record<string, unknown>): string;
161
+ }
162
+ //# sourceMappingURL=translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,UAAU;IACnB,qDAAqD;IACrD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAEhC,mEAAmE;IACnE,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAEtC,8DAA8D;IAC9D,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEhD,iDAAiD;IACjD,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvE;;;;OAIG;gBACS,MAAM,CAAC,EAAE,gBAAgB;IAOrC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IA2BjF;;;;;;;;;;;;;;;OAeG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAc1E;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU7C;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAM7C;;;;;OAKG;IACH,UAAU,IAAI,kBAAkB;IAIhC;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IA4BlD;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,YAAY,CAClB,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,WAAW,GACzB,gBAAgB,GAAG,SAAS;IAe/B;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAe5F"}