@digitaldefiance/node-express-suite 1.0.2

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 (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +673 -0
  3. package/dist/application-base.d.ts +112 -0
  4. package/dist/application-base.d.ts.map +1 -0
  5. package/dist/application-base.js +301 -0
  6. package/dist/application-base.js.map +1 -0
  7. package/dist/application.d.ts +22 -0
  8. package/dist/application.d.ts.map +1 -0
  9. package/dist/application.js +123 -0
  10. package/dist/application.js.map +1 -0
  11. package/dist/backup-code.d.ts +67 -0
  12. package/dist/backup-code.d.ts.map +1 -0
  13. package/dist/backup-code.js +270 -0
  14. package/dist/backup-code.js.map +1 -0
  15. package/dist/constants.d.ts +16 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +54 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/controllers/base.d.ts +60 -0
  20. package/dist/controllers/base.d.ts.map +1 -0
  21. package/dist/controllers/base.js +270 -0
  22. package/dist/controllers/base.js.map +1 -0
  23. package/dist/controllers/index.d.ts +3 -0
  24. package/dist/controllers/index.d.ts.map +1 -0
  25. package/dist/controllers/index.js +19 -0
  26. package/dist/controllers/index.js.map +1 -0
  27. package/dist/controllers/user.d.ts +42 -0
  28. package/dist/controllers/user.d.ts.map +1 -0
  29. package/dist/controllers/user.js +750 -0
  30. package/dist/controllers/user.js.map +1 -0
  31. package/dist/decorators/base-controller.d.ts +9 -0
  32. package/dist/decorators/base-controller.d.ts.map +1 -0
  33. package/dist/decorators/base-controller.js +49 -0
  34. package/dist/decorators/base-controller.js.map +1 -0
  35. package/dist/decorators/controller.d.ts +31 -0
  36. package/dist/decorators/controller.d.ts.map +1 -0
  37. package/dist/decorators/controller.js +67 -0
  38. package/dist/decorators/controller.js.map +1 -0
  39. package/dist/decorators/index.d.ts +4 -0
  40. package/dist/decorators/index.d.ts.map +1 -0
  41. package/dist/decorators/index.js +20 -0
  42. package/dist/decorators/index.js.map +1 -0
  43. package/dist/decorators/zod-validation.d.ts +5 -0
  44. package/dist/decorators/zod-validation.d.ts.map +1 -0
  45. package/dist/decorators/zod-validation.js +47 -0
  46. package/dist/decorators/zod-validation.js.map +1 -0
  47. package/dist/defaults.d.ts +7 -0
  48. package/dist/defaults.d.ts.map +1 -0
  49. package/dist/defaults.js +83 -0
  50. package/dist/defaults.js.map +1 -0
  51. package/dist/documents/base.d.ts +3 -0
  52. package/dist/documents/base.d.ts.map +1 -0
  53. package/dist/documents/base.js +3 -0
  54. package/dist/documents/base.js.map +1 -0
  55. package/dist/documents/email-token.d.ts +8 -0
  56. package/dist/documents/email-token.d.ts.map +1 -0
  57. package/dist/documents/email-token.js +3 -0
  58. package/dist/documents/email-token.js.map +1 -0
  59. package/dist/documents/index.d.ts +8 -0
  60. package/dist/documents/index.d.ts.map +1 -0
  61. package/dist/documents/index.js +3 -0
  62. package/dist/documents/index.js.map +1 -0
  63. package/dist/documents/mnemonic.d.ts +8 -0
  64. package/dist/documents/mnemonic.d.ts.map +1 -0
  65. package/dist/documents/mnemonic.js +3 -0
  66. package/dist/documents/mnemonic.js.map +1 -0
  67. package/dist/documents/role.d.ts +8 -0
  68. package/dist/documents/role.d.ts.map +1 -0
  69. package/dist/documents/role.js +3 -0
  70. package/dist/documents/role.js.map +1 -0
  71. package/dist/documents/used-direct-login-token.d.ts +5 -0
  72. package/dist/documents/used-direct-login-token.d.ts.map +1 -0
  73. package/dist/documents/used-direct-login-token.js +3 -0
  74. package/dist/documents/used-direct-login-token.js.map +1 -0
  75. package/dist/documents/user-role.d.ts +8 -0
  76. package/dist/documents/user-role.d.ts.map +1 -0
  77. package/dist/documents/user-role.js +3 -0
  78. package/dist/documents/user-role.js.map +1 -0
  79. package/dist/documents/user.d.ts +9 -0
  80. package/dist/documents/user.d.ts.map +1 -0
  81. package/dist/documents/user.js +3 -0
  82. package/dist/documents/user.js.map +1 -0
  83. package/dist/enumerations/base-model-name.d.ts +38 -0
  84. package/dist/enumerations/base-model-name.d.ts.map +1 -0
  85. package/dist/enumerations/base-model-name.js +34 -0
  86. package/dist/enumerations/base-model-name.js.map +1 -0
  87. package/dist/enumerations/index.d.ts +4 -0
  88. package/dist/enumerations/index.d.ts.map +1 -0
  89. package/dist/enumerations/index.js +20 -0
  90. package/dist/enumerations/index.js.map +1 -0
  91. package/dist/enumerations/length-encoding-type.d.ts +7 -0
  92. package/dist/enumerations/length-encoding-type.d.ts.map +1 -0
  93. package/dist/enumerations/length-encoding-type.js +11 -0
  94. package/dist/enumerations/length-encoding-type.js.map +1 -0
  95. package/dist/enumerations/schema-collection.d.ts +34 -0
  96. package/dist/enumerations/schema-collection.d.ts.map +1 -0
  97. package/dist/enumerations/schema-collection.js +38 -0
  98. package/dist/enumerations/schema-collection.js.map +1 -0
  99. package/dist/enumerations/symmetric-error-type.d.ts +5 -0
  100. package/dist/enumerations/symmetric-error-type.d.ts.map +1 -0
  101. package/dist/enumerations/symmetric-error-type.js +9 -0
  102. package/dist/enumerations/symmetric-error-type.js.map +1 -0
  103. package/dist/environment.d.ts +189 -0
  104. package/dist/environment.d.ts.map +1 -0
  105. package/dist/environment.js +618 -0
  106. package/dist/environment.js.map +1 -0
  107. package/dist/error-factory.d.ts +6 -0
  108. package/dist/error-factory.d.ts.map +1 -0
  109. package/dist/error-factory.js +15 -0
  110. package/dist/error-factory.js.map +1 -0
  111. package/dist/errors/express-validation.d.ts +9 -0
  112. package/dist/errors/express-validation.d.ts.map +1 -0
  113. package/dist/errors/express-validation.js +17 -0
  114. package/dist/errors/express-validation.js.map +1 -0
  115. package/dist/errors/index.d.ts +13 -0
  116. package/dist/errors/index.d.ts.map +1 -0
  117. package/dist/errors/index.js +29 -0
  118. package/dist/errors/index.js.map +1 -0
  119. package/dist/errors/invalid-backup-code-version.d.ts +6 -0
  120. package/dist/errors/invalid-backup-code-version.d.ts.map +1 -0
  121. package/dist/errors/invalid-backup-code-version.js +14 -0
  122. package/dist/errors/invalid-backup-code-version.js.map +1 -0
  123. package/dist/errors/invalid-jwt-token.d.ts +5 -0
  124. package/dist/errors/invalid-jwt-token.d.ts.map +1 -0
  125. package/dist/errors/invalid-jwt-token.js +11 -0
  126. package/dist/errors/invalid-jwt-token.js.map +1 -0
  127. package/dist/errors/invalid-model.d.ts +6 -0
  128. package/dist/errors/invalid-model.d.ts.map +1 -0
  129. package/dist/errors/invalid-model.js +13 -0
  130. package/dist/errors/invalid-model.js.map +1 -0
  131. package/dist/errors/invalid-new-password.d.ts +5 -0
  132. package/dist/errors/invalid-new-password.d.ts.map +1 -0
  133. package/dist/errors/invalid-new-password.js +14 -0
  134. package/dist/errors/invalid-new-password.js.map +1 -0
  135. package/dist/errors/invalid-password.d.ts +5 -0
  136. package/dist/errors/invalid-password.d.ts.map +1 -0
  137. package/dist/errors/invalid-password.js +14 -0
  138. package/dist/errors/invalid-password.js.map +1 -0
  139. package/dist/errors/missing-validated-data.d.ts +7 -0
  140. package/dist/errors/missing-validated-data.d.ts.map +1 -0
  141. package/dist/errors/missing-validated-data.js +34 -0
  142. package/dist/errors/missing-validated-data.js.map +1 -0
  143. package/dist/errors/mnemonic-or-password-required.d.ts +5 -0
  144. package/dist/errors/mnemonic-or-password-required.d.ts.map +1 -0
  145. package/dist/errors/mnemonic-or-password-required.js +13 -0
  146. package/dist/errors/mnemonic-or-password-required.js.map +1 -0
  147. package/dist/errors/model-not-registered.d.ts +5 -0
  148. package/dist/errors/model-not-registered.d.ts.map +1 -0
  149. package/dist/errors/model-not-registered.js +12 -0
  150. package/dist/errors/model-not-registered.js.map +1 -0
  151. package/dist/errors/mongoose-validation.d.ts +11 -0
  152. package/dist/errors/mongoose-validation.d.ts.map +1 -0
  153. package/dist/errors/mongoose-validation.js +16 -0
  154. package/dist/errors/mongoose-validation.js.map +1 -0
  155. package/dist/errors/symmetric.d.ts +8 -0
  156. package/dist/errors/symmetric.d.ts.map +1 -0
  157. package/dist/errors/symmetric.js +23 -0
  158. package/dist/errors/symmetric.js.map +1 -0
  159. package/dist/errors/token-expired.d.ts +5 -0
  160. package/dist/errors/token-expired.d.ts.map +1 -0
  161. package/dist/errors/token-expired.js +11 -0
  162. package/dist/errors/token-expired.js.map +1 -0
  163. package/dist/get-language.d.ts +2 -0
  164. package/dist/get-language.d.ts.map +1 -0
  165. package/dist/get-language.js +30 -0
  166. package/dist/get-language.js.map +1 -0
  167. package/dist/get-timezone.d.ts +3 -0
  168. package/dist/get-timezone.d.ts.map +1 -0
  169. package/dist/get-timezone.js +31 -0
  170. package/dist/get-timezone.js.map +1 -0
  171. package/dist/index.d.ts +23 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +39 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/interfaces/api-error-response.d.ts +5 -0
  176. package/dist/interfaces/api-error-response.d.ts.map +1 -0
  177. package/dist/interfaces/api-error-response.js +3 -0
  178. package/dist/interfaces/api-error-response.js.map +1 -0
  179. package/dist/interfaces/api-express-validation-error-response.d.ts +7 -0
  180. package/dist/interfaces/api-express-validation-error-response.d.ts.map +1 -0
  181. package/dist/interfaces/api-express-validation-error-response.js +3 -0
  182. package/dist/interfaces/api-express-validation-error-response.js.map +1 -0
  183. package/dist/interfaces/api-message-response.d.ts +4 -0
  184. package/dist/interfaces/api-message-response.d.ts.map +1 -0
  185. package/dist/interfaces/api-message-response.js +3 -0
  186. package/dist/interfaces/api-message-response.js.map +1 -0
  187. package/dist/interfaces/api-mongo-validation-error-response.d.ts +6 -0
  188. package/dist/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  189. package/dist/interfaces/api-mongo-validation-error-response.js +3 -0
  190. package/dist/interfaces/api-mongo-validation-error-response.js.map +1 -0
  191. package/dist/interfaces/api-responses/backup-codes-response.d.ts +5 -0
  192. package/dist/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
  193. package/dist/interfaces/api-responses/backup-codes-response.js +3 -0
  194. package/dist/interfaces/api-responses/backup-codes-response.js.map +1 -0
  195. package/dist/interfaces/api-responses/challenge-response.d.ts +6 -0
  196. package/dist/interfaces/api-responses/challenge-response.d.ts.map +1 -0
  197. package/dist/interfaces/api-responses/challenge-response.js +3 -0
  198. package/dist/interfaces/api-responses/challenge-response.js.map +1 -0
  199. package/dist/interfaces/api-responses/code-count-response.d.ts +5 -0
  200. package/dist/interfaces/api-responses/code-count-response.d.ts.map +1 -0
  201. package/dist/interfaces/api-responses/code-count-response.js +3 -0
  202. package/dist/interfaces/api-responses/code-count-response.js.map +1 -0
  203. package/dist/interfaces/api-responses/index.d.ts +8 -0
  204. package/dist/interfaces/api-responses/index.d.ts.map +1 -0
  205. package/dist/interfaces/api-responses/index.js +24 -0
  206. package/dist/interfaces/api-responses/index.js.map +1 -0
  207. package/dist/interfaces/api-responses/login-response.d.ts +8 -0
  208. package/dist/interfaces/api-responses/login-response.d.ts.map +1 -0
  209. package/dist/interfaces/api-responses/login-response.js +3 -0
  210. package/dist/interfaces/api-responses/login-response.js.map +1 -0
  211. package/dist/interfaces/api-responses/mnemonic-response.d.ts +5 -0
  212. package/dist/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
  213. package/dist/interfaces/api-responses/mnemonic-response.js +3 -0
  214. package/dist/interfaces/api-responses/mnemonic-response.js.map +1 -0
  215. package/dist/interfaces/api-responses/registration-response.d.ts +6 -0
  216. package/dist/interfaces/api-responses/registration-response.d.ts.map +1 -0
  217. package/dist/interfaces/api-responses/registration-response.js +3 -0
  218. package/dist/interfaces/api-responses/registration-response.js.map +1 -0
  219. package/dist/interfaces/api-responses/request-user-response.d.ts +6 -0
  220. package/dist/interfaces/api-responses/request-user-response.d.ts.map +1 -0
  221. package/dist/interfaces/api-responses/request-user-response.js +3 -0
  222. package/dist/interfaces/api-responses/request-user-response.js.map +1 -0
  223. package/dist/interfaces/application.d.ts +12 -0
  224. package/dist/interfaces/application.d.ts.map +1 -0
  225. package/dist/interfaces/application.js +3 -0
  226. package/dist/interfaces/application.js.map +1 -0
  227. package/dist/interfaces/backend-objects/email-token.d.ts +4 -0
  228. package/dist/interfaces/backend-objects/email-token.d.ts.map +1 -0
  229. package/dist/interfaces/backend-objects/email-token.js +3 -0
  230. package/dist/interfaces/backend-objects/email-token.js.map +1 -0
  231. package/dist/interfaces/backend-objects/index.d.ts +5 -0
  232. package/dist/interfaces/backend-objects/index.d.ts.map +1 -0
  233. package/dist/interfaces/backend-objects/index.js +21 -0
  234. package/dist/interfaces/backend-objects/index.js.map +1 -0
  235. package/dist/interfaces/backend-objects/request-user.d.ts +5 -0
  236. package/dist/interfaces/backend-objects/request-user.d.ts.map +1 -0
  237. package/dist/interfaces/backend-objects/request-user.js +3 -0
  238. package/dist/interfaces/backend-objects/request-user.js.map +1 -0
  239. package/dist/interfaces/backend-objects/role.d.ts +4 -0
  240. package/dist/interfaces/backend-objects/role.d.ts.map +1 -0
  241. package/dist/interfaces/backend-objects/role.js +3 -0
  242. package/dist/interfaces/backend-objects/role.js.map +1 -0
  243. package/dist/interfaces/backend-objects/user.d.ts +4 -0
  244. package/dist/interfaces/backend-objects/user.d.ts.map +1 -0
  245. package/dist/interfaces/backend-objects/user.js +3 -0
  246. package/dist/interfaces/backend-objects/user.js.map +1 -0
  247. package/dist/interfaces/checksum-config.d.ts +5 -0
  248. package/dist/interfaces/checksum-config.d.ts.map +1 -0
  249. package/dist/interfaces/checksum-config.js +3 -0
  250. package/dist/interfaces/checksum-config.js.map +1 -0
  251. package/dist/interfaces/checksum-consts.d.ts +11 -0
  252. package/dist/interfaces/checksum-consts.d.ts.map +1 -0
  253. package/dist/interfaces/checksum-consts.js +3 -0
  254. package/dist/interfaces/checksum-consts.js.map +1 -0
  255. package/dist/interfaces/constants.d.ts +12 -0
  256. package/dist/interfaces/constants.d.ts.map +1 -0
  257. package/dist/interfaces/constants.js +3 -0
  258. package/dist/interfaces/constants.js.map +1 -0
  259. package/dist/interfaces/create-user-basics.d.ts +18 -0
  260. package/dist/interfaces/create-user-basics.d.ts.map +1 -0
  261. package/dist/interfaces/create-user-basics.js +3 -0
  262. package/dist/interfaces/create-user-basics.js.map +1 -0
  263. package/dist/interfaces/csp-config.d.ts +14 -0
  264. package/dist/interfaces/csp-config.d.ts.map +1 -0
  265. package/dist/interfaces/csp-config.js +3 -0
  266. package/dist/interfaces/csp-config.js.map +1 -0
  267. package/dist/interfaces/deep-partial.d.ts +4 -0
  268. package/dist/interfaces/deep-partial.d.ts.map +1 -0
  269. package/dist/interfaces/deep-partial.js +3 -0
  270. package/dist/interfaces/deep-partial.js.map +1 -0
  271. package/dist/interfaces/discriminator-collections.d.ts +7 -0
  272. package/dist/interfaces/discriminator-collections.d.ts.map +1 -0
  273. package/dist/interfaces/discriminator-collections.js +3 -0
  274. package/dist/interfaces/discriminator-collections.js.map +1 -0
  275. package/dist/interfaces/email-service.d.ts +4 -0
  276. package/dist/interfaces/email-service.d.ts.map +1 -0
  277. package/dist/interfaces/email-service.js +3 -0
  278. package/dist/interfaces/email-service.js.map +1 -0
  279. package/dist/interfaces/environment-mongo.d.ts +76 -0
  280. package/dist/interfaces/environment-mongo.d.ts.map +1 -0
  281. package/dist/interfaces/environment-mongo.js +3 -0
  282. package/dist/interfaces/environment-mongo.js.map +1 -0
  283. package/dist/interfaces/environment.d.ts +181 -0
  284. package/dist/interfaces/environment.d.ts.map +1 -0
  285. package/dist/interfaces/environment.js +3 -0
  286. package/dist/interfaces/environment.js.map +1 -0
  287. package/dist/interfaces/failable-result.d.ts +7 -0
  288. package/dist/interfaces/failable-result.d.ts.map +1 -0
  289. package/dist/interfaces/failable-result.js +3 -0
  290. package/dist/interfaces/failable-result.js.map +1 -0
  291. package/dist/interfaces/fec-consts.d.ts +5 -0
  292. package/dist/interfaces/fec-consts.d.ts.map +1 -0
  293. package/dist/interfaces/fec-consts.js +3 -0
  294. package/dist/interfaces/fec-consts.js.map +1 -0
  295. package/dist/interfaces/handleable-error-options.d.ts +7 -0
  296. package/dist/interfaces/handleable-error-options.d.ts.map +1 -0
  297. package/dist/interfaces/handleable-error-options.js +3 -0
  298. package/dist/interfaces/handleable-error-options.js.map +1 -0
  299. package/dist/interfaces/index.d.ts +30 -0
  300. package/dist/interfaces/index.d.ts.map +1 -0
  301. package/dist/interfaces/index.js +46 -0
  302. package/dist/interfaces/index.js.map +1 -0
  303. package/dist/interfaces/jwt-consts.d.ts +11 -0
  304. package/dist/interfaces/jwt-consts.d.ts.map +1 -0
  305. package/dist/interfaces/jwt-consts.js +3 -0
  306. package/dist/interfaces/jwt-consts.js.map +1 -0
  307. package/dist/interfaces/jwt-sign-response.d.ts +11 -0
  308. package/dist/interfaces/jwt-sign-response.d.ts.map +1 -0
  309. package/dist/interfaces/jwt-sign-response.js +3 -0
  310. package/dist/interfaces/jwt-sign-response.js.map +1 -0
  311. package/dist/interfaces/mongo-errors.d.ts +5 -0
  312. package/dist/interfaces/mongo-errors.d.ts.map +1 -0
  313. package/dist/interfaces/mongo-errors.js +3 -0
  314. package/dist/interfaces/mongo-errors.js.map +1 -0
  315. package/dist/interfaces/request-user.d.ts +42 -0
  316. package/dist/interfaces/request-user.d.ts.map +1 -0
  317. package/dist/interfaces/request-user.js +3 -0
  318. package/dist/interfaces/request-user.js.map +1 -0
  319. package/dist/interfaces/required-string-keys.d.ts +22 -0
  320. package/dist/interfaces/required-string-keys.d.ts.map +1 -0
  321. package/dist/interfaces/required-string-keys.js +3 -0
  322. package/dist/interfaces/required-string-keys.js.map +1 -0
  323. package/dist/interfaces/schema.d.ts +29 -0
  324. package/dist/interfaces/schema.d.ts.map +1 -0
  325. package/dist/interfaces/schema.js +3 -0
  326. package/dist/interfaces/schema.js.map +1 -0
  327. package/dist/interfaces/server-init-result.d.ts +35 -0
  328. package/dist/interfaces/server-init-result.d.ts.map +1 -0
  329. package/dist/interfaces/server-init-result.js +3 -0
  330. package/dist/interfaces/server-init-result.js.map +1 -0
  331. package/dist/interfaces/status-code-response.d.ts +7 -0
  332. package/dist/interfaces/status-code-response.d.ts.map +1 -0
  333. package/dist/interfaces/status-code-response.js +3 -0
  334. package/dist/interfaces/status-code-response.js.map +1 -0
  335. package/dist/interfaces/symmetric-encryption-results.d.ts +5 -0
  336. package/dist/interfaces/symmetric-encryption-results.d.ts.map +1 -0
  337. package/dist/interfaces/symmetric-encryption-results.js +3 -0
  338. package/dist/interfaces/symmetric-encryption-results.js.map +1 -0
  339. package/dist/interfaces/token-response.d.ts +5 -0
  340. package/dist/interfaces/token-response.d.ts.map +1 -0
  341. package/dist/interfaces/token-response.js +3 -0
  342. package/dist/interfaces/token-response.js.map +1 -0
  343. package/dist/middlewares/authenticate-crypto.d.ts +9 -0
  344. package/dist/middlewares/authenticate-crypto.d.ts.map +1 -0
  345. package/dist/middlewares/authenticate-crypto.js +146 -0
  346. package/dist/middlewares/authenticate-crypto.js.map +1 -0
  347. package/dist/middlewares/authenticate-token.d.ts +21 -0
  348. package/dist/middlewares/authenticate-token.d.ts.map +1 -0
  349. package/dist/middlewares/authenticate-token.js +102 -0
  350. package/dist/middlewares/authenticate-token.js.map +1 -0
  351. package/dist/middlewares/cleanup-crypto.d.ts +7 -0
  352. package/dist/middlewares/cleanup-crypto.d.ts.map +1 -0
  353. package/dist/middlewares/cleanup-crypto.js +32 -0
  354. package/dist/middlewares/cleanup-crypto.js.map +1 -0
  355. package/dist/middlewares/index.d.ts +5 -0
  356. package/dist/middlewares/index.d.ts.map +1 -0
  357. package/dist/middlewares/index.js +21 -0
  358. package/dist/middlewares/index.js.map +1 -0
  359. package/dist/middlewares/set-global-context-language.d.ts +3 -0
  360. package/dist/middlewares/set-global-context-language.d.ts.map +1 -0
  361. package/dist/middlewares/set-global-context-language.js +14 -0
  362. package/dist/middlewares/set-global-context-language.js.map +1 -0
  363. package/dist/middlewares.d.ts +18 -0
  364. package/dist/middlewares.d.ts.map +1 -0
  365. package/dist/middlewares.js +76 -0
  366. package/dist/middlewares.js.map +1 -0
  367. package/dist/model-registry.d.ts +23 -0
  368. package/dist/model-registry.d.ts.map +1 -0
  369. package/dist/model-registry.js +47 -0
  370. package/dist/model-registry.js.map +1 -0
  371. package/dist/models/email-token.d.ts +11 -0
  372. package/dist/models/email-token.d.ts.map +1 -0
  373. package/dist/models/email-token.js +11 -0
  374. package/dist/models/email-token.js.map +1 -0
  375. package/dist/models/index.d.ts +7 -0
  376. package/dist/models/index.d.ts.map +1 -0
  377. package/dist/models/index.js +23 -0
  378. package/dist/models/index.js.map +1 -0
  379. package/dist/models/mnemonic.d.ts +11 -0
  380. package/dist/models/mnemonic.d.ts.map +1 -0
  381. package/dist/models/mnemonic.js +11 -0
  382. package/dist/models/mnemonic.js.map +1 -0
  383. package/dist/models/role.d.ts +11 -0
  384. package/dist/models/role.d.ts.map +1 -0
  385. package/dist/models/role.js +11 -0
  386. package/dist/models/role.js.map +1 -0
  387. package/dist/models/used-direct-login-token.d.ts +11 -0
  388. package/dist/models/used-direct-login-token.d.ts.map +1 -0
  389. package/dist/models/used-direct-login-token.js +11 -0
  390. package/dist/models/used-direct-login-token.js.map +1 -0
  391. package/dist/models/user-role.d.ts +6 -0
  392. package/dist/models/user-role.d.ts.map +1 -0
  393. package/dist/models/user-role.js +10 -0
  394. package/dist/models/user-role.js.map +1 -0
  395. package/dist/models/user.d.ts +7 -0
  396. package/dist/models/user.d.ts.map +1 -0
  397. package/dist/models/user.js +11 -0
  398. package/dist/models/user.js.map +1 -0
  399. package/dist/registry/email-service-registry.d.ts +9 -0
  400. package/dist/registry/email-service-registry.d.ts.map +1 -0
  401. package/dist/registry/email-service-registry.js +17 -0
  402. package/dist/registry/email-service-registry.js.map +1 -0
  403. package/dist/registry/index.d.ts +2 -0
  404. package/dist/registry/index.d.ts.map +1 -0
  405. package/dist/registry/index.js +6 -0
  406. package/dist/registry/index.js.map +1 -0
  407. package/dist/routers/api.d.ts +23 -0
  408. package/dist/routers/api.d.ts.map +1 -0
  409. package/dist/routers/api.js +44 -0
  410. package/dist/routers/api.js.map +1 -0
  411. package/dist/routers/app.d.ts +24 -0
  412. package/dist/routers/app.d.ts.map +1 -0
  413. package/dist/routers/app.js +182 -0
  414. package/dist/routers/app.js.map +1 -0
  415. package/dist/routers/base.d.ts +8 -0
  416. package/dist/routers/base.d.ts.map +1 -0
  417. package/dist/routers/base.js +12 -0
  418. package/dist/routers/base.js.map +1 -0
  419. package/dist/routers/index.d.ts +3 -0
  420. package/dist/routers/index.d.ts.map +1 -0
  421. package/dist/routers/index.js +19 -0
  422. package/dist/routers/index.js.map +1 -0
  423. package/dist/schemas/email-token.d.ts +38 -0
  424. package/dist/schemas/email-token.d.ts.map +1 -0
  425. package/dist/schemas/email-token.js +56 -0
  426. package/dist/schemas/email-token.js.map +1 -0
  427. package/dist/schemas/mnemonic.d.ts +20 -0
  428. package/dist/schemas/mnemonic.d.ts.map +1 -0
  429. package/dist/schemas/mnemonic.js +30 -0
  430. package/dist/schemas/mnemonic.js.map +1 -0
  431. package/dist/schemas/role.d.ts +32 -0
  432. package/dist/schemas/role.d.ts.map +1 -0
  433. package/dist/schemas/role.js +86 -0
  434. package/dist/schemas/role.js.map +1 -0
  435. package/dist/schemas/schema.d.ts +40 -0
  436. package/dist/schemas/schema.d.ts.map +1 -0
  437. package/dist/schemas/schema.js +64 -0
  438. package/dist/schemas/schema.js.map +1 -0
  439. package/dist/schemas/used-direct-login-token.d.ts +27 -0
  440. package/dist/schemas/used-direct-login-token.d.ts.map +1 -0
  441. package/dist/schemas/used-direct-login-token.js +23 -0
  442. package/dist/schemas/used-direct-login-token.js.map +1 -0
  443. package/dist/schemas/user-role.d.ts +29 -0
  444. package/dist/schemas/user-role.d.ts.map +1 -0
  445. package/dist/schemas/user-role.js +54 -0
  446. package/dist/schemas/user-role.js.map +1 -0
  447. package/dist/schemas/user.d.ts +21 -0
  448. package/dist/schemas/user.d.ts.map +1 -0
  449. package/dist/schemas/user.js +178 -0
  450. package/dist/schemas/user.js.map +1 -0
  451. package/dist/services/backup-code.d.ts +76 -0
  452. package/dist/services/backup-code.d.ts.map +1 -0
  453. package/dist/services/backup-code.js +180 -0
  454. package/dist/services/backup-code.js.map +1 -0
  455. package/dist/services/base.d.ts +10 -0
  456. package/dist/services/base.d.ts.map +1 -0
  457. package/dist/services/base.js +14 -0
  458. package/dist/services/base.js.map +1 -0
  459. package/dist/services/checksum.d.ts +67 -0
  460. package/dist/services/checksum.d.ts.map +1 -0
  461. package/dist/services/checksum.js +175 -0
  462. package/dist/services/checksum.js.map +1 -0
  463. package/dist/services/crc.d.ts +87 -0
  464. package/dist/services/crc.d.ts.map +1 -0
  465. package/dist/services/crc.js +198 -0
  466. package/dist/services/crc.js.map +1 -0
  467. package/dist/services/database-initialization.d.ts +101 -0
  468. package/dist/services/database-initialization.d.ts.map +1 -0
  469. package/dist/services/database-initialization.js +779 -0
  470. package/dist/services/database-initialization.js.map +1 -0
  471. package/dist/services/direct-login-token.d.ts +6 -0
  472. package/dist/services/direct-login-token.d.ts.map +1 -0
  473. package/dist/services/direct-login-token.js +41 -0
  474. package/dist/services/direct-login-token.js.map +1 -0
  475. package/dist/services/fec-usage-example.d.ts +38 -0
  476. package/dist/services/fec-usage-example.d.ts.map +1 -0
  477. package/dist/services/fec-usage-example.js +77 -0
  478. package/dist/services/fec-usage-example.js.map +1 -0
  479. package/dist/services/fec.d.ts +46 -0
  480. package/dist/services/fec.d.ts.map +1 -0
  481. package/dist/services/fec.js +192 -0
  482. package/dist/services/fec.js.map +1 -0
  483. package/dist/services/index.d.ts +19 -0
  484. package/dist/services/index.d.ts.map +1 -0
  485. package/dist/services/index.js +35 -0
  486. package/dist/services/index.js.map +1 -0
  487. package/dist/services/jwt.d.ts +30 -0
  488. package/dist/services/jwt.d.ts.map +1 -0
  489. package/dist/services/jwt.js +90 -0
  490. package/dist/services/jwt.js.map +1 -0
  491. package/dist/services/key-wrapping.d.ts +60 -0
  492. package/dist/services/key-wrapping.d.ts.map +1 -0
  493. package/dist/services/key-wrapping.js +311 -0
  494. package/dist/services/key-wrapping.js.map +1 -0
  495. package/dist/services/mnemonic.d.ts +61 -0
  496. package/dist/services/mnemonic.d.ts.map +1 -0
  497. package/dist/services/mnemonic.js +112 -0
  498. package/dist/services/mnemonic.js.map +1 -0
  499. package/dist/services/request-user.d.ts +20 -0
  500. package/dist/services/request-user.d.ts.map +1 -0
  501. package/dist/services/request-user.js +50 -0
  502. package/dist/services/request-user.js.map +1 -0
  503. package/dist/services/role.d.ts +85 -0
  504. package/dist/services/role.d.ts.map +1 -0
  505. package/dist/services/role.js +254 -0
  506. package/dist/services/role.js.map +1 -0
  507. package/dist/services/symmetric.d.ts +42 -0
  508. package/dist/services/symmetric.d.ts.map +1 -0
  509. package/dist/services/symmetric.js +101 -0
  510. package/dist/services/symmetric.js.map +1 -0
  511. package/dist/services/system-user.d.ts +17 -0
  512. package/dist/services/system-user.d.ts.map +1 -0
  513. package/dist/services/system-user.js +46 -0
  514. package/dist/services/system-user.js.map +1 -0
  515. package/dist/services/user.d.ts +317 -0
  516. package/dist/services/user.d.ts.map +1 -0
  517. package/dist/services/user.js +1364 -0
  518. package/dist/services/user.js.map +1 -0
  519. package/dist/services/xor.d.ts +24 -0
  520. package/dist/services/xor.d.ts.map +1 -0
  521. package/dist/services/xor.js +37 -0
  522. package/dist/services/xor.js.map +1 -0
  523. package/dist/types.d.ts +70 -0
  524. package/dist/types.d.ts.map +1 -0
  525. package/dist/types.js +14 -0
  526. package/dist/types.js.map +1 -0
  527. package/dist/utils.d.ts +202 -0
  528. package/dist/utils.d.ts.map +1 -0
  529. package/dist/utils.js +786 -0
  530. package/dist/utils.js.map +1 -0
  531. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Digital Defiance
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,673 @@
1
+ # @digitaldefiance/node-express-suite
2
+
3
+ An opinionated, secure, extensible Node.js/Express service framework built on Digital Defiance cryptography libraries, providing complete backend infrastructure for secure applications.
4
+
5
+ It is an 'out of the box' solution with a specific recipe (Mongo, Express, React, Node, (MERN) stack) with ejs templating, JWT authentication, role-based access control, custom multi-language support via @digitaldefiance/i18n-lib, and a dynamic model registry system. You might either find it limiting or freeing, depending on your use case. It includes mnemonic authentication, ECIES encryption/decryption, PBKDF2 key derivation, email token workflows, and more.
6
+
7
+ ## Features
8
+
9
+ - **🔐 ECIES Encryption/Decryption**: End-to-end encryption using elliptic curve cryptography
10
+ - **🔑 PBKDF2 Key Derivation**: Secure password hashing with configurable profiles
11
+ - **👥 Role-Based Access Control (RBAC)**: Flexible permission system with user roles
12
+ - **🌍 Multi-Language i18n**: Plugin-based internationalization with 8+ languages
13
+ - **📊 Dynamic Model Registry**: Extensible document model system
14
+ - **🔧 Runtime Configuration**: Override defaults at runtime for advanced use cases
15
+ - **🛡️ JWT Authentication**: Secure token-based authentication
16
+ - **📧 Email Token System**: Verification, password reset, and recovery workflows
17
+ - **💾 MongoDB Integration**: Full database layer with Mongoose schemas
18
+ - **🧪 Comprehensive Testing**: 100+ tests covering all major functionality
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ npm install @digitaldefiance/node-express-suite
24
+ # or
25
+ yarn add @digitaldefiance/node-express-suite
26
+ ```
27
+
28
+ ## Quick Start
29
+
30
+ ### Basic Server Setup
31
+
32
+ ```typescript
33
+ import { Application, DatabaseInitializationService, emailServiceRegistry } from '@digitaldefiance/node-express-suite';
34
+ import { CoreLanguage } from '@digitaldefiance/i18n-lib';
35
+ import { EmailService } from './services/email'; // Your concrete implementation
36
+
37
+ // Create application instance
38
+ const app = new Application({
39
+ port: 3000,
40
+ mongoUri: 'mongodb://localhost:27017/myapp',
41
+ jwtSecret: process.env.JWT_SECRET,
42
+ defaultLanguage: CoreLanguage.EnglishUS
43
+ });
44
+
45
+ // Configure email service (required before using middleware)
46
+ emailServiceRegistry.setService(new EmailService(app));
47
+
48
+ // Initialize database with default users and roles
49
+ const initResult = await DatabaseInitializationService.initUserDb(app);
50
+
51
+ // Start server
52
+ await app.start();
53
+ console.log(`Server running on port ${app.environment.port}`);
54
+ ```
55
+
56
+ ### User Authentication
57
+
58
+ ```typescript
59
+ import { JwtService, UserService } from '@digitaldefiance/node-express-suite';
60
+
61
+ // Create services
62
+ const jwtService = new JwtService(app);
63
+ const userService = new UserService(app);
64
+
65
+ // Sign in user
66
+ const user = await userService.findByUsername('alice');
67
+ const { token, roles } = await jwtService.signToken(user, app.environment.jwtSecret);
68
+
69
+ // Verify token
70
+ const tokenUser = await jwtService.verifyToken(token);
71
+ console.log(`User ${tokenUser.userId} authenticated with roles:`, tokenUser.roles);
72
+ ```
73
+
74
+ ## Core Components
75
+
76
+ ### Dynamic Model Registry
77
+
78
+ The package uses a dynamic model registration system for extensibility:
79
+
80
+ ```typescript
81
+ import { ModelRegistry } from '@digitaldefiance/node-express-suite';
82
+
83
+ // Register a custom model
84
+ ModelRegistry.instance.register({
85
+ modelName: 'Organization',
86
+ schema: organizationSchema,
87
+ model: OrganizationModel,
88
+ collection: 'organizations',
89
+ });
90
+
91
+ // Retrieve model anywhere in your app
92
+ const OrgModel = ModelRegistry.instance.get<IOrganizationDocument>('Organization').model;
93
+
94
+ // Use the model
95
+ const org = await OrgModel.findById(orgId);
96
+ ```
97
+
98
+ ### Built-in Models
99
+
100
+ The framework includes these pre-registered models:
101
+
102
+ - **User**: User accounts with authentication
103
+ - **Role**: Permission roles for RBAC
104
+ - **UserRole**: User-to-role associations
105
+ - **EmailToken**: Email verification and recovery tokens
106
+ - **Mnemonic**: Encrypted mnemonic storage
107
+ - **UsedDirectLoginToken**: One-time login token tracking
108
+
109
+ ### Extending Models and Schemas
110
+
111
+ All model functions support generic type parameters for custom model names and collections:
112
+
113
+ ```typescript
114
+ import { UserModel, EmailTokenModel } from '@digitaldefiance/node-express-suite';
115
+
116
+ // Use with default enums
117
+ const defaultUserModel = UserModel(connection);
118
+
119
+ // Use with custom model names and collections
120
+ const customUserModel = UserModel(
121
+ connection,
122
+ 'CustomUser',
123
+ 'custom_users'
124
+ );
125
+ ```
126
+
127
+ #### Extending Schemas
128
+
129
+ Clone and extend base schemas with additional fields:
130
+
131
+ ```typescript
132
+ import { EmailTokenSchema } from '@digitaldefiance/node-express-suite';
133
+ import { Schema } from 'mongoose';
134
+
135
+ // Clone and extend the schema
136
+ const ExtendedEmailTokenSchema = EmailTokenSchema.clone();
137
+ ExtendedEmailTokenSchema.add({
138
+ customField: { type: String, required: false },
139
+ metadata: { type: Schema.Types.Mixed, required: false },
140
+ });
141
+
142
+ // Use with custom model
143
+ const MyEmailTokenModel = connection.model(
144
+ 'ExtendedEmailToken',
145
+ ExtendedEmailTokenSchema,
146
+ 'extended_email_tokens'
147
+ );
148
+ ```
149
+
150
+ #### Extending Model Functions
151
+
152
+ Create custom model functions that wrap extended schemas:
153
+
154
+ ```typescript
155
+ import { IEmailTokenDocument } from '@digitaldefiance/node-express-suite';
156
+ import { Connection, Model } from 'mongoose';
157
+
158
+ // Extend the document interface
159
+ interface IExtendedEmailTokenDocument extends IEmailTokenDocument {
160
+ customField?: string;
161
+ metadata?: any;
162
+ }
163
+
164
+ // Create extended schema (as shown above)
165
+ const ExtendedEmailTokenSchema = EmailTokenSchema.clone();
166
+ ExtendedEmailTokenSchema.add({
167
+ customField: { type: String },
168
+ metadata: { type: Schema.Types.Mixed },
169
+ });
170
+
171
+ // Create custom model function
172
+ export function ExtendedEmailTokenModel<
173
+ TModelName extends string = 'ExtendedEmailToken',
174
+ TCollection extends string = 'extended_email_tokens'
175
+ >(
176
+ connection: Connection,
177
+ modelName: TModelName = 'ExtendedEmailToken' as TModelName,
178
+ collection: TCollection = 'extended_email_tokens' as TCollection,
179
+ ): Model<IExtendedEmailTokenDocument> {
180
+ return connection.model<IExtendedEmailTokenDocument>(
181
+ modelName,
182
+ ExtendedEmailTokenSchema,
183
+ collection,
184
+ );
185
+ }
186
+
187
+ // Use the extended model
188
+ const model = ExtendedEmailTokenModel(connection);
189
+ const token = await model.create({
190
+ userId,
191
+ type: EmailTokenType.AccountVerification,
192
+ token: 'abc123',
193
+ email: 'user@example.com',
194
+ customField: 'custom value',
195
+ metadata: { source: 'api' },
196
+ });
197
+ ```
198
+
199
+ #### Custom Enumerations
200
+
201
+ Extend the base enumerations for your application:
202
+
203
+ ```typescript
204
+ import { BaseModelName, SchemaCollection } from '@digitaldefiance/node-express-suite';
205
+
206
+ // Extend base enums
207
+ enum MyModelName {
208
+ User = BaseModelName.User,
209
+ Role = BaseModelName.Role,
210
+ Organization = 'Organization',
211
+ Project = 'Project',
212
+ }
213
+
214
+ enum MyCollection {
215
+ User = SchemaCollection.User,
216
+ Role = SchemaCollection.Role,
217
+ Organization = 'organizations',
218
+ Project = 'projects',
219
+ }
220
+
221
+ // Use with model functions
222
+ const orgModel = UserModel<MyModelName, MyCollection>(
223
+ connection,
224
+ MyModelName.Organization,
225
+ MyCollection.Organization
226
+ );
227
+ ```
228
+
229
+ #### Complete Extension Example
230
+
231
+ Combining schemas, documents, and model functions:
232
+
233
+ ```typescript
234
+ import { IUserDocument, UserSchema } from '@digitaldefiance/node-express-suite';
235
+ import { Connection, Model, Schema } from 'mongoose';
236
+
237
+ // 1. Extend document interface
238
+ interface IOrganizationUserDocument extends IUserDocument {
239
+ organizationId: string;
240
+ department?: string;
241
+ }
242
+
243
+ // 2. Extend schema
244
+ const OrganizationUserSchema = UserSchema.clone();
245
+ OrganizationUserSchema.add({
246
+ organizationId: { type: String, required: true },
247
+ department: { type: String },
248
+ });
249
+
250
+ // 3. Create model function
251
+ export function OrganizationUserModel(
252
+ connection: Connection,
253
+ ): Model<IOrganizationUserDocument> {
254
+ return connection.model<IOrganizationUserDocument>(
255
+ 'OrganizationUser',
256
+ OrganizationUserSchema,
257
+ 'organization_users',
258
+ );
259
+ }
260
+
261
+ // 4. Use in application
262
+ const model = OrganizationUserModel(connection);
263
+ const user = await model.create({
264
+ username: 'alice',
265
+ email: 'alice@example.com',
266
+ organizationId: 'org-123',
267
+ department: 'Engineering',
268
+ });
269
+ ```
270
+
271
+ ### Services
272
+
273
+ #### ECIESService
274
+
275
+ Encryption and key management:
276
+
277
+ ```typescript
278
+ import { ECIESService } from '@digitaldefiance/node-express-suite';
279
+
280
+ const eciesService = new ECIESService();
281
+
282
+ // Generate mnemonic
283
+ const mnemonic = eciesService.generateNewMnemonic();
284
+
285
+ // Encrypt data
286
+ const encrypted = await eciesService.encryptSimpleOrSingle(
287
+ false, // single mode
288
+ recipientPublicKey,
289
+ Buffer.from('secret message')
290
+ );
291
+
292
+ // Decrypt data
293
+ const decrypted = await eciesService.decryptSimpleOrSingleWithHeader(
294
+ false,
295
+ privateKey,
296
+ encrypted
297
+ );
298
+ ```
299
+
300
+ #### KeyWrappingService
301
+
302
+ Secure key storage and retrieval:
303
+
304
+ ```typescript
305
+ import { KeyWrappingService } from '@digitaldefiance/node-express-suite';
306
+
307
+ const keyWrapping = new KeyWrappingService(app);
308
+
309
+ // Wrap a key with password
310
+ const wrapped = await keyWrapping.wrapKey(
311
+ privateKey,
312
+ password,
313
+ salt
314
+ );
315
+
316
+ // Unwrap key
317
+ const unwrapped = await keyWrapping.unwrapKey(
318
+ wrapped,
319
+ password,
320
+ salt
321
+ );
322
+ ```
323
+
324
+ #### RoleService
325
+
326
+ Role and permission management:
327
+
328
+ ```typescript
329
+ import { RoleService } from '@digitaldefiance/node-express-suite';
330
+
331
+ const roleService = new RoleService(app);
332
+
333
+ // Get user roles
334
+ const roles = await roleService.getUserRoles(userId);
335
+
336
+ // Check permissions
337
+ const hasPermission = await roleService.userHasRole(userId, 'admin');
338
+
339
+ // Create role
340
+ const adminRole = await roleService.createRole({
341
+ name: 'admin',
342
+ description: 'Administrator role',
343
+ permissions: ['read', 'write', 'delete']
344
+ });
345
+ ```
346
+
347
+ #### BackupCodeService
348
+
349
+ Backup code generation and validation:
350
+
351
+ ```typescript
352
+ import { BackupCodeService } from '@digitaldefiance/node-express-suite';
353
+
354
+ const backupCodeService = new BackupCodeService(app);
355
+
356
+ // Generate backup codes
357
+ const codes = await backupCodeService.generateBackupCodes(userId);
358
+
359
+ // Validate code
360
+ const isValid = await backupCodeService.validateBackupCode(userId, userCode);
361
+
362
+ // Mark code as used
363
+ await backupCodeService.useBackupCode(userId, userCode);
364
+ ```
365
+
366
+ ### Database Initialization
367
+
368
+ Initialize database with default users and roles:
369
+
370
+ ```typescript
371
+ import { DatabaseInitializationService } from '@digitaldefiance/node-express-suite';
372
+
373
+ // Initialize with default admin, member, and system users
374
+ const result = await DatabaseInitializationService.initUserDb(app);
375
+
376
+ if (result.success) {
377
+ console.log('Admin user:', result.data.adminUsername);
378
+ console.log('Admin password:', result.data.adminPassword);
379
+ console.log('Admin mnemonic:', result.data.adminMnemonic);
380
+ console.log('Backup codes:', result.data.adminBackupCodes);
381
+ }
382
+ ```
383
+
384
+ ### Middleware
385
+
386
+ #### Email Service Configuration
387
+
388
+ Before using middleware that requires email functionality, configure the email service:
389
+
390
+ ```typescript
391
+ import { emailServiceRegistry, IEmailService } from '@digitaldefiance/node-express-suite';
392
+
393
+ // Implement the IEmailService interface
394
+ class MyEmailService implements IEmailService {
395
+ async sendEmail(to: string, subject: string, text: string, html: string): Promise<void> {
396
+ // Your email implementation (AWS SES, SendGrid, etc.)
397
+ }
398
+ }
399
+
400
+ // Register at application startup
401
+ emailServiceRegistry.setService(new MyEmailService());
402
+ ```
403
+
404
+ #### Authentication Middleware
405
+
406
+ ```typescript
407
+ import { authMiddleware } from '@digitaldefiance/node-express-suite';
408
+
409
+ // Protect routes with JWT authentication
410
+ app.get('/api/protected', authMiddleware, (req, res) => {
411
+ // req.user contains authenticated user info
412
+ res.json({ user: req.user });
413
+ });
414
+ ```
415
+
416
+ #### Role-Based Authorization
417
+
418
+ ```typescript
419
+ import { requireRole } from '@digitaldefiance/node-express-suite';
420
+
421
+ // Require specific role
422
+ app.delete('/api/users/:id',
423
+ authMiddleware,
424
+ requireRole('admin'),
425
+ async (req, res) => {
426
+ // Only admins can access this route
427
+ await userService.deleteUser(req.params.id);
428
+ res.json({ success: true });
429
+ }
430
+ );
431
+ ```
432
+
433
+ ## Runtime Configuration Registry
434
+
435
+ Override defaults at runtime for advanced use cases:
436
+
437
+ ```typescript
438
+ import {
439
+ getExpressRuntimeConfiguration,
440
+ registerExpressRuntimeConfiguration,
441
+ } from '@digitaldefiance/node-express-suite';
442
+
443
+ // Get current configuration
444
+ const config = getExpressRuntimeConfiguration();
445
+ console.log('Bcrypt rounds:', config.BcryptRounds);
446
+
447
+ // Register custom configuration
448
+ const customKey = Symbol('custom-express-config');
449
+ registerExpressRuntimeConfiguration(customKey, {
450
+ BcryptRounds: 12,
451
+ JWT: {
452
+ ALGORITHM: 'HS512',
453
+ EXPIRATION_SEC: 7200
454
+ }
455
+ });
456
+
457
+ // Use custom configuration
458
+ const customConfig = getExpressRuntimeConfiguration(customKey);
459
+ ```
460
+
461
+ ### Available Configuration Options
462
+
463
+ ```typescript
464
+ interface IExpressRuntimeConfiguration {
465
+ BcryptRounds: number;
466
+ JWT: {
467
+ ALGORITHM: string;
468
+ EXPIRATION_SEC: number;
469
+ };
470
+ BACKUP_CODES: {
471
+ Count: number;
472
+ Length: number;
473
+ };
474
+ // ... more options
475
+ }
476
+ ```
477
+
478
+ ## Internationalization
479
+
480
+ Built-in support for multiple languages using the plugin-based i18n architecture:
481
+
482
+ ```typescript
483
+ import { getGlobalI18nEngine, translateExpressSuite } from '@digitaldefiance/node-express-suite';
484
+ import { CoreLanguage } from '@digitaldefiance/i18n-lib';
485
+
486
+ // Get the global i18n engine
487
+ const i18n = getGlobalI18nEngine();
488
+
489
+ // Translate strings
490
+ const message = translateExpressSuite(
491
+ ExpressSuiteStringKey.Common_Ready,
492
+ {},
493
+ CoreLanguage.French
494
+ );
495
+ // "Prêt"
496
+
497
+ // Change language globally
498
+ i18n.setLanguage(CoreLanguage.Spanish);
499
+ ```
500
+
501
+ ### Supported Languages
502
+
503
+ - English (US)
504
+ - Spanish
505
+ - French
506
+ - Mandarin Chinese
507
+ - Japanese
508
+ - German
509
+ - Ukrainian
510
+
511
+ ## Error Handling
512
+
513
+ Comprehensive error types with localization:
514
+
515
+ ```typescript
516
+ import {
517
+ TranslatableError,
518
+ InvalidJwtTokenError,
519
+ TokenExpiredError,
520
+ UserNotFoundError
521
+ } from '@digitaldefiance/node-express-suite';
522
+
523
+ try {
524
+ const user = await userService.findByEmail(email);
525
+ } catch (error) {
526
+ if (error instanceof UserNotFoundError) {
527
+ // Handle user not found
528
+ res.status(404).json({
529
+ error: error.message // Automatically localized
530
+ });
531
+ } else if (error instanceof TranslatableError) {
532
+ // Handle other translatable errors
533
+ res.status(400).json({ error: error.message });
534
+ }
535
+ }
536
+ ```
537
+
538
+ ## Testing
539
+
540
+ Comprehensive test suite with 100+ tests:
541
+
542
+ ```bash
543
+ # Run all tests
544
+ npm test
545
+
546
+ # Run specific test suites
547
+ npm test -- database-initialization.spec.ts
548
+ npm test -- jwt.spec.ts
549
+ npm test -- role.spec.ts
550
+
551
+ # Run with coverage
552
+ npm test -- --coverage
553
+ ```
554
+
555
+ ## Best Practices
556
+
557
+ ### Security
558
+
559
+ 1. **Always use environment variables** for sensitive configuration:
560
+
561
+ ```typescript
562
+ const app = new Application({
563
+ jwtSecret: process.env.JWT_SECRET,
564
+ mongoUri: process.env.MONGO_URI,
565
+ });
566
+ ```
567
+
568
+ 2. **Validate all user input** before processing:
569
+
570
+ ```typescript
571
+ import { EmailString } from '@digitaldefiance/ecies-lib';
572
+
573
+ try {
574
+ const email = new EmailString(userInput);
575
+ // Email is validated
576
+ } catch (error) {
577
+ // Invalid email format
578
+ }
579
+ ```
580
+
581
+ 3. **Use secure password hashing** with appropriate bcrypt rounds:
582
+
583
+ ```typescript
584
+ const config = getExpressRuntimeConfiguration();
585
+ const hashedPassword = await bcrypt.hash(password, config.BcryptRounds);
586
+ ```
587
+
588
+ ### Performance
589
+
590
+ 1. **Use async operations** to avoid blocking:
591
+
592
+ ```typescript
593
+ const [user, roles] = await Promise.all([
594
+ userService.findById(userId),
595
+ roleService.getUserRoles(userId)
596
+ ]);
597
+ ```
598
+
599
+ 2. **Implement caching** for frequently accessed data:
600
+
601
+ ```typescript
602
+ const cachedRoles = await cache.get(`user:${userId}:roles`);
603
+ if (!cachedRoles) {
604
+ const roles = await roleService.getUserRoles(userId);
605
+ await cache.set(`user:${userId}:roles`, roles, 3600);
606
+ }
607
+ ```
608
+
609
+ 3. **Use database indexes** for common queries:
610
+
611
+ ```typescript
612
+ userSchema.index({ email: 1 }, { unique: true });
613
+ userSchema.index({ username: 1 }, { unique: true });
614
+ ```
615
+
616
+ ## API Reference
617
+
618
+ ### Application
619
+
620
+ - `new Application(config)` - Create application instance
621
+ - `start()` - Start the Express server
622
+ - `stop()` - Stop the server gracefully
623
+ - `environment` - Access configuration
624
+
625
+ ### Services
626
+
627
+ - `ECIESService` - Encryption and key management
628
+ - `KeyWrappingService` - Secure key storage
629
+ - `JwtService` - JWT token operations
630
+ - `RoleService` - Role and permission management
631
+ - `UserService` - User account operations
632
+ - `BackupCodeService` - Backup code management
633
+ - `MnemonicService` - Mnemonic storage and retrieval
634
+ - `SystemUserService` - System user operations
635
+
636
+ ### Utilities
637
+
638
+ - `ModelRegistry` - Dynamic model registration
639
+ - `debugLog()` - Conditional logging utility
640
+ - `withTransaction()` - MongoDB transaction wrapper
641
+
642
+ ## License
643
+
644
+ MIT © Digital Defiance
645
+
646
+ ## Related Packages
647
+
648
+ - `@digitaldefiance/ecies-lib` - Core ECIES encryption library
649
+ - `@digitaldefiance/node-ecies-lib` - Node.js ECIES implementation
650
+ - `@digitaldefiance/i18n-lib` - Internationalization framework
651
+ - `@digitaldefiance/suite-core-lib` - Core user management primitives
652
+
653
+ ## Contributing
654
+
655
+ Contributions are welcome! Please read the contributing guidelines in the main repository.
656
+
657
+ ## Support
658
+
659
+ For issues and questions:
660
+
661
+ - GitHub Issues: <https://github.com/Digital-Defiance/node-express-suite/issues>
662
+ - Email: <support@digitaldefiance.org>
663
+
664
+ ## ChangeLog
665
+
666
+ ### Version 1.0.0 (Current)
667
+
668
+ - Initial release with complete Express.js framework
669
+ - Dynamic model registry system
670
+ - JWT authentication and RBAC
671
+ - Multi-language i18n support
672
+ - Comprehensive service layer
673
+ - Database initialization utilities