taon 21.0.42 → 21.0.45

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 (405) hide show
  1. package/bin/start.js +8 -211
  2. package/bin/taon +1 -2
  3. package/bin/taon-debug +1 -1
  4. package/bin/taon-debug-brk +1 -2
  5. package/browser/package.json +1 -1
  6. package/browser/types/taon-browser.d.ts +3 -3
  7. package/browser-prod/package.json +1 -1
  8. package/browser-prod/types/taon-browser.d.ts +3 -3
  9. package/lib/build-info._auto-generated_.d.ts +1 -1
  10. package/lib/build-info._auto-generated_.js +1 -1
  11. package/lib/package.json +1 -1
  12. package/lib/ui/index.js +2 -2
  13. package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
  14. package/lib-prod/base-classes/base-abstract-entity.ts +34 -0
  15. package/lib-prod/base-classes/base-angular-service.ts +107 -0
  16. package/lib-prod/base-classes/base-class.ts +46 -0
  17. package/lib-prod/base-classes/base-context.ts +21 -0
  18. package/lib-prod/base-classes/base-controller.ts +240 -0
  19. package/lib-prod/base-classes/base-crud-controller.ts +298 -0
  20. package/lib-prod/base-classes/base-custom-repository.ts +10 -0
  21. package/lib-prod/base-classes/{base-electron-service.js → base-electron-service.ts} +12 -2
  22. package/lib-prod/base-classes/base-entity.ts +28 -0
  23. package/lib-prod/base-classes/base-file-upload.middleware.ts +92 -0
  24. package/lib-prod/base-classes/base-injector.ts +278 -0
  25. package/lib-prod/base-classes/base-middleware.ts +71 -0
  26. package/lib-prod/base-classes/base-migration.ts +26 -0
  27. package/lib-prod/base-classes/{base-provider.d.ts → base-provider.ts} +2 -2
  28. package/lib-prod/base-classes/base-repository.ts +942 -0
  29. package/lib-prod/base-classes/base-subscriber-for-entity.ts +196 -0
  30. package/lib-prod/base-classes/{base.js → base.ts} +15 -4
  31. package/lib-prod/{build-info._auto-generated_.d.ts → build-info._auto-generated_.ts} +9 -6
  32. package/lib-prod/config/controller-config.ts +58 -0
  33. package/lib-prod/config/controller-options.ts +19 -0
  34. package/lib-prod/config/method-config.ts +55 -0
  35. package/lib-prod/config/param-config.ts +16 -0
  36. package/lib-prod/constants.ts +63 -0
  37. package/lib-prod/context-db-migrations.ts +488 -0
  38. package/lib-prod/create-context.ts +345 -0
  39. package/lib-prod/decorators/classes/controller-decorator.ts +25 -0
  40. package/lib-prod/decorators/classes/entity-decorator.ts +57 -0
  41. package/lib-prod/decorators/classes/middleware-decorator.ts +29 -0
  42. package/lib-prod/decorators/classes/migration-decorator.ts +27 -0
  43. package/lib-prod/decorators/classes/provider-decorator.ts +28 -0
  44. package/lib-prod/decorators/classes/repository-decorator.ts +26 -0
  45. package/lib-prod/decorators/classes/subscriber-decorator.ts +28 -0
  46. package/lib-prod/decorators/decorator-abstract-opt.ts +4 -0
  47. package/lib-prod/decorators/http/http-decorators.ts +26 -0
  48. package/lib-prod/decorators/http/http-methods-decorators.ts +275 -0
  49. package/lib-prod/decorators/http/http-params-decorators.ts +105 -0
  50. package/lib-prod/dependency-injection/di-container.ts +39 -0
  51. package/lib-prod/endpoint-context-storage.ts +47 -0
  52. package/lib-prod/endpoint-context.ts +3100 -0
  53. package/lib-prod/entity-process.ts +283 -0
  54. package/lib-prod/env/env.angular-node-app.ts +66 -0
  55. package/lib-prod/env/env.docs-webapp.ts +66 -0
  56. package/lib-prod/env/env.electron-app.ts +66 -0
  57. package/lib-prod/env/env.mobile-app.ts +66 -0
  58. package/lib-prod/env/env.npm-lib-and-cli-tool.ts +66 -0
  59. package/lib-prod/env/env.vscode-plugin.ts +66 -0
  60. package/lib-prod/express-types.ts +4 -0
  61. package/lib-prod/formly/formly.models.ts +7 -0
  62. package/lib-prod/formly/fromly.ts +261 -0
  63. package/lib-prod/formly/type-from-entity.ts +80 -0
  64. package/lib-prod/get-response-value.ts +30 -0
  65. package/lib-prod/global-state/taon-global-state/{index.d.ts → index.ts} +2 -1
  66. package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.ts +21 -0
  67. package/lib-prod/global-state/taon-global-state/taon-global-state.constants.ts +9 -0
  68. package/lib-prod/global-state/taon-global-state/taon-global-state.controller.ts +44 -0
  69. package/lib-prod/global-state/taon-global-state/taon-global-state.entity.ts +40 -0
  70. package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.ts +12 -0
  71. package/lib-prod/global-state/taon-global-state/taon-global-state.models.ts +48 -0
  72. package/lib-prod/global-state/taon-global-state/taon-global-state.provider.ts +16 -0
  73. package/lib-prod/global-state/taon-global-state/taon-global-state.repository.ts +47 -0
  74. package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.ts +18 -0
  75. package/lib-prod/global-state/taon-global-state/taon-global-state.utils.ts +21 -0
  76. package/lib-prod/global-state/taon-transaction-registry/{index.d.ts → index.ts} +2 -1
  77. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.ts +23 -0
  78. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.ts +7 -0
  79. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.ts +38 -0
  80. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.ts +54 -0
  81. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.ts +12 -0
  82. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.ts +6 -0
  83. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.ts +16 -0
  84. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.ts +29 -0
  85. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.ts +20 -0
  86. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.ts +9 -0
  87. package/lib-prod/helpers/class-helpers.ts +315 -0
  88. package/lib-prod/helpers/clone-obj.ts +24 -0
  89. package/lib-prod/helpers/taon-helpers.ts +181 -0
  90. package/lib-prod/{index._auto-generated_.js → index._auto-generated_.ts} +0 -1
  91. package/lib-prod/index.ts +323 -0
  92. package/lib-prod/{inject.js → inject.ts} +57 -40
  93. package/lib-prod/lib-info.md +8 -0
  94. package/lib-prod/migrations/index.ts +2 -0
  95. package/lib-prod/migrations/migrations-info.md +6 -0
  96. package/lib-prod/migrations/{migrations_index._auto-generated_.js → migrations_index._auto-generated_.ts} +2 -1
  97. package/lib-prod/models.ts +427 -0
  98. package/lib-prod/orm/columns.ts +121 -0
  99. package/lib-prod/orm/index.ts +62 -0
  100. package/lib-prod/package.json +1 -1
  101. package/lib-prod/realtime/realtime-client.ts +288 -0
  102. package/lib-prod/realtime/realtime-core.ts +134 -0
  103. package/lib-prod/realtime/realtime-server.ts +398 -0
  104. package/lib-prod/realtime/realtime-strategy/{index.d.ts → index.ts} +1 -1
  105. package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.ts +344 -0
  106. package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.ts +349 -0
  107. package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.ts +30 -0
  108. package/lib-prod/realtime/realtime-strategy/realtime-strategy.ts +21 -0
  109. package/lib-prod/realtime/realtime-subs-manager.ts +127 -0
  110. package/lib-prod/realtime/{realtime.models.d.ts → realtime.models.ts} +13 -5
  111. package/lib-prod/symbols.ts +136 -0
  112. package/lib-prod/ui/index.ts +1 -0
  113. package/lib-prod/ui/taon-admin-mode-configuration/index.ts +1 -0
  114. package/lib-prod/validators.ts +103 -0
  115. package/package.json +2 -1
  116. package/websql/package.json +1 -1
  117. package/websql/types/taon-websql.d.ts +3 -3
  118. package/websql-prod/package.json +1 -1
  119. package/websql-prod/types/taon-websql.d.ts +3 -3
  120. package/lib-prod/base-classes/base-abstract-entity.d.ts +0 -7
  121. package/lib-prod/base-classes/base-abstract-entity.js +0 -42
  122. package/lib-prod/base-classes/base-abstract-entity.js.map +0 -1
  123. package/lib-prod/base-classes/base-angular-service.d.ts +0 -27
  124. package/lib-prod/base-classes/base-angular-service.js +0 -89
  125. package/lib-prod/base-classes/base-angular-service.js.map +0 -1
  126. package/lib-prod/base-classes/base-class.d.ts +0 -15
  127. package/lib-prod/base-classes/base-class.js +0 -40
  128. package/lib-prod/base-classes/base-class.js.map +0 -1
  129. package/lib-prod/base-classes/base-context.d.ts +0 -20
  130. package/lib-prod/base-classes/base-context.js +0 -23
  131. package/lib-prod/base-classes/base-context.js.map +0 -1
  132. package/lib-prod/base-classes/base-controller.d.ts +0 -84
  133. package/lib-prod/base-classes/base-controller.js +0 -173
  134. package/lib-prod/base-classes/base-controller.js.map +0 -1
  135. package/lib-prod/base-classes/base-crud-controller.d.ts +0 -28
  136. package/lib-prod/base-classes/base-crud-controller.js +0 -318
  137. package/lib-prod/base-classes/base-crud-controller.js.map +0 -1
  138. package/lib-prod/base-classes/base-custom-repository.d.ts +0 -3
  139. package/lib-prod/base-classes/base-custom-repository.js +0 -19
  140. package/lib-prod/base-classes/base-custom-repository.js.map +0 -1
  141. package/lib-prod/base-classes/base-electron-service.d.ts +0 -0
  142. package/lib-prod/base-classes/base-electron-service.js.map +0 -1
  143. package/lib-prod/base-classes/base-entity.d.ts +0 -16
  144. package/lib-prod/base-classes/base-entity.js +0 -32
  145. package/lib-prod/base-classes/base-entity.js.map +0 -1
  146. package/lib-prod/base-classes/base-file-upload.middleware.d.ts +0 -14
  147. package/lib-prod/base-classes/base-file-upload.middleware.js +0 -85
  148. package/lib-prod/base-classes/base-file-upload.middleware.js.map +0 -1
  149. package/lib-prod/base-classes/base-injector.d.ts +0 -67
  150. package/lib-prod/base-classes/base-injector.js +0 -198
  151. package/lib-prod/base-classes/base-injector.js.map +0 -1
  152. package/lib-prod/base-classes/base-middleware.d.ts +0 -38
  153. package/lib-prod/base-classes/base-middleware.js +0 -14
  154. package/lib-prod/base-classes/base-middleware.js.map +0 -1
  155. package/lib-prod/base-classes/base-migration.d.ts +0 -11
  156. package/lib-prod/base-classes/base-migration.js +0 -25
  157. package/lib-prod/base-classes/base-migration.js.map +0 -1
  158. package/lib-prod/base-classes/base-provider.js +0 -13
  159. package/lib-prod/base-classes/base-provider.js.map +0 -1
  160. package/lib-prod/base-classes/base-repository.d.ts +0 -272
  161. package/lib-prod/base-classes/base-repository.js +0 -634
  162. package/lib-prod/base-classes/base-repository.js.map +0 -1
  163. package/lib-prod/base-classes/base-subscriber-for-entity.d.ts +0 -81
  164. package/lib-prod/base-classes/base-subscriber-for-entity.js +0 -155
  165. package/lib-prod/base-classes/base-subscriber-for-entity.js.map +0 -1
  166. package/lib-prod/base-classes/base.d.ts +0 -1
  167. package/lib-prod/base-classes/base.js.map +0 -1
  168. package/lib-prod/build-info._auto-generated_.js +0 -30
  169. package/lib-prod/build-info._auto-generated_.js.map +0 -1
  170. package/lib-prod/config/controller-config.d.ts +0 -21
  171. package/lib-prod/config/controller-config.js +0 -34
  172. package/lib-prod/config/controller-config.js.map +0 -1
  173. package/lib-prod/config/controller-options.d.ts +0 -16
  174. package/lib-prod/config/controller-options.js +0 -8
  175. package/lib-prod/config/controller-options.js.map +0 -1
  176. package/lib-prod/config/method-config.d.ts +0 -39
  177. package/lib-prod/config/method-config.js +0 -12
  178. package/lib-prod/config/method-config.js.map +0 -1
  179. package/lib-prod/config/param-config.d.ts +0 -8
  180. package/lib-prod/config/param-config.js +0 -8
  181. package/lib-prod/config/param-config.js.map +0 -1
  182. package/lib-prod/constants.d.ts +0 -9
  183. package/lib-prod/constants.js +0 -32
  184. package/lib-prod/constants.js.map +0 -1
  185. package/lib-prod/context-db-migrations.d.ts +0 -17
  186. package/lib-prod/context-db-migrations.js +0 -349
  187. package/lib-prod/context-db-migrations.js.map +0 -1
  188. package/lib-prod/create-context.d.ts +0 -78
  189. package/lib-prod/create-context.js +0 -223
  190. package/lib-prod/create-context.js.map +0 -1
  191. package/lib-prod/decorators/classes/controller-decorator.d.ts +0 -5
  192. package/lib-prod/decorators/classes/controller-decorator.js +0 -21
  193. package/lib-prod/decorators/classes/controller-decorator.js.map +0 -1
  194. package/lib-prod/decorators/classes/entity-decorator.d.ts +0 -19
  195. package/lib-prod/decorators/classes/entity-decorator.js +0 -43
  196. package/lib-prod/decorators/classes/entity-decorator.js.map +0 -1
  197. package/lib-prod/decorators/classes/middleware-decorator.d.ts +0 -8
  198. package/lib-prod/decorators/classes/middleware-decorator.js +0 -22
  199. package/lib-prod/decorators/classes/middleware-decorator.js.map +0 -1
  200. package/lib-prod/decorators/classes/migration-decorator.d.ts +0 -7
  201. package/lib-prod/decorators/classes/migration-decorator.js +0 -21
  202. package/lib-prod/decorators/classes/migration-decorator.js.map +0 -1
  203. package/lib-prod/decorators/classes/provider-decorator.d.ts +0 -7
  204. package/lib-prod/decorators/classes/provider-decorator.js +0 -21
  205. package/lib-prod/decorators/classes/provider-decorator.js.map +0 -1
  206. package/lib-prod/decorators/classes/repository-decorator.d.ts +0 -7
  207. package/lib-prod/decorators/classes/repository-decorator.js +0 -21
  208. package/lib-prod/decorators/classes/repository-decorator.js.map +0 -1
  209. package/lib-prod/decorators/classes/subscriber-decorator.d.ts +0 -8
  210. package/lib-prod/decorators/classes/subscriber-decorator.js +0 -22
  211. package/lib-prod/decorators/classes/subscriber-decorator.js.map +0 -1
  212. package/lib-prod/decorators/decorator-abstract-opt.d.ts +0 -3
  213. package/lib-prod/decorators/decorator-abstract-opt.js +0 -7
  214. package/lib-prod/decorators/decorator-abstract-opt.js.map +0 -1
  215. package/lib-prod/decorators/http/http-decorators.d.ts +0 -3
  216. package/lib-prod/decorators/http/http-decorators.js +0 -24
  217. package/lib-prod/decorators/http/http-decorators.js.map +0 -1
  218. package/lib-prod/decorators/http/http-methods-decorators.d.ts +0 -70
  219. package/lib-prod/decorators/http/http-methods-decorators.js +0 -112
  220. package/lib-prod/decorators/http/http-methods-decorators.js.map +0 -1
  221. package/lib-prod/decorators/http/http-params-decorators.d.ts +0 -8
  222. package/lib-prod/decorators/http/http-params-decorators.js +0 -50
  223. package/lib-prod/decorators/http/http-params-decorators.js.map +0 -1
  224. package/lib-prod/dependency-injection/di-container.d.ts +0 -5
  225. package/lib-prod/dependency-injection/di-container.js +0 -35
  226. package/lib-prod/dependency-injection/di-container.js.map +0 -1
  227. package/lib-prod/endpoint-context-storage.d.ts +0 -11
  228. package/lib-prod/endpoint-context-storage.js +0 -38
  229. package/lib-prod/endpoint-context-storage.js.map +0 -1
  230. package/lib-prod/endpoint-context.d.ts +0 -197
  231. package/lib-prod/endpoint-context.js +0 -2416
  232. package/lib-prod/endpoint-context.js.map +0 -1
  233. package/lib-prod/entity-process.d.ts +0 -39
  234. package/lib-prod/entity-process.js +0 -242
  235. package/lib-prod/entity-process.js.map +0 -1
  236. package/lib-prod/env/env.angular-node-app.d.ts +0 -64
  237. package/lib-prod/env/env.angular-node-app.js +0 -71
  238. package/lib-prod/env/env.angular-node-app.js.map +0 -1
  239. package/lib-prod/env/env.docs-webapp.d.ts +0 -64
  240. package/lib-prod/env/env.docs-webapp.js +0 -71
  241. package/lib-prod/env/env.docs-webapp.js.map +0 -1
  242. package/lib-prod/env/env.electron-app.d.ts +0 -64
  243. package/lib-prod/env/env.electron-app.js +0 -71
  244. package/lib-prod/env/env.electron-app.js.map +0 -1
  245. package/lib-prod/env/env.mobile-app.d.ts +0 -64
  246. package/lib-prod/env/env.mobile-app.js +0 -71
  247. package/lib-prod/env/env.mobile-app.js.map +0 -1
  248. package/lib-prod/env/env.npm-lib-and-cli-tool.d.ts +0 -64
  249. package/lib-prod/env/env.npm-lib-and-cli-tool.js +0 -71
  250. package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +0 -1
  251. package/lib-prod/env/env.vscode-plugin.d.ts +0 -64
  252. package/lib-prod/env/env.vscode-plugin.js +0 -71
  253. package/lib-prod/env/env.vscode-plugin.js.map +0 -1
  254. package/lib-prod/env/index.js +0 -23
  255. package/lib-prod/env/index.js.map +0 -1
  256. package/lib-prod/express-types.d.ts +0 -1
  257. package/lib-prod/express-types.js +0 -3
  258. package/lib-prod/express-types.js.map +0 -1
  259. package/lib-prod/formly/formly.models.d.ts +0 -1
  260. package/lib-prod/formly/formly.models.js +0 -3
  261. package/lib-prod/formly/formly.models.js.map +0 -1
  262. package/lib-prod/formly/fromly.d.ts +0 -16
  263. package/lib-prod/formly/fromly.js +0 -209
  264. package/lib-prod/formly/fromly.js.map +0 -1
  265. package/lib-prod/formly/type-from-entity.d.ts +0 -20
  266. package/lib-prod/formly/type-from-entity.js +0 -60
  267. package/lib-prod/formly/type-from-entity.js.map +0 -1
  268. package/lib-prod/get-response-value.d.ts +0 -6
  269. package/lib-prod/get-response-value.js +0 -27
  270. package/lib-prod/get-response-value.js.map +0 -1
  271. package/lib-prod/global-state/taon-global-state/index.js +0 -23
  272. package/lib-prod/global-state/taon-global-state/index.js.map +0 -1
  273. package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.d.ts +0 -19
  274. package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.js +0 -23
  275. package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.js.map +0 -1
  276. package/lib-prod/global-state/taon-global-state/taon-global-state.constants.d.ts +0 -2
  277. package/lib-prod/global-state/taon-global-state/taon-global-state.constants.js +0 -11
  278. package/lib-prod/global-state/taon-global-state/taon-global-state.constants.js.map +0 -1
  279. package/lib-prod/global-state/taon-global-state/taon-global-state.controller.d.ts +0 -11
  280. package/lib-prod/global-state/taon-global-state/taon-global-state.controller.js +0 -61
  281. package/lib-prod/global-state/taon-global-state/taon-global-state.controller.js.map +0 -1
  282. package/lib-prod/global-state/taon-global-state/taon-global-state.entity.d.ts +0 -7
  283. package/lib-prod/global-state/taon-global-state/taon-global-state.entity.js +0 -64
  284. package/lib-prod/global-state/taon-global-state/taon-global-state.entity.js.map +0 -1
  285. package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.d.ts +0 -3
  286. package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.js +0 -22
  287. package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.js.map +0 -1
  288. package/lib-prod/global-state/taon-global-state/taon-global-state.models.d.ts +0 -28
  289. package/lib-prod/global-state/taon-global-state/taon-global-state.models.js +0 -48
  290. package/lib-prod/global-state/taon-global-state/taon-global-state.models.js.map +0 -1
  291. package/lib-prod/global-state/taon-global-state/taon-global-state.provider.d.ts +0 -3
  292. package/lib-prod/global-state/taon-global-state/taon-global-state.provider.js +0 -22
  293. package/lib-prod/global-state/taon-global-state/taon-global-state.provider.js.map +0 -1
  294. package/lib-prod/global-state/taon-global-state/taon-global-state.repository.d.ts +0 -9
  295. package/lib-prod/global-state/taon-global-state/taon-global-state.repository.js +0 -53
  296. package/lib-prod/global-state/taon-global-state/taon-global-state.repository.js.map +0 -1
  297. package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.d.ts +0 -7
  298. package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.js +0 -29
  299. package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.js.map +0 -1
  300. package/lib-prod/global-state/taon-global-state/taon-global-state.utils.d.ts +0 -2
  301. package/lib-prod/global-state/taon-global-state/taon-global-state.utils.js +0 -16
  302. package/lib-prod/global-state/taon-global-state/taon-global-state.utils.js.map +0 -1
  303. package/lib-prod/global-state/taon-transaction-registry/index.js +0 -28
  304. package/lib-prod/global-state/taon-transaction-registry/index.js.map +0 -1
  305. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.d.ts +0 -19
  306. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.js +0 -25
  307. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.js.map +0 -1
  308. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.d.ts +0 -2
  309. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.js +0 -9
  310. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.js.map +0 -1
  311. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.d.ts +0 -9
  312. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.js +0 -51
  313. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.js.map +0 -1
  314. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.d.ts +0 -12
  315. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.js +0 -77
  316. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.js.map +0 -1
  317. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.d.ts +0 -3
  318. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.js +0 -22
  319. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.js.map +0 -1
  320. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.d.ts +0 -6
  321. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.js +0 -11
  322. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.js.map +0 -1
  323. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.d.ts +0 -3
  324. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.js +0 -22
  325. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.js.map +0 -1
  326. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.d.ts +0 -9
  327. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.js +0 -38
  328. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.js.map +0 -1
  329. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.d.ts +0 -7
  330. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.js +0 -29
  331. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.js.map +0 -1
  332. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.d.ts +0 -2
  333. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.js +0 -9
  334. package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.js.map +0 -1
  335. package/lib-prod/helpers/class-helpers.d.ts +0 -22
  336. package/lib-prod/helpers/class-helpers.js +0 -246
  337. package/lib-prod/helpers/class-helpers.js.map +0 -1
  338. package/lib-prod/helpers/clone-obj.d.ts +0 -1
  339. package/lib-prod/helpers/clone-obj.js +0 -22
  340. package/lib-prod/helpers/clone-obj.js.map +0 -1
  341. package/lib-prod/helpers/taon-helpers.d.ts +0 -16
  342. package/lib-prod/helpers/taon-helpers.js +0 -162
  343. package/lib-prod/helpers/taon-helpers.js.map +0 -1
  344. package/lib-prod/index._auto-generated_.d.ts +0 -0
  345. package/lib-prod/index._auto-generated_.js.map +0 -1
  346. package/lib-prod/index.d.ts +0 -230
  347. package/lib-prod/index.js +0 -273
  348. package/lib-prod/index.js.map +0 -1
  349. package/lib-prod/inject.d.ts +0 -4
  350. package/lib-prod/inject.js.map +0 -1
  351. package/lib-prod/migrations/index.d.ts +0 -1
  352. package/lib-prod/migrations/index.js +0 -19
  353. package/lib-prod/migrations/index.js.map +0 -1
  354. package/lib-prod/migrations/migrations_index._auto-generated_.d.ts +0 -0
  355. package/lib-prod/migrations/migrations_index._auto-generated_.js.map +0 -1
  356. package/lib-prod/models.d.ts +0 -255
  357. package/lib-prod/models.js +0 -117
  358. package/lib-prod/models.js.map +0 -1
  359. package/lib-prod/orm/columns.d.ts +0 -32
  360. package/lib-prod/orm/columns.js +0 -112
  361. package/lib-prod/orm/columns.js.map +0 -1
  362. package/lib-prod/orm/index.d.ts +0 -1
  363. package/lib-prod/orm/index.js +0 -73
  364. package/lib-prod/orm/index.js.map +0 -1
  365. package/lib-prod/realtime/realtime-client.d.ts +0 -41
  366. package/lib-prod/realtime/realtime-client.js +0 -204
  367. package/lib-prod/realtime/realtime-client.js.map +0 -1
  368. package/lib-prod/realtime/realtime-core.d.ts +0 -40
  369. package/lib-prod/realtime/realtime-core.js +0 -106
  370. package/lib-prod/realtime/realtime-core.js.map +0 -1
  371. package/lib-prod/realtime/realtime-server.d.ts +0 -43
  372. package/lib-prod/realtime/realtime-server.js +0 -243
  373. package/lib-prod/realtime/realtime-server.js.map +0 -1
  374. package/lib-prod/realtime/realtime-strategy/index.js +0 -21
  375. package/lib-prod/realtime/realtime-strategy/index.js.map +0 -1
  376. package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.d.ts +0 -80
  377. package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.js +0 -297
  378. package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.js.map +0 -1
  379. package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.d.ts +0 -14
  380. package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.js +0 -303
  381. package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.js.map +0 -1
  382. package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.d.ts +0 -16
  383. package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.js +0 -33
  384. package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.js.map +0 -1
  385. package/lib-prod/realtime/realtime-strategy/realtime-strategy.d.ts +0 -11
  386. package/lib-prod/realtime/realtime-strategy/realtime-strategy.js +0 -17
  387. package/lib-prod/realtime/realtime-strategy/realtime-strategy.js.map +0 -1
  388. package/lib-prod/realtime/realtime-subs-manager.d.ts +0 -14
  389. package/lib-prod/realtime/realtime-subs-manager.js +0 -94
  390. package/lib-prod/realtime/realtime-subs-manager.js.map +0 -1
  391. package/lib-prod/realtime/realtime.models.js +0 -4
  392. package/lib-prod/realtime/realtime.models.js.map +0 -1
  393. package/lib-prod/symbols.d.ts +0 -63
  394. package/lib-prod/symbols.js +0 -109
  395. package/lib-prod/symbols.js.map +0 -1
  396. package/lib-prod/ui/index.d.ts +0 -1
  397. package/lib-prod/ui/index.js +0 -5
  398. package/lib-prod/ui/index.js.map +0 -1
  399. package/lib-prod/ui/taon-admin-mode-configuration/index.d.ts +0 -1
  400. package/lib-prod/ui/taon-admin-mode-configuration/index.js +0 -5
  401. package/lib-prod/ui/taon-admin-mode-configuration/index.js.map +0 -1
  402. package/lib-prod/validators.d.ts +0 -5
  403. package/lib-prod/validators.js +0 -88
  404. package/lib-prod/validators.js.map +0 -1
  405. /package/lib-prod/env/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,3100 @@
1
+ //#region imports
2
+ import type { Server } from 'http';
3
+ import { Http2Server } from 'http2'; // @backend
4
+ import { URL } from 'url'; // @backend
5
+
6
+ import axios from 'axios';
7
+ import * as bodyParser from 'body-parser'; // @backend
8
+ import * as cookieParser from 'cookie-parser'; // @backend
9
+ import * as cors from 'cors'; // @backend
10
+ import { ipcMain } from 'electron'; // @backend
11
+ import * as express from 'express';
12
+ import type { Application } from 'express';
13
+ // multer in taon middleware will do better job than express-fileupload
14
+ // import * as fileUpload from 'express-fileupload'; // @backend
15
+ import * as expressSession from 'express-session'; // @backend
16
+ import { JSON10 } from 'json10/lib-prod';
17
+ import { walk } from 'lodash-walk-object/lib-prod';
18
+ import * as methodOverride from 'method-override'; // @backend
19
+ import { Resource, RestErrorResponseWrapper, RestHeaders, Mapping__NS__decode, Mapping__NS__DefaultModelWithMapping, Mapping__NS__encode, Mapping__NS__getModelsMapping, Mapping__NS__Mapping, Mapping__NS__ModelValue, Models__NS__BackendError as ModelsNg2Rest__NS__BackendError, Models__NS__BaseBody as ModelsNg2Rest__NS__BaseBody, Models__NS__BaseResponse as ModelsNg2Rest__NS__BaseResponse, Models__NS__ErrorBody as ModelsNg2Rest__NS__ErrorBody, Models__NS__FnMethodsHttp as ModelsNg2Rest__NS__FnMethodsHttp, Models__NS__FnMethodsHttpWithMock as ModelsNg2Rest__NS__FnMethodsHttpWithMock, Models__NS__HandleResultOptions as ModelsNg2Rest__NS__HandleResultOptions, Models__NS__HandleResultSourceRequestOptions as ModelsNg2Rest__NS__HandleResultSourceRequestOptions, Models__NS__HttpBody as ModelsNg2Rest__NS__HttpBody, Models__NS__HttpCode as ModelsNg2Rest__NS__HttpCode, Models__NS__HttpResponse as ModelsNg2Rest__NS__HttpResponse, Models__NS__MetaRequest as ModelsNg2Rest__NS__MetaRequest, Models__NS__MethodWithBody as ModelsNg2Rest__NS__MethodWithBody, Models__NS__MockController as ModelsNg2Rest__NS__MockController, Models__NS__MockHttp as ModelsNg2Rest__NS__MockHttp, Models__NS__MockResponse as ModelsNg2Rest__NS__MockResponse, Models__NS__NestedParams as ModelsNg2Rest__NS__NestedParams, Models__NS__Ng2RestAxiosRequestConfig as ModelsNg2Rest__NS__Ng2RestAxiosRequestConfig, Models__NS__Ng2RestMethods as ModelsNg2Rest__NS__Ng2RestMethods, Models__NS__PromiseObservableMix as ModelsNg2Rest__NS__PromiseObservableMix, Models__NS__ReplayData as ModelsNg2Rest__NS__ReplayData, Models__NS__ReqParams as ModelsNg2Rest__NS__ReqParams, Models__NS__ResourceModel as ModelsNg2Rest__NS__ResourceModel, Models__NS__ResponseTypeAxios as ModelsNg2Rest__NS__ResponseTypeAxios, Models__NS__UrlParams as ModelsNg2Rest__NS__UrlParams } from 'ng2-rest/lib-prod';
20
+ import { from, Subject } from 'rxjs';
21
+ import type {
22
+ TransactionRollbackEvent,
23
+ TransactionCommitEvent,
24
+ TransactionStartEvent,
25
+ RecoverEvent,
26
+ SoftRemoveEvent,
27
+ RemoveEvent,
28
+ UpdateEvent,
29
+ InsertEvent,
30
+ Repository,
31
+ } from 'taon-typeorm/lib-prod'; // @websql
32
+ import { EventSubscriber } from 'taon-typeorm/lib-prod'; // @websql
33
+ import { Entity as TypeormEntity, Tree } from 'taon-typeorm/lib-prod'; // @websql
34
+ import {
35
+ DataSource,
36
+ DataSourceOptions,
37
+ getMetadataArgsStorage,
38
+ } from 'taon-typeorm/lib-prod';
39
+ import { config } from 'tnp-core/lib-prod';
40
+ import { CoreModels__NS__BaseProjectType, CoreModels__NS__BaseProjectTypeArr, CoreModels__NS__CfontAlign, CoreModels__NS__CfontStyle, CoreModels__NS__ClassNameStaticProperty, CoreModels__NS__ContentType, CoreModels__NS__ContentTypeKeys, CoreModels__NS__CoreLibCategory, CoreModels__NS__CutableFileExt, CoreModels__NS__DatabaseType, CoreModels__NS__EnvironmentName, CoreModels__NS__EnvironmentNameTaon, CoreModels__NS__ExecuteOptions, CoreModels__NS__FileEvent, CoreModels__NS__FileExtension, CoreModels__NS__FrameworkVersion, CoreModels__NS__GlobalDependencies, CoreModels__NS__HttpMethod, CoreModels__NS__ImageFileExtension, CoreModels__NS__ImageFileExtensionArr, CoreModels__NS__InstalationType, CoreModels__NS__InstalationTypeArr, CoreModels__NS__LibType, CoreModels__NS__localhostDomain, CoreModels__NS__localhostIp127, CoreModels__NS__ManifestIcon, CoreModels__NS__MediaType, CoreModels__NS__MediaTypeAllArr, CoreModels__NS__MimeType, CoreModels__NS__mimeTypes, CoreModels__NS__MimeTypesObj, CoreModels__NS__NewFactoryType, CoreModels__NS__NpmInstallOptions, CoreModels__NS__NpmSpecialVersions, CoreModels__NS__OrignalClassKey, CoreModels__NS__OutFolder, CoreModels__NS__Package, CoreModels__NS__ParamType, CoreModels__NS__parentLocation, CoreModels__NS__pathToChildren, CoreModels__NS__Position, CoreModels__NS__PreReleaseVersionTag, CoreModels__NS__PROGRESS_DATA_TYPE, CoreModels__NS__PUSHTYPE, CoreModels__NS__PwaManifest, CoreModels__NS__ReleaseVersionType, CoreModels__NS__ReleaseVersionTypeEnum, CoreModels__NS__RunOptions, CoreModels__NS__Size, CoreModels__NS__SPECIAL_APP_READY_MESSAGE, CoreModels__NS__SPECIAL_WORKER_READY_MESSAGE, CoreModels__NS__tagForTaskName, CoreModels__NS__TaonHttpErrorCustomProp, CoreModels__NS__TsUsage, CoreModels__NS__UIFramework, CoreModels__NS__UploadedBackendFile, CoreModels__NS__VSCodeSettings } from 'tnp-core/lib-prod';
41
+ import { fse, http, https, os } from 'tnp-core/lib-prod'; // @backend
42
+ import { Utils__NS__binary__NS__base64toBlob, Utils__NS__binary__NS__base64toBuffer, Utils__NS__binary__NS__base64toDbBinaryFormat, Utils__NS__binary__NS__blobToArrayBuffer, Utils__NS__binary__NS__blobToBase64, Utils__NS__binary__NS__blobToBuffer, Utils__NS__binary__NS__blobToFile, Utils__NS__binary__NS__blobToJson, Utils__NS__binary__NS__blobToText, Utils__NS__binary__NS__bufferToBase64, Utils__NS__binary__NS__bufferToBlob, Utils__NS__binary__NS__bufferToText, Utils__NS__binary__NS__dbBinaryFormatToBase64, Utils__NS__binary__NS__dbBinaryFormatToText, Utils__NS__binary__NS__fileToBlob, Utils__NS__binary__NS__fileToText, Utils__NS__binary__NS__getBlobFrom, Utils__NS__binary__NS__jsonToBlob, Utils__NS__binary__NS__textToBlob, Utils__NS__binary__NS__textToBuffer, Utils__NS__binary__NS__textToDbBinaryFormat, Utils__NS__binary__NS__textToFile, Utils__NS__camelize, Utils__NS__css__NS__numValue, Utils__NS__DbBinaryFormat, Utils__NS__DbBinaryFormatEnum, Utils__NS__DbBinaryFormatForBackend, Utils__NS__DbBinaryFormatForBrowser, Utils__NS__escapeStringForRegEx, Utils__NS__fullDate, Utils__NS__fullDateTime, Utils__NS__getFreePort, Utils__NS__removeChalkSpecialChars, Utils__NS__requireUncached, Utils__NS__sortKeys, Utils__NS__uniqArray, Utils__NS__wait, Utils__NS__waitMilliseconds, UtilsOs__NS__commandExistsAsync, UtilsOs__NS__commandExistsSync, UtilsOs__NS__detectEditor, UtilsOs__NS__Editor, UtilsOs__NS__EDITOR_PROCESSES, UtilsOs__NS__EditorArr, UtilsOs__NS__EditorProcess, UtilsOs__NS__getEditorSettingsJsonPath, UtilsOs__NS__getRealHomeDir, UtilsOs__NS__isBrowser, UtilsOs__NS__isDockerAvailable, UtilsOs__NS__isElectron, UtilsOs__NS__isNode, UtilsOs__NS__isNodeVersionOk, UtilsOs__NS__isPortInUse, UtilsOs__NS__isRunningInBrowser, UtilsOs__NS__isRunningInCliMode, UtilsOs__NS__isRunningInDocker, UtilsOs__NS__isRunningInElectron, UtilsOs__NS__isRunningInLinuxGraphicsCapableEnvironment, UtilsOs__NS__isRunningInMochaTest, UtilsOs__NS__isRunningInNode, UtilsOs__NS__isRunningInOsWithGraphicsCapableEnvironment, UtilsOs__NS__isRunningInSSRMode, UtilsOs__NS__isRunningInVscodeExtension, UtilsOs__NS__isRunningInWebSQL, UtilsOs__NS__isRunningInWindows, UtilsOs__NS__isRunningInWindowsCmd, UtilsOs__NS__isRunningInWindowsPowerShell, UtilsOs__NS__isRunningInWsl, UtilsOs__NS__isRunningNodeDebugger, UtilsOs__NS__isSSRMode, UtilsOs__NS__isVscodeExtension, UtilsOs__NS__isWebSQL, UtilsOs__NS__killAllEditor, UtilsOs__NS__openFolderInFileExplorer, UtilsOs__NS__openFolderInVSCode, UtilsOs__NS__pipxNestedPackageExists, UtilsOs__NS__pipxPackageExists, UtilsOs__NS__pythonModuleExists, UtilsOs__NS__UnknownEditor } from 'tnp-core/lib-prod';
43
+ import { crossPlatformPath } from 'tnp-core/lib-prod';
44
+ import { ___NS__add, ___NS__after, ___NS__ary, ___NS__assign, ___NS__assignIn, ___NS__assignInWith, ___NS__assignWith, ___NS__at, ___NS__attempt, ___NS__before, ___NS__bind, ___NS__bindAll, ___NS__bindKey, ___NS__camelCase, ___NS__capitalize, ___NS__castArray, ___NS__ceil, ___NS__chain, ___NS__chunk, ___NS__clamp, ___NS__clone, ___NS__cloneDeep, ___NS__cloneDeepWith, ___NS__cloneWith, ___NS__compact, ___NS__concat, ___NS__cond, ___NS__conforms, ___NS__conformsTo, ___NS__constant, ___NS__countBy, ___NS__create, ___NS__curry, ___NS__curryRight, ___NS__debounce, ___NS__deburr, ___NS__defaults, ___NS__defaultsDeep, ___NS__defaultTo, ___NS__defer, ___NS__delay, ___NS__difference, ___NS__differenceBy, ___NS__differenceWith, ___NS__divide, ___NS__drop, ___NS__dropRight, ___NS__dropRightWhile, ___NS__dropWhile, ___NS__each, ___NS__eachRight, ___NS__endsWith, ___NS__entries, ___NS__entriesIn, ___NS__eq, ___NS__escape, ___NS__escapeRegExp, ___NS__every, ___NS__extend, ___NS__extendWith, ___NS__fill, ___NS__filter, ___NS__find, ___NS__findIndex, ___NS__findKey, ___NS__findLast, ___NS__findLastIndex, ___NS__findLastKey, ___NS__first, ___NS__flatMap, ___NS__flatMapDeep, ___NS__flatMapDepth, ___NS__flatten, ___NS__flattenDeep, ___NS__flattenDepth, ___NS__flip, ___NS__floor, ___NS__flow, ___NS__flowRight, ___NS__forEach, ___NS__forEachRight, ___NS__forIn, ___NS__forInRight, ___NS__forOwn, ___NS__forOwnRight, ___NS__fromPairs, ___NS__functions, ___NS__functionsIn, ___NS__get, ___NS__groupBy, ___NS__gt, ___NS__gte, ___NS__has, ___NS__hasIn, ___NS__head, ___NS__identity, ___NS__includes, ___NS__indexOf, ___NS__initial, ___NS__inRange, ___NS__intersection, ___NS__intersectionBy, ___NS__intersectionWith, ___NS__invert, ___NS__invertBy, ___NS__invoke, ___NS__invokeMap, ___NS__isArguments, ___NS__isArray, ___NS__isArrayBuffer, ___NS__isArrayLike, ___NS__isArrayLikeObject, ___NS__isBoolean, ___NS__isBuffer, ___NS__isDate, ___NS__isElement, ___NS__isEmpty, ___NS__isEqual, ___NS__isEqualWith, ___NS__isError, ___NS__isFinite, ___NS__isFunction, ___NS__isInteger, ___NS__isLength, ___NS__isMap, ___NS__isMatch, ___NS__isMatchWith, ___NS__isNaN, ___NS__isNative, ___NS__isNil, ___NS__isNull, ___NS__isNumber, ___NS__isObject, ___NS__isObjectLike, ___NS__isPlainObject, ___NS__isRegExp, ___NS__isSafeInteger, ___NS__isSet, ___NS__isString, ___NS__isSymbol, ___NS__isTypedArray, ___NS__isUndefined, ___NS__isWeakMap, ___NS__isWeakSet, ___NS__iteratee, ___NS__join, ___NS__kebabCase, ___NS__keyBy, ___NS__keys, ___NS__keysIn, ___NS__last, ___NS__lastIndexOf, ___NS__lowerCase, ___NS__lowerFirst, ___NS__lt, ___NS__lte, ___NS__map, ___NS__mapKeys, ___NS__mapValues, ___NS__matches, ___NS__matchesProperty, ___NS__max, ___NS__maxBy, ___NS__mean, ___NS__meanBy, ___NS__memoize, ___NS__merge, ___NS__mergeWith, ___NS__method, ___NS__methodOf, ___NS__min, ___NS__minBy, ___NS__mixin, ___NS__multiply, ___NS__negate, ___NS__noop, ___NS__now, ___NS__nth, ___NS__nthArg, ___NS__omit, ___NS__omitBy, ___NS__once, ___NS__orderBy, ___NS__over, ___NS__overArgs, ___NS__overEvery, ___NS__overSome, ___NS__pad, ___NS__padEnd, ___NS__padStart, ___NS__parseInt, ___NS__partial, ___NS__partialRight, ___NS__partition, ___NS__pick, ___NS__pickBy, ___NS__property, ___NS__propertyOf, ___NS__pull, ___NS__pullAll, ___NS__pullAllBy, ___NS__pullAllWith, ___NS__pullAt, ___NS__random, ___NS__range, ___NS__rangeRight, ___NS__rearg, ___NS__reduce, ___NS__reduceRight, ___NS__reject, ___NS__remove, ___NS__repeat, ___NS__replace, ___NS__rest, ___NS__result, ___NS__reverse, ___NS__round, ___NS__sample, ___NS__sampleSize, ___NS__set, ___NS__setWith, ___NS__shuffle, ___NS__size, ___NS__slice, ___NS__snakeCase, ___NS__some, ___NS__sortBy, ___NS__sortedIndex, ___NS__sortedIndexBy, ___NS__sortedIndexOf, ___NS__sortedLastIndex, ___NS__sortedLastIndexBy, ___NS__sortedLastIndexOf, ___NS__sortedUniq, ___NS__sortedUniqBy, ___NS__split, ___NS__spread, ___NS__startCase, ___NS__startsWith, ___NS__stubArray, ___NS__stubFalse, ___NS__stubObject, ___NS__stubString, ___NS__stubTrue, ___NS__subtract, ___NS__sum, ___NS__sumBy, ___NS__tail, ___NS__take, ___NS__takeRight, ___NS__takeRightWhile, ___NS__takeWhile, ___NS__tap, ___NS__template, ___NS__templateSettings, ___NS__throttle, ___NS__thru, ___NS__times, ___NS__toArray, ___NS__toFinite, ___NS__toInteger, ___NS__toLength, ___NS__toLower, ___NS__toNumber, ___NS__toPairs, ___NS__toPairsIn, ___NS__toPath, ___NS__toPlainObject, ___NS__toSafeInteger, ___NS__toString, ___NS__toUpper, ___NS__transform, ___NS__trim, ___NS__trimEnd, ___NS__trimStart, ___NS__truncate, ___NS__unary, ___NS__unescape, ___NS__union, ___NS__unionBy, ___NS__unionWith, ___NS__uniq, ___NS__uniqBy, ___NS__uniqueId, ___NS__uniqWith, ___NS__unset, ___NS__unzip, ___NS__unzipWith, ___NS__update, ___NS__updateWith, ___NS__upperCase, ___NS__upperFirst, ___NS__values, ___NS__valuesIn, ___NS__without, ___NS__words, ___NS__wrap, ___NS__xor, ___NS__xorBy, ___NS__xorWith, ___NS__zip, ___NS__zipObject, ___NS__zipObjectDeep, ___NS__zipWith, Helpers__NS___fixCommand, Helpers__NS__bigMaxBuffer, Helpers__NS__checkProcess, Helpers__NS__cleanExit, Helpers__NS__clearConsole, Helpers__NS__command, Helpers__NS__commandOutputAsString, Helpers__NS__commandOutputAsStringAsync, Helpers__NS__compilationWrapper, Helpers__NS__contain, Helpers__NS__createFolder, Helpers__NS__createSymLink, Helpers__NS__error, Helpers__NS__execute, Helpers__NS__exists, Helpers__NS__filesFrom, Helpers__NS__foldersFrom, Helpers__NS__getFilesFrom, Helpers__NS__getFoldersFrom, Helpers__NS__getIsBrowser, Helpers__NS__getIsElectron, Helpers__NS__getIsNode, Helpers__NS__getIsRunningInGitBash, Helpers__NS__getIsSupportedTaonTerminal, Helpers__NS__getIsVerboseMode, Helpers__NS__getIsWebSQL, Helpers__NS__getIsWsl, Helpers__NS__getStdio, Helpers__NS__hideNodeWarnings, Helpers__NS__info, Helpers__NS__isBlob, Helpers__NS__isBuffer, Helpers__NS__isClass, Helpers__NS__isExistedSymlink, Helpers__NS__isFile, Helpers__NS__isFolder, Helpers__NS__isRunningInDocker, Helpers__NS__isRunningInLinuxGraphicsCapableEnvironment, Helpers__NS__isSymlinkFileExitedOrUnexisted, Helpers__NS__isSymlinkThatMatchesUrl, Helpers__NS__isUnexistedLink, Helpers__NS__killOnPort, Helpers__NS__killProcess, Helpers__NS__killProcessByPort, Helpers__NS__linksToFolderFrom, Helpers__NS__linksToFoldersFrom, Helpers__NS__log, Helpers__NS__logError, Helpers__NS__logInfo, Helpers__NS__logProc, Helpers__NS__logSuccess, Helpers__NS__logWarn, Helpers__NS__mediaTypeFromSrc, Helpers__NS__mkdirp, Helpers__NS__modifyLineByLine, Helpers__NS__msgCacheClear, Helpers__NS__openFolderInFileExplorer, Helpers__NS__parse, Helpers__NS__pathContainLink, Helpers__NS__questionYesNo, Helpers__NS__readFile, Helpers__NS__readJson, Helpers__NS__readJson5, Helpers__NS__readJsonC, Helpers__NS__relative, Helpers__NS__remove, Helpers__NS__removeEmptyLineFromString, Helpers__NS__removeFileIfExists, Helpers__NS__removeFolderIfExists, Helpers__NS__removeIfExists, Helpers__NS__removeSlashAtBegin, Helpers__NS__removeSlashAtEnd, Helpers__NS__removeSymlinks, Helpers__NS__renderError, Helpers__NS__replaceLinesInFile, Helpers__NS__run, Helpers__NS__runAsyncIn, Helpers__NS__runSyncIn, Helpers__NS__runSyncOrAsync, Helpers__NS__sleep, Helpers__NS__stopApplication, Helpers__NS__stringify, Helpers__NS__success, Helpers__NS__taskDone, Helpers__NS__taskStarted, Helpers__NS__throwError, Helpers__NS__timeout, Helpers__NS__tryCatchError, Helpers__NS__tryReadFile, Helpers__NS__tryRemoveDir, Helpers__NS__values, Helpers__NS__wait, Helpers__NS__warn, Helpers__NS__writeFile, Helpers__NS__writeJson, Helpers__NS__writeJson5, Helpers__NS__writeJsonC } from 'tnp-core/lib-prod';
45
+ import { path } from 'tnp-core/lib-prod';
46
+
47
+ import type { TaonBaseClass } from './base-classes/base-class';
48
+ import type { TaonBaseController } from './base-classes/base-controller';
49
+ import type { TaonBaseInjector } from './base-classes/base-injector';
50
+ import type { TaonBaseMiddleware } from './base-classes/base-middleware';
51
+ import type { TaonBaseMigration } from './base-classes/base-migration';
52
+ import { TaonBaseSubscriberForEntity } from './base-classes/base-subscriber-for-entity';
53
+ import type { ControllerConfig } from './config/controller-config';
54
+ import { MethodConfig } from './config/method-config';
55
+ import { ParamConfig } from './config/param-config';
56
+ import { apiPrefix } from './constants';
57
+ import { ContextDbMigrations } from './context-db-migrations';
58
+ import { createContext } from './create-context';
59
+ import { TaonEntityOptions } from './decorators/classes/entity-decorator';
60
+ import { TaonSubscriberOptions } from './decorators/classes/subscriber-decorator';
61
+ import { DITaonContainer } from './dependency-injection/di-container';
62
+ import type { ContextsEndpointStorage } from './endpoint-context-storage';
63
+ import { EntityProcess } from './entity-process';
64
+ import { getResponseValue } from './get-response-value';
65
+ import { ClassHelpers__NS__asyncHandler, ClassHelpers__NS__ensureClassConfig, ClassHelpers__NS__ensureMethodConfig, ClassHelpers__NS__getClassConfig, ClassHelpers__NS__getClassFnFromObject, ClassHelpers__NS__getControllerConfigs, ClassHelpers__NS__getFullInternalName, ClassHelpers__NS__getMethodsNames, ClassHelpers__NS__getName, ClassHelpers__NS__getOrginalClass, ClassHelpers__NS__getUniqueKey, ClassHelpers__NS__hasParentClassWithName, ClassHelpers__NS__isContextClassObject, ClassHelpers__NS__setName } from './helpers/class-helpers';
66
+ import { TaonHelpers__NS__defaultType, TaonHelpers__NS__fillUpTo, TaonHelpers__NS__firstStringOrElemFromArray, TaonHelpers__NS__getExpressPath, TaonHelpers__NS__ipcKeyNameRequest, TaonHelpers__NS__ipcKeyNameResponse, TaonHelpers__NS__isGoodPath, TaonHelpers__NS__isPlainFileOrFolder, TaonHelpers__NS__parseJSONwithStringJSONs, TaonHelpers__NS__tryTransformParam, TaonHelpers__NS__websqlMocks } from './helpers/taon-helpers';
67
+ import { Models__NS__ClassType, Models__NS__ClassTypeKey, Models__NS__ConnectionOptionsLogs, Models__NS__ContextOptions, Models__NS__DatabaseConfig, Models__NS__DatabaseConfigTypeOrm, Models__NS__DatabasesFolder, Models__NS__DBRecreateMode, Models__NS__FrameworkMode, Models__NS__Http__NS__AsyncResponse, Models__NS__Http__NS__AuthCallBack, Models__NS__Http__NS__ClientAction, Models__NS__Http__NS__ContextENDPOINT, Models__NS__Http__NS__ExpressContext, Models__NS__Http__NS__FormlyFromType, Models__NS__Http__NS__MixResponse, Models__NS__Http__NS__Response, Models__NS__Http__NS__ResponseFuncOpt, Models__NS__Http__NS__SyncResponse, Models__NS__Http__NS__SyncResponseFunc, Models__NS__ISession, Models__NS__MiddlewareType, Models__NS__StartParams, Models__NS__TaonCtxCloneParams, Models__NS__TaonInitializeParams } from './models';
68
+ import { RealtimeCore } from './realtime/realtime-core';
69
+ import { Symbols__NS__classMethodsNames, Symbols__NS__classNameStaticProperty, Symbols__NS__ctxInClassOrClassObj, Symbols__NS__fullClassNameStaticProperty, Symbols__NS__metadata, Symbols__NS__old, Symbols__NS__orignalClass, Symbols__NS__orignalClassClonesObj, Symbols__NS__REALTIME } from './symbols';
70
+ /* */
71
+ //#endregion
72
+
73
+ export class EndpointContext {
74
+ //#region fields
75
+
76
+ //#region fields / use mariadb mysql in docker
77
+ /**
78
+ * JUST FOR TESTING PURPOSES
79
+ */
80
+ public readonly USE_MARIADB_MYSQL_IN_DOCKER: boolean = false;
81
+ //#endregion
82
+
83
+ //#region fields / flags
84
+ disabledRealtime: boolean = false;
85
+
86
+ /**
87
+ * check whether context is inited
88
+ * (with init() function )
89
+ */
90
+ public inited: boolean = false;
91
+ //#endregion
92
+
93
+ //#region fields / db migrations
94
+ readonly dbMigrations = new ContextDbMigrations(this);
95
+ //#endregion
96
+
97
+ //#region fields / local instance obj symbol
98
+ private readonly localInstaceObjSymbol = Symbol('localInstaceObjSymbol');
99
+ //#endregion
100
+
101
+ //#region fields / all instances of classes from context
102
+ /**
103
+ * all instances of classes from context
104
+ * key is class name
105
+ */
106
+ public readonly allClassesInstances = {};
107
+ //#endregion
108
+
109
+ //#region fields / class instances by name
110
+ private readonly classInstancesByNameObj = {};
111
+ //#endregion
112
+
113
+ //#region fields / obj with classes instances arr
114
+ private readonly objWithClassesInstancesArr = {};
115
+ //#endregion
116
+
117
+ //#region fields / active routes
118
+ public readonly activeRoutes: {
119
+ expressPath: string;
120
+ method: CoreModels__NS__HttpMethod;
121
+ }[] = [];
122
+ //#endregion
123
+
124
+ //#region fields / typeorm repositories
125
+ //#region @websql
126
+ public repos = new Map<string, Repository<any>>();
127
+ //#endregion
128
+ //#endregion
129
+
130
+ //#region fields / source context
131
+ get sourceContext(): EndpointContext | undefined {
132
+ return this.cloneOptions?.sourceContext;
133
+ }
134
+ //#endregion
135
+
136
+ //#region fields / skip writing server routes
137
+ public readonly skipWritingServerRoutes: boolean = false;
138
+ //#endregion
139
+
140
+ //#region fields / types from contexts
141
+ private injectableTypesfromContexts = [
142
+ Models__NS__ClassType.CONTROLLER,
143
+ Models__NS__ClassType.PROVIDER,
144
+ Models__NS__ClassType.MIDDLEWARE,
145
+ Models__NS__ClassType.REPOSITORY,
146
+ Models__NS__ClassType.SUBSCRIBER,
147
+ Models__NS__ClassType.MIGRATION,
148
+ ];
149
+ //#endregion
150
+
151
+ //#region fields / all types from contexts
152
+ private allTypesfromContexts = [
153
+ ...this.injectableTypesfromContexts,
154
+ Models__NS__ClassType.ENTITY,
155
+ ];
156
+ //#endregion
157
+
158
+ //#region fields / express app
159
+ public expressApp: Application = {} as any;
160
+ //#endregion
161
+
162
+ //#region fields / server tcp udp
163
+ public serverTcpUdp: Server;
164
+ //#endregion
165
+
166
+ //#region fields / database config
167
+ databaseConfig?: Models__NS__DatabaseConfigTypeOrm;
168
+ //#endregion
169
+
170
+ //#region fields / mode
171
+ mode: Models__NS__FrameworkMode;
172
+ //#endregion
173
+
174
+ //#region fields / only migration start
175
+ readonly onlyMigrationRun?: boolean = false;
176
+
177
+ readonly onlyMigrationRevertToTimestamp?: number = undefined;
178
+
179
+ get isRunOrRevertOnlyMigrationAppStart(): boolean {
180
+ return !!(this.onlyMigrationRun || this.onlyMigrationRevertToTimestamp);
181
+ }
182
+ //#endregion
183
+
184
+ //#region fields / session
185
+ session?: Models__NS__ISession;
186
+ //#endregion
187
+
188
+ //#region fields / connection
189
+ public connection: DataSource;
190
+ //#endregion
191
+
192
+ //#region fields / entities triggers
193
+ private entitiesTriggers = {};
194
+ //#endregion
195
+
196
+ //#region fields / realtime
197
+ private realtime: RealtimeCore;
198
+
199
+ get realtimeClient() {
200
+ return this.realtime.client;
201
+ }
202
+
203
+ get realtimeServer() {
204
+ return this.realtime.server;
205
+ }
206
+ //#endregion
207
+
208
+ //#region fields / config
209
+ /**
210
+ * available after init()
211
+ */
212
+ public config: Models__NS__ContextOptions<any, any, any, any, any, any, any, any>;
213
+ //#endregion
214
+
215
+ //#region fields / logs
216
+ get logHttp(): boolean {
217
+ if (___NS__isObject(this.config?.logs)) {
218
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).http;
219
+ }
220
+ return this.config?.logs === true;
221
+ }
222
+
223
+ get logRealtime(): boolean {
224
+ if (___NS__isObject(this.config?.logs)) {
225
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).realtime;
226
+ }
227
+ return this.config?.logs === true;
228
+ }
229
+
230
+ get logFramework(): boolean {
231
+ if (___NS__isObject(this.config?.logs)) {
232
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).framework;
233
+ }
234
+ return this.config?.logs === true;
235
+ }
236
+
237
+ get logRoutes(): boolean {
238
+ if (___NS__isObject(this.config?.logs)) {
239
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).routes;
240
+ }
241
+ return this.config?.logs === true;
242
+ }
243
+
244
+ get logDb(): boolean {
245
+ if (___NS__isObject(this.config?.logs)) {
246
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).db;
247
+ }
248
+ return this.config?.logs === true;
249
+ }
250
+
251
+ get logMigrations(): boolean {
252
+ if (___NS__isObject(this.config?.logs)) {
253
+ return !!(this.config.logs as Models__NS__ConnectionOptionsLogs).migrations;
254
+ }
255
+ return this.config?.logs === true;
256
+ }
257
+ //#endregion
258
+
259
+ //#endregion
260
+
261
+ //#region constructor
262
+ /**
263
+ * Inside docker there is not need for https secure server
264
+ */
265
+ public readonly isRunningInsideDocker: boolean = false;
266
+
267
+ constructor(
268
+ private originalConfig: Models__NS__ContextOptions<
269
+ any,
270
+ any,
271
+ any,
272
+ any,
273
+ any,
274
+ any,
275
+ any,
276
+ any
277
+ >,
278
+ private configFn: (
279
+ env: any,
280
+ ) => Models__NS__ContextOptions<any, any, any, any, any, any, any, any>,
281
+ /**
282
+ * (@default: false)
283
+ * If TRUE context is NOT going to create db/express server/http endpoints
284
+ * PURPOSE OF THIS PROPERTY
285
+ * -> ONLY remote access from backend or frontend to specific backend
286
+ */
287
+ private readonly cloneOptions: Models__NS__TaonCtxCloneParams,
288
+ ) {
289
+ this.cloneOptions = this.cloneOptions || {};
290
+ this.isRunningInsideDocker = UtilsOs__NS__isRunningInDocker();
291
+ }
292
+ //#endregion
293
+
294
+ //#region methods & getters / init
295
+ public async init(options?: {
296
+ initFromRecrusiveContextResovle?: boolean;
297
+ onlyMigrationRun?: boolean;
298
+ onlyMigrationRevertToTimestamp?: number;
299
+ }) {
300
+ const {
301
+ initFromRecrusiveContextResovle,
302
+ onlyMigrationRun,
303
+ onlyMigrationRevertToTimestamp,
304
+ } = options || {}; // TODO use it ?
305
+
306
+ this.inited = true;
307
+ // @ts-ignore
308
+ this.onlyMigrationRun = onlyMigrationRun;
309
+ // @ts-ignore
310
+ this.onlyMigrationRevertToTimestamp = onlyMigrationRevertToTimestamp;
311
+ this.config = this.configFn({});
312
+ if (___NS__isObject(this.config.database)) {
313
+ this.config.database = Models__NS__DatabaseConfig.from(
314
+ this.config.database as Models__NS__DatabaseConfig,
315
+ ).databaseConfigTypeORM;
316
+ }
317
+
318
+ this.config.host = this.host === null ? void 0 : this.host;
319
+
320
+ if (
321
+ this.cloneOptions.overrideHost &&
322
+ !this.cloneOptions.useAsRemoteContext
323
+ ) {
324
+ this.config.host = this.cloneOptions.overrideHost;
325
+ }
326
+
327
+ if (
328
+ this.cloneOptions.overrideRemoteHost &&
329
+ this.cloneOptions.useAsRemoteContext
330
+ ) {
331
+ this.config.host = this.cloneOptions.overrideRemoteHost;
332
+ }
333
+
334
+ if (
335
+ this.config.host &&
336
+ !this.config.host.startsWith('http://') &&
337
+ !this.config.host.startsWith('https://')
338
+ ) {
339
+ Helpers__NS__throwError(
340
+ `[taon-config] Your${this.host ? ' remote' : ''} 'host' must start with http:// or https://`,
341
+ );
342
+ }
343
+
344
+ if (___NS__isUndefined(this.config.useIpcWhenElectron)) {
345
+ this.config.useIpcWhenElectron = true;
346
+ }
347
+ // console.log(`config for ${this.contextName}`, this.config);
348
+
349
+ //#region resolve if skipping writing server routes
350
+ //@ts-expect-error overriding readonly
351
+ this.skipWritingServerRoutes = ___NS__isBoolean(
352
+ this.config.skipWritingServerRoutes,
353
+ )
354
+ ? this.config.skipWritingServerRoutes
355
+ : false;
356
+ //#endregion
357
+
358
+ //#region resolve mode
359
+ if (this.config.host) {
360
+ this.mode = 'backend-frontend(tcp+udp)';
361
+ /* */
362
+ /* */
363
+
364
+ }
365
+
366
+ if (this.isRemoteHost) {
367
+ this.mode = 'remote-backend(tcp+udp)';
368
+ }
369
+
370
+ // console.log(`
371
+
372
+ // useIpcWhenElectron: ${this.config.useIpcWhenElectron}
373
+ // UtilsOs__NS__isElectron: ${UtilsOs__NS__isElectron}
374
+
375
+ // `)
376
+ if (this.config.useIpcWhenElectron && UtilsOs__NS__isElectron) {
377
+ if (UtilsOs__NS__isWebSQL) {
378
+ this.mode = 'backend-frontend(websql-electron)';
379
+ } else {
380
+ this.mode = 'backend-frontend(ipc-electron)';
381
+ }
382
+ }
383
+
384
+ // mode === undefined for TaonBaseContext => ok behavior
385
+ // console.log(`Mode for BE/FE communication: ${this.mode}`);
386
+ // if(!this.mode) {
387
+ // console.log(this.config)
388
+ // }
389
+
390
+ if (!this.mode && !this.config.abstract) {
391
+ const errMsg =
392
+ `You need to provide host property or ` +
393
+ `useIpcWhenElectron or mark it as abstract`;
394
+ Helpers__NS__error(
395
+ `[taon][Context=${this.contextName}]: ${errMsg}`,
396
+ false,
397
+ true,
398
+ );
399
+ //#region @backend
400
+ process.exit(1);
401
+ //#endregion
402
+ }
403
+ //#endregion
404
+
405
+ //#region resolve database config
406
+ if (this.config.database === true) {
407
+ this.logFramework &&
408
+ console.log(`
409
+
410
+ ASSIGNING AUTO GENERATED DATABASE CONFIG
411
+
412
+ `);
413
+ this.databaseConfig = this.getAutoGeneratedConfig();
414
+ } else if (___NS__isObject(this.config.database)) {
415
+ this.logFramework &&
416
+ console.log(`
417
+
418
+ OVERRIDE DATABASE CONFIG FROM CONFIGURATION
419
+
420
+ `);
421
+ this.databaseConfig = this.getAutoGeneratedConfig();
422
+ walk.Object(
423
+ this.config.database,
424
+ (value, lodashPath) => {
425
+ if (___NS__isNil(value) || ___NS__isFunction(value) || ___NS__isObject(value)) {
426
+ // skipping
427
+ } else {
428
+ this.logFramework &&
429
+ console.info(
430
+ `Overriding database config: ${lodashPath}=${value}`,
431
+ );
432
+ ___NS__set(this.databaseConfig, lodashPath, value);
433
+ }
434
+ },
435
+ {
436
+ walkGetters: false,
437
+ },
438
+ );
439
+ }
440
+ //#endregion
441
+
442
+ //#region resolve session
443
+ if (this.config.session) {
444
+ this.session = ___NS__cloneDeep(this.config.session);
445
+ const oneHour = 1000 * 60 * 60 * 1; // 24;
446
+ if (!this.session.cookieMaxAge) {
447
+ this.session.cookieMaxAge = oneHour;
448
+ }
449
+ // serever and browser cookie authentication
450
+ axios.defaults.withCredentials = true;
451
+ }
452
+ //#endregion
453
+
454
+ //#region prepare & gather all classes recursively
455
+ this.config.contexts = this.config.contexts || {};
456
+ this.config.entities = this.config.entities || {};
457
+ this.config.controllers = this.config.controllers || {};
458
+ this.config.repositories = this.config.repositories || {};
459
+ this.config.providers = this.config.providers || {};
460
+ this.config.subscribers = this.config.subscribers || {};
461
+ this.config.migrations = this.config.migrations || {};
462
+
463
+ this.config.entities = {
464
+ ...(await this.getRecrusiveClassesfromContextsObj(
465
+ Models__NS__ClassType.ENTITY,
466
+ )),
467
+ ...this.config.entities,
468
+ };
469
+
470
+ this.config.controllers = {
471
+ ...(await this.getRecrusiveClassesfromContextsObj(
472
+ Models__NS__ClassType.CONTROLLER,
473
+ )),
474
+ ...this.config.controllers,
475
+ };
476
+
477
+ this.config.providers = {
478
+ ...(await this.getRecrusiveClassesfromContextsObj(
479
+ Models__NS__ClassType.PROVIDER,
480
+ )),
481
+ ...this.config.providers,
482
+ };
483
+
484
+ this.config.middlewares = {
485
+ ...(await this.getRecrusiveClassesfromContextsObj(
486
+ Models__NS__ClassType.MIDDLEWARE,
487
+ )),
488
+ ...this.config.middlewares,
489
+ };
490
+
491
+ this.config.subscribers = {
492
+ ...(await this.getRecrusiveClassesfromContextsObj(
493
+ Models__NS__ClassType.SUBSCRIBER,
494
+ )),
495
+ ...this.config.subscribers,
496
+ };
497
+
498
+ this.config.repositories = {
499
+ ...(await this.getRecrusiveClassesfromContextsObj(
500
+ Models__NS__ClassType.REPOSITORY,
501
+ )),
502
+ ...this.config.repositories,
503
+ };
504
+
505
+ this.config.migrations = {
506
+ ...(await this.getRecrusiveClassesfromContextsObj(
507
+ Models__NS__ClassType.MIGRATION,
508
+ )),
509
+ ...this.config.migrations,
510
+ };
511
+
512
+ // console.log(this.config);
513
+ // debugger;
514
+ //#endregion
515
+
516
+ //#region prepare classes instances/functions clones
517
+ this.config.controllers = this.cloneClassesObjWithNewMetadata({
518
+ classesInput: this.config.controllers,
519
+ config: this.config,
520
+ ctx: this,
521
+ classType: Models__NS__ClassType.CONTROLLER,
522
+ });
523
+ this.config.repositories = this.cloneClassesObjWithNewMetadata({
524
+ classesInput: this.config.repositories,
525
+ config: this.config,
526
+ ctx: this,
527
+ classType: Models__NS__ClassType.REPOSITORY,
528
+ });
529
+ this.config.providers = this.cloneClassesObjWithNewMetadata({
530
+ classesInput: this.config.providers,
531
+ config: this.config,
532
+ ctx: this,
533
+ classType: Models__NS__ClassType.PROVIDER,
534
+ });
535
+ this.config.middlewares = this.cloneClassesObjWithNewMetadata({
536
+ classesInput: this.config.middlewares,
537
+ config: this.config,
538
+ ctx: this,
539
+ classType: Models__NS__ClassType.MIDDLEWARE,
540
+ });
541
+
542
+ this.config.subscribers = this.cloneClassesObjWithNewMetadata({
543
+ classesInput: this.config.subscribers,
544
+ config: this.config,
545
+ ctx: this,
546
+ classType: Models__NS__ClassType.SUBSCRIBER,
547
+ });
548
+
549
+ this.config.migrations = this.cloneClassesObjWithNewMetadata({
550
+ classesInput: this.config.migrations,
551
+ config: this.config,
552
+ ctx: this,
553
+ classType: Models__NS__ClassType.MIGRATION,
554
+ });
555
+ //#endregion
556
+
557
+ //#region prepare instances
558
+ for (const classTypeName of this.injectableTypesfromContexts) {
559
+ this.classInstancesByNameObj[classTypeName] = {};
560
+ this.objWithClassesInstancesArr[classTypeName] = [];
561
+ }
562
+
563
+ for (const classTypeName of this.injectableTypesfromContexts) {
564
+ await this.createInstances(
565
+ this.config[Models__NS__ClassTypeKey[classTypeName]],
566
+ classTypeName,
567
+ );
568
+ }
569
+ //#endregion
570
+
571
+ if (!this.isRunOrRevertOnlyMigrationAppStart) {
572
+ //#region prepares server
573
+ if (this.mode === 'backend-frontend(tcp+udp)' && !this.config.abstract) {
574
+ //#region @backend
575
+ this.expressApp = express();
576
+
577
+ if (process.env.NODE_ENV === 'production') {
578
+ this.expressApp.set('trust proxy', 1);
579
+ }
580
+
581
+ await this.initBackendMiddlewares();
582
+ await this.initCustomBackendMiddlewares();
583
+ const shouldStartHttpsSecureServer =
584
+ this.isHttpServer && !this.isRunningInsideDocker;
585
+ this.logFramework &&
586
+ Helpers__NS__info(`
587
+
588
+ Starting server ${
589
+ shouldStartHttpsSecureServer ? 'with' : 'without'
590
+ } HTTPS secure server
591
+
592
+ `);
593
+ this.serverTcpUdp = shouldStartHttpsSecureServer
594
+ ? new https.Server(
595
+ {
596
+ key: this.config.https?.key,
597
+ cert: this.config.https?.cert,
598
+ },
599
+ this.expressApp,
600
+ )
601
+ : new http.Server(this.expressApp);
602
+ this.publicAssets.forEach(asset => {
603
+ this.expressApp.use(
604
+ asset.serverPath,
605
+ express.static(asset.locationOnDisk),
606
+ );
607
+ });
608
+ //#endregion
609
+
610
+ await this.initCustomClientMiddlewares();
611
+ }
612
+ //#endregion
613
+
614
+ //#region prepare realtime
615
+ if (!this.config.abstract) {
616
+ this.disabledRealtime = this.config.disabledRealtime;
617
+ if (!this.host) {
618
+ throw `
619
+
620
+ host is required for context initialization..
621
+ (Or maybe you forgot mark ${this.config.contextName} context as abstract?)
622
+
623
+ `;
624
+ }
625
+
626
+ //#region @backend
627
+ // if (UtilsOs__NS__isRunningInCliMode() && !___NS__isNil(this.config.disabledRealtime)) {
628
+ // // TODO for now...
629
+ // Helpers__NS__logInfo(`Realtime disable on backend for cli mode`);
630
+ // this.disabledRealtime = true;
631
+ // } else {
632
+ // Helpers__NS__logInfo(`Realtime enabled on backend`);
633
+ // }
634
+ //#endregion
635
+
636
+ this.logRealtime &&
637
+ Helpers__NS__info(
638
+ `[ctx=${this.contextName}] Init Realtime for ${this.mode}`,
639
+ );
640
+
641
+ this.realtime = new RealtimeCore(this);
642
+ }
643
+ //#endregion
644
+ }
645
+
646
+ //#region show context info
647
+ // console.log({ ref })
648
+ if (this.config.abstract) {
649
+ this.logFramework &&
650
+ Helpers__NS__info(
651
+ `[taon] Create abstract context: ${this.config.contextName}`,
652
+ );
653
+ } else {
654
+ if (this.isRemoteHost) {
655
+ this.logFramework &&
656
+ Helpers__NS__info(
657
+ `[taon] Create context for remote host: ${this.config.host}`,
658
+ );
659
+ } else {
660
+ this.logFramework &&
661
+ Helpers__NS__info(`[taon] Create context for host: ${this.config.host}`);
662
+ }
663
+ }
664
+ //#endregion
665
+
666
+ // update first exposed config
667
+ Object.keys(this.config).forEach(key => {
668
+ this.originalConfig[key] = this.config[key];
669
+ });
670
+ }
671
+ //#endregion
672
+
673
+ //#region methods & getters / get auto generated config
674
+ private getAutoGeneratedConfig(): Models__NS__DatabaseConfigTypeOrm {
675
+ this.logFramework &&
676
+ console.log(`
677
+
678
+
679
+ IS RUNNING IN DOCKER: ${this.isRunningInsideDocker}
680
+
681
+ `);
682
+ //#region @websqlFunc
683
+ let databaseConfig: Models__NS__DatabaseConfig = Models__NS__DatabaseConfig.from({});
684
+ const tcpUdpDatabaseSqliteRelativeFileLocation = `${Models__NS__DatabasesFolder}/db-${this.contextName}.sqlite`;
685
+ if (this.isRunningInsideDocker) {
686
+ if (this.USE_MARIADB_MYSQL_IN_DOCKER) {
687
+ // Helpers__NS__info('Running in docker, using in mysql database');
688
+ // // TODO auto resolve database config in docker
689
+ // databaseConfig = Models__NS__DatabaseConfig.from({
690
+ // database: `db-${this.contextName}.sqlite`,
691
+ // type: 'mysql',
692
+ // recreateMode: 'PRESERVE_DATA+MIGRATIONS',
693
+ // logging: this.logDb,
694
+ // databasePort: 3306,
695
+ // databaseHost: 'localhost',
696
+ // databaseUsername: 'root',
697
+ // databasePassword: 'admin',
698
+ // });
699
+ } else {
700
+ // TOOD @LAST for now.. just use sqljs in docker
701
+ this.logFramework &&
702
+ console.log(`
703
+
704
+ USING GENERATED CONFIG FOR SQLJS IN DOCKER
705
+
706
+ `);
707
+
708
+ //#region @backend
709
+ const locationOfTheDatabase = crossPlatformPath([
710
+ process.cwd(),
711
+ `db-${this.contextName}.sqlite`,
712
+ ]);
713
+ //#endregion
714
+
715
+ databaseConfig = databaseConfig = Models__NS__DatabaseConfig.from({
716
+ location: tcpUdpDatabaseSqliteRelativeFileLocation,
717
+ type: 'sqljs',
718
+ useLocalForage: false,
719
+ recreateMode: 'PRESERVE_DATA+MIGRATIONS',
720
+ logging: true,
721
+ });
722
+
723
+ //#region @backend
724
+ if (!fse.existsSync(locationOfTheDatabase)) {
725
+ databaseConfig.recreateMode = 'DROP_DB+MIGRATIONS';
726
+ }
727
+ // TODO @LAST add same thing for mariadb/mysql
728
+ this.logFramework &&
729
+ console.log(`
730
+ location of database: ${locationOfTheDatabase}
731
+ db file exists: ${fse.existsSync(locationOfTheDatabase)}
732
+ synchronize: ${databaseConfig.synchronize}
733
+ dropSchema: ${databaseConfig.dropSchema}
734
+ `);
735
+ //#endregion
736
+ }
737
+ } else {
738
+ //#region auto resolve db config
739
+ this.logFramework &&
740
+ Helpers__NS__info(
741
+ `[taon][database] Automatically resolving database config for mode ${this.mode}`,
742
+ );
743
+ switch (this.mode) {
744
+ //#region resolve database config for backend-frontend(ipc-electron)
745
+ case 'backend-frontend(ipc-electron)':
746
+ let dbLocationInOs: string;
747
+ //#region @backend
748
+ if (UtilsOs__NS__isElectron) {
749
+ dbLocationInOs = crossPlatformPath([
750
+ UtilsOs__NS__getRealHomeDir(),
751
+ `.taon/databases-for-electron-apps/${
752
+ this.appId || ___NS__snakeCase(process.cwd()).replace(/\_/, '.')
753
+ }/${this.contextName}.sqlite`,
754
+ ]);
755
+ if (!Helpers__NS__exists(path.dirname(dbLocationInOs))) {
756
+ Helpers__NS__mkdirp(path.dirname(dbLocationInOs));
757
+ }
758
+ }
759
+ //#endregion
760
+
761
+ databaseConfig = Models__NS__DatabaseConfig.from({
762
+ location: UtilsOs__NS__isElectron
763
+ ? dbLocationInOs
764
+ : `db-${this.contextName}.sqlite`,
765
+ type: 'sqljs',
766
+ recreateMode: 'DROP_DB+MIGRATIONS',
767
+ logging: this.logDb,
768
+ });
769
+ break;
770
+ //#endregion
771
+
772
+ //#region resolve database config for mode backend-frontend(websql)
773
+ case 'backend-frontend(websql-electron)':
774
+ case 'backend-frontend(websql)':
775
+ let keepWebsqlDbDataAfterReload = false;
776
+ /* */
777
+ /* */
778
+ /* */
779
+
780
+
781
+ databaseConfig = databaseConfig = Models__NS__DatabaseConfig.from({
782
+ location: `db-${this.contextName}.sqlite`,
783
+ type: 'sqljs',
784
+ useLocalForage: true, // !!window['localforage'], // TODO this need to be checked in runtime
785
+ recreateMode: keepWebsqlDbDataAfterReload
786
+ ? 'PRESERVE_DATA+MIGRATIONS'
787
+ : 'DROP_DB+MIGRATIONS',
788
+ logging: this.logDb,
789
+ });
790
+ break;
791
+ //#endregion
792
+
793
+ //#region resolve database config for mode backend-frontend(tcp+udp)
794
+ case 'backend-frontend(tcp+udp)':
795
+ databaseConfig = Models__NS__DatabaseConfig.from({
796
+ database: `context-db-${this.contextName}`,
797
+ location: tcpUdpDatabaseSqliteRelativeFileLocation,
798
+ type: 'sqljs',
799
+ recreateMode: 'DROP_DB+MIGRATIONS',
800
+ logging: this.logDb,
801
+ });
802
+ break;
803
+ //#endregion
804
+ }
805
+ //#endregion
806
+ }
807
+ return databaseConfig.databaseConfigTypeORM;
808
+ //#endregion
809
+ }
810
+ //#endregion
811
+
812
+ //#region methods & getters / start server
813
+ async startServer(): Promise<void> {
814
+ //#region @backendFunc
815
+ if (this.isRemoteHost || this.isRunOrRevertOnlyMigrationAppStart) {
816
+ return;
817
+ }
818
+ if (this.mode === 'backend-frontend(tcp+udp)') {
819
+ return await new Promise(resolve => {
820
+ if (this.isRunningInsideDocker) {
821
+ // this.displayRoutes(this.expressApp);
822
+ this.serverTcpUdp.listen(Number(this.uriPort), '0.0.0.0', () => {
823
+ this.logFramework &&
824
+ Helpers__NS__log(
825
+ `[ctx=${this.contextName}] Express server (inside docker) started 0.0.0.0:${this.uriPort}`,
826
+ );
827
+ this.logFramework &&
828
+ Helpers__NS__log(`[taon][express-server]listening on port: ${this.uriPort}, hostname: ${this.uriPathname},
829
+ address: ${this.uriProtocol}//localhost:${this.uriPort}${this.uriPathname}
830
+ ExpressJS mode: ${this.expressApp.settings.env}
831
+ `);
832
+ resolve(void 0);
833
+ });
834
+ } else {
835
+ // this.displayRoutes(this.expressApp);
836
+ this.serverTcpUdp.listen(Number(this.uriPort), () => {
837
+ this.logFramework &&
838
+ Helpers__NS__log(
839
+ `[ctx=${this.contextName}] Express server (inside nodejs app) started on localhost:${this.uriPort}`,
840
+ );
841
+ this.logFramework &&
842
+ Helpers__NS__log(`[taon][express-server]listening on port: ${this.uriPort}, hostname: ${this.uriPathname},
843
+ address: ${this.uriProtocol}//localhost:${this.uriPort}${this.uriPathname}
844
+ expressJS mode: ${this.expressApp.settings.env}
845
+ `);
846
+ resolve(void 0);
847
+ });
848
+ }
849
+ });
850
+ } else {
851
+ this.logFramework &&
852
+ Helpers__NS__info('Ipc communication enable instead tcp/upd');
853
+ }
854
+ //#endregion
855
+ }
856
+ //#endregion
857
+
858
+ //#region methods & getters / display express routes
859
+ displayRoutes(app) {
860
+ //#region @backend
861
+ const routes = [];
862
+
863
+ app._router?.stack.forEach(function (middleware) {
864
+ if (middleware.route) {
865
+ // routes registered directly on the app
866
+ const methods = [];
867
+ for (let method in middleware.route.methods) {
868
+ if (middleware.route.methods[method]) {
869
+ methods.push(method.toUpperCase());
870
+ }
871
+ }
872
+ routes.push({ path: middleware.route.path, methods: methods });
873
+ } else if (middleware.name === 'router') {
874
+ // router middleware
875
+ middleware.handle.stack.forEach(function (handler) {
876
+ const methods = [];
877
+ for (let method in handler.route.methods) {
878
+ if (handler.route.methods[method]) {
879
+ methods.push(method.toUpperCase());
880
+ }
881
+ }
882
+ routes.push({ path: handler.route.path, methods: methods });
883
+ });
884
+ }
885
+ });
886
+
887
+ console.log(routes);
888
+ //#endregion
889
+ }
890
+ //#endregion
891
+
892
+ //#region methods & getters / mode allows database creation
893
+ get modeAllowsDatabaseCreation() {
894
+ return (
895
+ this.mode === 'backend-frontend(tcp+udp)' ||
896
+ this.mode === 'backend-frontend(websql)' ||
897
+ this.mode === 'backend-frontend(ipc-electron)'
898
+ );
899
+ }
900
+ //#endregion
901
+
902
+ //#region methods & getters / clone class
903
+ private cloneClassWithNewMetadata = <
904
+ T extends { new (...args: any[]): any },
905
+ >({
906
+ TaonBaseClass,
907
+ className,
908
+ config,
909
+ ctx,
910
+ classType,
911
+ }: {
912
+ TaonBaseClass: T;
913
+ className: string;
914
+ config: Models__NS__ContextOptions<any, any, any, any, any, any, any, any>;
915
+ ctx: EndpointContext;
916
+ classType: Models__NS__ClassType;
917
+ }): T => {
918
+ // Return a new class that extends the base class
919
+ const cloneClass = () => {
920
+ if (
921
+ TaonBaseClass[Symbols__NS__fullClassNameStaticProperty] ===
922
+ `${ctx.contextName}.${className}`
923
+ ) {
924
+ return TaonBaseClass;
925
+ }
926
+ return class extends TaonBaseClass {
927
+ // static ['_'] = TaonBaseClass['_'];
928
+
929
+ // @ts-ignore
930
+ static [Symbols__NS__orignalClass] = TaonBaseClass;
931
+
932
+ // @ts-ignore
933
+ static [Symbols__NS__fullClassNameStaticProperty] = `${ctx.contextName}.${className}`;
934
+
935
+ // @ts-ignore
936
+ static [Symbols__NS__classNameStaticProperty] = className;
937
+
938
+ static [Symbols__NS__ctxInClassOrClassObj] = ctx;
939
+
940
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
941
+ static __getFullPathForClass__(arr = []) {
942
+ const name = this[Symbols__NS__fullClassNameStaticProperty];
943
+ arr.push(name);
944
+ // @ts-ignore
945
+ if (
946
+ this[Symbols__NS__orignalClass] && // @ts-ignore
947
+ this[Symbols__NS__orignalClass].__getFullPathForClass__
948
+ ) {
949
+ // @ts-ignore
950
+ this[Symbols__NS__orignalClass].__getFullPathForClass__(arr);
951
+ }
952
+ return arr.join('/');
953
+ }
954
+
955
+ static get fullPathForClass(): string {
956
+ return this.__getFullPathForClass__();
957
+ }
958
+
959
+ [Symbols__NS__ctxInClassOrClassObj] = ctx;
960
+ // You can override prototype properties or methods here if needed
961
+ // static properties override allowed
962
+ };
963
+ };
964
+
965
+ const cloneClassFunction = cloneClass();
966
+
967
+ //#region gather all instances for all contexts
968
+ // TODO this is not needed anymore - for typeorm I use normal entities
969
+ // this thinng belowe is nice for debugging purpose
970
+ // if (___NS__isUndefined(cloneClassFunction[Symbols__NS__orignalClassClonesObj])) {
971
+ // cloneClassFunction[Symbols__NS__orignalClassClonesObj] = {};
972
+ // }
973
+ // if (___NS__isUndefined(TaonBaseClass[Symbols__NS__orignalClassClonesObj])) {
974
+ // TaonBaseClass[Symbols__NS__orignalClassClonesObj] = {};
975
+ // }
976
+ // const all = {
977
+ // ...TaonBaseClass[Symbols__NS__orignalClassClonesObj],
978
+ // ...cloneClassFunction[Symbols__NS__orignalClassClonesObj],
979
+ // };
980
+ // all[ctx.contextName] = cloneClassFunction;
981
+ // cloneClassFunction[Symbols__NS__orignalClassClonesObj] = all;
982
+ // TaonBaseClass[Symbols__NS__orignalClassClonesObj] = all;
983
+ //#endregion
984
+
985
+ return cloneClassFunction;
986
+ };
987
+
988
+ //#endregion
989
+
990
+ //#region methods & getters / clone classes obj with new metadata
991
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
992
+ private cloneClassesObjWithNewMetadata = ({
993
+ classesInput,
994
+ config,
995
+ ctx,
996
+ classType,
997
+ }: {
998
+ classesInput: any;
999
+ config: Models__NS__ContextOptions<any, any, any, any, any, any, any, any>;
1000
+ ctx: EndpointContext;
1001
+ classType: Models__NS__ClassType;
1002
+ }) => {
1003
+ const classes = {};
1004
+ // console.log(Object.keys(classesInput))
1005
+ for (const key of Object.keys(classesInput || {})) {
1006
+ const TaonBaseClass = classesInput[key];
1007
+
1008
+ if (!TaonBaseClass) {
1009
+ Helpers__NS__error(`Class ${key} is not defined in context ${ctx.contextName}
1010
+
1011
+ Please check if you have correct import in context file
1012
+
1013
+ `);
1014
+ }
1015
+
1016
+ var className = Reflect.getMetadata(
1017
+ Symbols__NS__metadata.className,
1018
+ TaonBaseClass,
1019
+ );
1020
+
1021
+ // console.log('Metadata className', className, TaonBaseClass);
1022
+ // if (!className) {
1023
+ // console.warn(`Please provide className for ${TaonBaseClass.name} class`);
1024
+ // }
1025
+ className = className || key;
1026
+ TaonBaseClass[Symbols__NS__classNameStaticProperty] = className;
1027
+
1028
+ const clonedClass = this.cloneClassWithNewMetadata({
1029
+ TaonBaseClass,
1030
+ className,
1031
+ config,
1032
+ ctx,
1033
+ classType,
1034
+ });
1035
+ classes[className] = clonedClass;
1036
+ }
1037
+ return classes;
1038
+ };
1039
+ //#endregion
1040
+
1041
+ //#region methods & getters / get recursive classes from contexts
1042
+ private async getRecrusiveClassesfromContextsObj(
1043
+ classType: Models__NS__ClassType,
1044
+ ) {
1045
+ const arr = await this.getRecrusiveClassesfromContexts(classType);
1046
+ return arr.reduce((acc, c) => {
1047
+ acc[ClassHelpers__NS__getName(c)] = c;
1048
+ return acc;
1049
+ }, {});
1050
+ }
1051
+
1052
+ private async getRecrusiveClassesfromContexts(
1053
+ classType: Models__NS__ClassType,
1054
+ arr = [],
1055
+ ) {
1056
+ const contexts = Object.values(this.config.contexts || {}) as ReturnType<
1057
+ typeof createContext
1058
+ >[];
1059
+ // console.log({
1060
+ // contexts,
1061
+ // });
1062
+ for (const ctx of contexts) {
1063
+ // console.log(`STARTING ${ctx.contextName}`);
1064
+ const ref = await ctx.__ref();
1065
+ // console.log(`CTX FROM ${ctx.contextName}`, ref.contextName);
1066
+ const classesInput = ref.getClassFunBy(classType);
1067
+ // console.log(`${ref.contextName} - ${classType}`, { classesInput });
1068
+
1069
+ const clonedClasses = Object.values(
1070
+ this.cloneClassesObjWithNewMetadata({
1071
+ classesInput,
1072
+ config: this.config,
1073
+ ctx: this,
1074
+ classType,
1075
+ }),
1076
+ );
1077
+ // console.log(`${classType} clonedClasses`, clonedClasses);
1078
+ clonedClasses.forEach(c => arr.push(c));
1079
+
1080
+ await ref.getRecrusiveClassesfromContexts(classType, arr);
1081
+ }
1082
+ return arr as Function[];
1083
+ }
1084
+ //#endregion
1085
+
1086
+ //#region methods & getters / get class instances by class type
1087
+ getClassInstanceObjBy(classType: Models__NS__ClassType): any {
1088
+ return this.classInstancesByNameObj[classType];
1089
+ }
1090
+ //#endregion
1091
+
1092
+ //#region methods & getters / get class instances arr
1093
+ private getClassesInstancesArrBy(classType: Models__NS__ClassType): any[] {
1094
+ return this.objWithClassesInstancesArr[classType];
1095
+ }
1096
+ //#endregion
1097
+
1098
+ //#region methods & getters / inject
1099
+ inject<T>(
1100
+ ctor: new (...args: any[]) => T,
1101
+ options: {
1102
+ localInstance?: boolean;
1103
+ contextClassInstance?: TaonBaseInjector;
1104
+ locaInstanceConstructorArgs?: ConstructorParameters<typeof ctor>;
1105
+ parentInstanceThatWillGetInjectedStuff: object;
1106
+ },
1107
+ ): T {
1108
+ const className = ClassHelpers__NS__getName(ctor);
1109
+
1110
+ const locaInstanceConstructorArgs =
1111
+ options.locaInstanceConstructorArgs || [];
1112
+
1113
+ if (this.isCLassType(Models__NS__ClassType.REPOSITORY, ctor)) {
1114
+ options.localInstance = true;
1115
+ }
1116
+
1117
+ if (options?.localInstance) {
1118
+ const ctxClassFn = this.getClassFunByClassName(className);
1119
+ let entityName: string = '';
1120
+
1121
+ // entity thing is only for repositories local repositories
1122
+ // if (className === 'TaonBaseRepository') {
1123
+ const entityFn = ___NS__first(locaInstanceConstructorArgs);
1124
+ const entity = entityFn && entityFn();
1125
+ entityName = (entity && ClassHelpers__NS__getName(entity)) || '';
1126
+ // console.log(`entityName `, entityName);
1127
+ // }
1128
+
1129
+ if (!options.contextClassInstance[this.localInstaceObjSymbol]) {
1130
+ options.contextClassInstance[this.localInstaceObjSymbol] = {};
1131
+ }
1132
+ const instanceKey = className + (entityName ? `.${entityName}` : '');
1133
+
1134
+ const existed =
1135
+ options.contextClassInstance[this.localInstaceObjSymbol][instanceKey];
1136
+
1137
+ if (existed) {
1138
+ // console.log(
1139
+ // `EXISTED ${ClassHelpers__NS__getName(options.parentInstanceThatWillGetInjectedStuff)} Inject ${className} instanceKey "${instanceKey}"`,
1140
+ // );
1141
+ return existed;
1142
+ }
1143
+
1144
+ // console.log(
1145
+ // `NEW ${ClassHelpers__NS__getName(options.parentInstanceThatWillGetInjectedStuff)} Inject ${className} instanceKey "${instanceKey}"`,
1146
+ // );
1147
+
1148
+ if (!ctxClassFn) {
1149
+ throw new Error(`Not able to inject "${className}" inside context "${this.contextName}"
1150
+
1151
+ Make sure they share the same context or import context where "${className}" is defined.
1152
+
1153
+ `);
1154
+ }
1155
+
1156
+ const injectedInstance = new (ctxClassFn as any)(
1157
+ ...locaInstanceConstructorArgs,
1158
+ );
1159
+ options.contextClassInstance[this.localInstaceObjSymbol][instanceKey] =
1160
+ injectedInstance;
1161
+ // console.log(`injectedInstance `, existed)
1162
+ return injectedInstance;
1163
+ }
1164
+
1165
+ const contextScopeInstance = this.allClassesInstances[className];
1166
+ // if (className === 'TopicController') {
1167
+ // debugger;
1168
+ // }
1169
+ return contextScopeInstance;
1170
+ }
1171
+
1172
+ /**
1173
+ * alias for inject
1174
+ */
1175
+ getInstanceBy<T>(ctor: new (...args: any[]) => T): T {
1176
+ // if (!!this.__contextForControllerInstanceAccess) {
1177
+ // const className = ClassHelpers__NS__getName(ctor);
1178
+ // const allControllers = this.getClassFunByArr(Models__NS__ClassType.CONTROLLER);
1179
+
1180
+ // // TODO QUICK_FIX cache controllers
1181
+ // for (const ctrl of allControllers) {
1182
+ // if (ClassHelpers__NS__getName(ctrl) === className) {
1183
+ // // console.log('injecting from contextForControllerInstanceAcesss', className);
1184
+ // return this.__contextForControllerInstanceAccess.inject(ctor, {
1185
+ // localInstance: false,
1186
+ // });
1187
+ // }
1188
+ // }
1189
+ // }
1190
+
1191
+ return this.inject(ctor, {
1192
+ localInstance: false,
1193
+ parentInstanceThatWillGetInjectedStuff: this,
1194
+ });
1195
+ }
1196
+ //#endregion
1197
+
1198
+ //#region methods & getters / check if context initialized
1199
+ checkIfContextInitialized() {
1200
+ if (___NS__isUndefined(this.config)) {
1201
+ throw new Error(`Please check if your context has been initialized.
1202
+
1203
+ // ...
1204
+ await Context.initialize();
1205
+ // ...
1206
+
1207
+
1208
+ `);
1209
+ }
1210
+ }
1211
+ //#endregion
1212
+
1213
+ //#region methods & getters / get class function by class type name
1214
+ getClassFunBy(classType: Models__NS__ClassType) {
1215
+ this.checkIfContextInitialized();
1216
+ switch (classType) {
1217
+ case Models__NS__ClassType.CONTROLLER:
1218
+ return this.config.controllers;
1219
+ case Models__NS__ClassType.ENTITY:
1220
+ return this.config.entities;
1221
+ case Models__NS__ClassType.PROVIDER:
1222
+ return this.config.providers;
1223
+ case Models__NS__ClassType.MIDDLEWARE:
1224
+ return this.config.middlewares;
1225
+ case Models__NS__ClassType.REPOSITORY:
1226
+ return this.config.repositories;
1227
+ case Models__NS__ClassType.SUBSCRIBER:
1228
+ return this.config.subscribers;
1229
+ case Models__NS__ClassType.MIGRATION:
1230
+ return this.config.migrations;
1231
+ }
1232
+ }
1233
+
1234
+ isCLassType(classType: Models__NS__ClassType, classFn: Function): boolean {
1235
+ return !!this.getClassFunBy(classType)[ClassHelpers__NS__getName(classFn)];
1236
+ }
1237
+
1238
+ /**
1239
+ * Only for injectable types
1240
+ * Only for classType: CONTROLLER, REPOSITORY, PROVIDER, MIDDLEWARES
1241
+ */
1242
+ getClassFunByClassName(className: string): Function {
1243
+ for (const classTypeName of this.allTypesfromContexts) {
1244
+ const classesForInjectableType =
1245
+ this.config[Models__NS__ClassTypeKey[classTypeName]];
1246
+
1247
+ if (classesForInjectableType[className]) {
1248
+ return classesForInjectableType[className];
1249
+ }
1250
+ }
1251
+ }
1252
+
1253
+ getClassFunByClass(classFunction: Function): Function {
1254
+ const className = ClassHelpers__NS__getName(classFunction);
1255
+ return this.getClassFunByClassName(className);
1256
+ }
1257
+
1258
+ getClassFunByArr(classType: Models__NS__ClassType) {
1259
+ return Object.values(this.getClassFunBy(classType) || {}) as Function[];
1260
+ }
1261
+ //#endregion
1262
+
1263
+ //#region methods & getters / create class instances
1264
+ private async createInstances(classes: any, classType: Models__NS__ClassType) {
1265
+ // const recrusiveValuesFromContext =
1266
+ // await this.getRecrusiveClassesfromContexts(classType);
1267
+ // console.log(this.config.contexts);
1268
+ // console.log('recrusiveValuesFromContext', recrusiveValuesFromContext);
1269
+
1270
+ for (const classFn of [
1271
+ // ...recrusiveValuesFromContext,
1272
+ ...Object.values(classes),
1273
+ ]) {
1274
+ const instance = DITaonContainer.resolve(classFn as any) as any;
1275
+ const classInstancesByNameObj = this.classInstancesByNameObj[classType];
1276
+ const className = ClassHelpers__NS__getName(classFn);
1277
+ // console.log({ classFn, classType, instance, place, className, 'classInstancesByNameObj': this.classInstancesByNameObj });
1278
+ classInstancesByNameObj[className] = instance;
1279
+ // update config
1280
+ this.config[Models__NS__ClassTypeKey[classType]][className] = classFn;
1281
+ this.objWithClassesInstancesArr[classType].push(instance);
1282
+ this.allClassesInstances[className] = instance;
1283
+ }
1284
+ }
1285
+ //#endregion
1286
+
1287
+ //#region methods & getters / init classes
1288
+ async initClasses(): Promise<void> {
1289
+ if (this.isRemoteHost) {
1290
+ return;
1291
+ }
1292
+
1293
+ //#region @websql
1294
+ for (const classFun of this.getClassFunByArr(
1295
+ Models__NS__ClassType.ENTITY,
1296
+ ) as any[]) {
1297
+ const repo = (await this.connection.getRepository(
1298
+ ClassHelpers__NS__getOrginalClass(classFun),
1299
+ )) as any;
1300
+ this.repos.set(ClassHelpers__NS__getName(classFun), repo);
1301
+ }
1302
+ //#endregion
1303
+
1304
+ for (const classTypeName of [
1305
+ Models__NS__ClassType.MIDDLEWARE,
1306
+ Models__NS__ClassType.PROVIDER,
1307
+ Models__NS__ClassType.REPOSITORY,
1308
+ Models__NS__ClassType.CONTROLLER,
1309
+ Models__NS__ClassType.ENTITY,
1310
+ Models__NS__ClassType.MIGRATION,
1311
+ ]) {
1312
+ //#region init class static _ property
1313
+ for (const classFun of this.getClassFunByArr(classTypeName) as any[]) {
1314
+ if (___NS__isFunction(classFun._)) {
1315
+ await classFun._();
1316
+ }
1317
+ }
1318
+ //#endregion
1319
+ }
1320
+
1321
+ for (const classTypeName of [
1322
+ Models__NS__ClassType.MIDDLEWARE,
1323
+ Models__NS__ClassType.PROVIDER,
1324
+ Models__NS__ClassType.REPOSITORY,
1325
+ Models__NS__ClassType.CONTROLLER,
1326
+ Models__NS__ClassType.MIGRATION,
1327
+ ]) {
1328
+ //#region init providers, repositories _ property
1329
+ // Helpers__NS__taskStarted(
1330
+ // `[taon] REINITING _ INS FN ${classTypeName} ${this.contextName} STARTED`,
1331
+ // );
1332
+ for (const ctrl of this.getClassesInstancesArrBy(classTypeName)) {
1333
+ if (___NS__isFunction(ctrl._)) {
1334
+ await ctrl._();
1335
+ }
1336
+ }
1337
+ // Helpers__NS__taskStarted(
1338
+ // `[taon] REINITING _ INS FN ${classTypeName} ${this.contextName} DONE`,
1339
+ // );
1340
+ //#endregion
1341
+ }
1342
+ }
1343
+ //#endregion
1344
+
1345
+ //#region methods & getters / is active on
1346
+ isActiveOn(classInstance: object): boolean {
1347
+ let contextRef: EndpointContext =
1348
+ classInstance[Symbols__NS__ctxInClassOrClassObj];
1349
+ return this === contextRef;
1350
+ }
1351
+ //#endregion
1352
+
1353
+ //#region methods & getters / uri
1354
+ get frontendHostUri() {
1355
+ const url = this.config?.frontendHost?.startsWith('http')
1356
+ ? this.config.frontendHost
1357
+ : `${globalThis?.location?.protocol || 'http:'}//${
1358
+ this.config?.frontendHost
1359
+ }`;
1360
+ const uri = new URL(url.replace(/\/$/, ''));
1361
+ return uri;
1362
+ }
1363
+
1364
+ get uri(): URL | undefined {
1365
+ const url = this.host ? new URL(this.host) : void 0;
1366
+ return url;
1367
+ }
1368
+ //#endregion
1369
+
1370
+ //#region methods & getters / host uri protocol
1371
+ get uriProtocol(): string | undefined {
1372
+ return this.uri?.protocol;
1373
+ }
1374
+ //#endregion
1375
+
1376
+ //#region methods & getters / host uri origin
1377
+ /**
1378
+ * Examples
1379
+ * http://localhost:3000
1380
+ * https://localhost (from localhost:80) *
1381
+ */
1382
+ get uriOrigin(): string | undefined {
1383
+ return this.uri?.origin;
1384
+ }
1385
+ //#endregion
1386
+
1387
+ //#region methods & getters / host uri pathname
1388
+ /**
1389
+ * Exampels
1390
+ * http://localhost:3000/path/to/somewhere
1391
+ * https://localhost/path/to/somewhere (from localhost:80)
1392
+ */
1393
+ // get uriOriginWithPathname(): string | undefined {
1394
+ // return this.uri?.origin
1395
+ // ? this.uri?.origin + this.uriPathnameOrNothingIfRoot.replace(/\/$/, '')
1396
+ // : undefined;
1397
+ // }
1398
+
1399
+ get uriPathname(): string | undefined {
1400
+ return this.uri?.pathname;
1401
+ }
1402
+ //#endregion
1403
+
1404
+ //#region methods & getters / uri pathname or nothing if root
1405
+ /**
1406
+ * Examples
1407
+ * http://localhost:3000/path/to/somewhere -> '/path/to/somewhere'
1408
+ * http://localhost:3000 -> '' #
1409
+ * https://localhost/path/to/ -> '/path/to/somewhere' # remove last slash
1410
+ */
1411
+ get uriPathnameOrNothingIfRoot(): string {
1412
+ const isNonRootProperPathName =
1413
+ this.uri?.pathname && this.uri.pathname !== '/';
1414
+ return isNonRootProperPathName ? this.uri.pathname.replace(/\/$/, '') : '';
1415
+ }
1416
+ //#endregion
1417
+
1418
+ //#region methods & getters / port from uri
1419
+ get uriPort(): string | undefined {
1420
+ if (!this.uri?.origin?.includes('localhost')) {
1421
+ return this.config?.hostPortNumber?.toString();
1422
+ }
1423
+ return this.uri?.port;
1424
+ }
1425
+ // TODO do i need 2 getters for port?
1426
+
1427
+ /**
1428
+ * Port from uri as number
1429
+ * @returns {Number | undefined}
1430
+ */
1431
+ get port(): Number | undefined {
1432
+ return this.uri?.port ? Number(this.uriPort) : undefined;
1433
+ }
1434
+ //#endregion
1435
+
1436
+ //#region methods & getters / is https server
1437
+ get isHttpServer() {
1438
+ return this.uriProtocol === 'https:';
1439
+ }
1440
+ //#endregion
1441
+
1442
+ //#region methods & getters / is remote host
1443
+ /**
1444
+ * Check if context is for remote only
1445
+ */
1446
+ public get isRemoteHost(): boolean {
1447
+ return !!this.cloneOptions?.useAsRemoteContext;
1448
+ }
1449
+ //#endregion
1450
+
1451
+ //#region methods & getters / context name
1452
+ /**
1453
+ * ipc/udp needs this
1454
+ */
1455
+ public get contextName(): string {
1456
+ // console.log(this.originalConfig);
1457
+ return this.config?.contextName || this.originalConfig?.contextName;
1458
+ }
1459
+ //#endregion
1460
+
1461
+ //#region methods & getters / context name for communication
1462
+ /**
1463
+ * ipc/udp needs this
1464
+ */
1465
+ public get contextNameForCommunication(): string {
1466
+ let contextName = this.contextName;
1467
+ if (this.isRemoteHost) {
1468
+ if (this.sourceContext?.contextName) {
1469
+ contextName = this.sourceContext?.contextName;
1470
+ } else {
1471
+ // console.log(
1472
+ // `CANT GET SOURCE CONTEXT NAME FOR REMOTE CONTEXT ${this.contextName}`,
1473
+ // );
1474
+ }
1475
+ }
1476
+ return contextName;
1477
+ }
1478
+ //#endregion
1479
+
1480
+ //#region methods & getters / get context type
1481
+ /**
1482
+ * Check context type
1483
+ */
1484
+ public get contextType(): 'normal' | 'remote' | 'abstract' | 'invalid' {
1485
+ if (this.config.abstract) {
1486
+ return 'abstract';
1487
+ }
1488
+ if (this.host) {
1489
+ return this.isRemoteHost ? 'remote' : 'normal';
1490
+ }
1491
+ return 'invalid';
1492
+ }
1493
+ //#endregion
1494
+
1495
+ //#region methods & getters / current working directory
1496
+ public get cwd(): string {
1497
+ return this.config.cwd || process.cwd();
1498
+ }
1499
+ //#endregion
1500
+
1501
+ //#region methods & getters / active context
1502
+ public get activeContext(): string | null {
1503
+ return this.config.activeContext || null;
1504
+ }
1505
+ //#endregion
1506
+
1507
+ //#region methods & getters / app id
1508
+ public get appId(): string {
1509
+ return this.config.appId;
1510
+ }
1511
+ //#endregion
1512
+
1513
+ //#region methods & getters / public assets
1514
+ public get publicAssets() {
1515
+ return this.config?.publicAssets || [];
1516
+ }
1517
+ //#endregion
1518
+
1519
+ //#region methods & getters / is production mode
1520
+ get isProductionMode() {
1521
+ return this.config.productionMode;
1522
+ }
1523
+ //#endregion
1524
+
1525
+ //#region methods & getters / host
1526
+ get host(): string | undefined {
1527
+ return this.config.host;
1528
+ }
1529
+ //#endregion
1530
+
1531
+ //#region methods & getters / origin
1532
+ get origin(): string | undefined {
1533
+ return this.uri?.origin;
1534
+ }
1535
+ //#endregion
1536
+
1537
+ //#region methods & getters / init subscribers
1538
+ async initSubscribers() {
1539
+ //#region @websqlFunc
1540
+ if (this.isRemoteHost) {
1541
+ return;
1542
+ }
1543
+ const subscriberClasses = this.getClassFunByArr(
1544
+ Models__NS__ClassType.SUBSCRIBER,
1545
+ );
1546
+ for (const subscriberClassFn of subscriberClasses) {
1547
+ const options = Reflect.getMetadata(
1548
+ Symbols__NS__metadata.options.subscriber,
1549
+ subscriberClassFn,
1550
+ ) as TaonSubscriberOptions;
1551
+ // console.log('subscriber options', options);
1552
+ // const nameForSubscriber = ClassHelpers__NS__getName(subscriber);
1553
+ EventSubscriber()(subscriberClassFn);
1554
+ }
1555
+ //#endregion
1556
+ }
1557
+ //#endregion
1558
+
1559
+ //#region methods & getters / init entities
1560
+ async initEntities() {
1561
+ //#region @websql
1562
+ if (this.isRemoteHost) {
1563
+ return;
1564
+ }
1565
+ const entities = this.getClassFunByArr(Models__NS__ClassType.ENTITY);
1566
+
1567
+ for (const entity of entities) {
1568
+ const options = Reflect.getMetadata(
1569
+ Symbols__NS__metadata.options.entity,
1570
+ entity,
1571
+ ) as TaonEntityOptions;
1572
+ const createTable = ___NS__isUndefined(options.createTable)
1573
+ ? true
1574
+ : options.createTable;
1575
+
1576
+ const nameForEntity = ClassHelpers__NS__getName(entity);
1577
+
1578
+ if (createTable) {
1579
+ this.logDb &&
1580
+ console.info(
1581
+ `[taon][typeorm] create table for entity "${nameForEntity}" ? '${createTable}'`,
1582
+ );
1583
+ // console.log('TypeormEntity', { TypeormEntity });
1584
+ TypeormEntity(nameForEntity)(entity);
1585
+ } else {
1586
+ this.logDb &&
1587
+ console.info(
1588
+ `[taon][typeorm] create table for entity "${nameForEntity}" ? '${createTable}'`,
1589
+ );
1590
+ }
1591
+ }
1592
+ //#endregion
1593
+ }
1594
+
1595
+ //#endregion
1596
+
1597
+ //#region methods & getters / destroy
1598
+ async destroy(): Promise<void> {
1599
+ //#region @websqlFunc
1600
+ if (this.connection) {
1601
+ await this.connection?.destroy();
1602
+ delete this.connection;
1603
+ }
1604
+
1605
+ if (this.serverTcpUdp) {
1606
+ await new Promise(resolve => {
1607
+ this.serverTcpUdp?.close(() => {
1608
+ resolve(true);
1609
+ });
1610
+ });
1611
+ delete this.serverTcpUdp;
1612
+ }
1613
+ delete this.expressApp;
1614
+ //#endregion
1615
+ }
1616
+ //#endregion
1617
+
1618
+ //#region methods & getters / init connection
1619
+ async initDatabaseConnection(): Promise<void> {
1620
+ //#region @websqlFunc
1621
+ if (this.isRemoteHost || !this.databaseConfig) {
1622
+ return;
1623
+ }
1624
+ const entities = this.getClassFunByArr(Models__NS__ClassType.ENTITY).map(
1625
+ entityFn => {
1626
+ return ClassHelpers__NS__getOrginalClass(entityFn);
1627
+ },
1628
+ );
1629
+
1630
+ const subscribers = this.getClassFunByArr(Models__NS__ClassType.SUBSCRIBER);
1631
+
1632
+ let autoSave = false;
1633
+ if (!___NS__isNil(this.databaseConfig.autoSave)) {
1634
+ autoSave = this.databaseConfig.autoSave;
1635
+ } else {
1636
+ if (this.USE_MARIADB_MYSQL_IN_DOCKER) {
1637
+ autoSave = !this.isRunningInsideDocker; // in docker I am using mysql or posgress
1638
+ } else {
1639
+ autoSave = true; // on docker with sqljs I need to save db
1640
+ }
1641
+ }
1642
+
1643
+ const dataSourceDbConfig = ___NS__isObject(this.databaseConfig)
1644
+ ? ({
1645
+ type: this.databaseConfig.type,
1646
+ port: this.databaseConfig.databasePort,
1647
+ host: this.databaseConfig.databaseHost,
1648
+ database: this.databaseConfig.database as any,
1649
+ username: this.databaseConfig.databaseUsername,
1650
+ password: this.databaseConfig.databasePassword,
1651
+ useLocalForage: this.databaseConfig.useLocalForage,
1652
+ // I am not using typeorm migration system
1653
+ entities,
1654
+ subscribers,
1655
+ synchronize: this.isRunOrRevertOnlyMigrationAppStart
1656
+ ? false
1657
+ : this.databaseConfig.synchronize,
1658
+ autoSave,
1659
+ dropSchema: this.isRunOrRevertOnlyMigrationAppStart
1660
+ ? false
1661
+ : this.databaseConfig.dropSchema,
1662
+ logging: !!this.databaseConfig.logging,
1663
+ location: this.databaseConfig.location,
1664
+ } as DataSourceOptions)
1665
+ : ({} as DataSourceOptions);
1666
+
1667
+ // debugger;
1668
+ this.logFramework &&
1669
+ console.log(
1670
+ `[Context: "${this.contextName}"] dataSourceDbConfig`,
1671
+ dataSourceDbConfig,
1672
+ );
1673
+
1674
+ if (this.modeAllowsDatabaseCreation && this.databaseConfig) {
1675
+ this.logDb &&
1676
+ this.logFramework &&
1677
+ Helpers__NS__info('[taon][database] prepare typeorm connection...');
1678
+ try {
1679
+ const connection = new DataSource(dataSourceDbConfig);
1680
+ this.connection = connection;
1681
+ await this.connection.initialize();
1682
+ } catch (error) {
1683
+ console.error(
1684
+ `[taon][typeorm] Error while initializing connection for ${this.contextName}, ERROR STARTED `,
1685
+ );
1686
+ console.error(error?.stack || '< No stack trace > ');
1687
+ console.error(error?.message || error);
1688
+ console.error(
1689
+ `[taon][typeorm] Error while initializing connection for ${this.contextName}, ERROR ENDS `,
1690
+ );
1691
+ }
1692
+
1693
+ if (!this.connection?.isInitialized) {
1694
+ console.log('WRONG CONFIG', dataSourceDbConfig);
1695
+ throw new Error(`Something wrong with connection init in ${this.mode}`);
1696
+ //#region @backend
1697
+ process.exit(1);
1698
+ //#endregion
1699
+ }
1700
+
1701
+ if (this.logDb || this.logFramework) {
1702
+ console.info(
1703
+ `
1704
+
1705
+ CONTECTION OK for ${this.contextName} - ${this.mode}
1706
+
1707
+ [taon][typeorm] db prepration done.. db initialize=${this.connection?.isInitialized}
1708
+
1709
+
1710
+ `,
1711
+ // dataSourceDbConfig,
1712
+ { 'this.connection': !!this.connection },
1713
+ );
1714
+ console.log(
1715
+ `Database file location: ${this.connection.options.database}`,
1716
+ );
1717
+ }
1718
+ // const entityMetadata = getMetadataArgsStorage();
1719
+ // console.log(
1720
+ // `
1721
+
1722
+ // entityMetadata after connection init for ${this.contextName} - ${this.mode}
1723
+
1724
+ // `,
1725
+ // entityMetadata,
1726
+ // );
1727
+ // debugger;
1728
+ } else {
1729
+ Helpers__NS__info(`[taon][typeorm] Not initing db for mode ${this.mode}`);
1730
+ }
1731
+ //#endregion
1732
+ }
1733
+
1734
+ //#endregion
1735
+
1736
+ //#region methods & getters / initialize metadata
1737
+
1738
+ //#region methods & getters / update class calculate path
1739
+ private updateCalculatedPathsForControllers(
1740
+ rawConfigs: ControllerConfig[],
1741
+ classConfig: ControllerConfig,
1742
+ controllerClassFn: Function,
1743
+ ): void {
1744
+ const parentsCalculatedPath = ___NS__slice(rawConfigs, 1)
1745
+ .reverse()
1746
+ .map(bc => {
1747
+ if (TaonHelpers__NS__isGoodPath(bc.path)) {
1748
+ return bc.path;
1749
+ }
1750
+ return bc.className;
1751
+ })
1752
+ .join('/');
1753
+
1754
+ const contextNameForCommunication = this.contextNameForCommunication;
1755
+
1756
+ if (TaonHelpers__NS__isGoodPath(classConfig.path)) {
1757
+ classConfig.calculatedPath = classConfig.path;
1758
+ } else {
1759
+ classConfig.calculatedPath = (
1760
+ `${this.uriPathnameOrNothingIfRoot}` +
1761
+ `/${apiPrefix}/${contextNameForCommunication}/tcp${parentsCalculatedPath}/` +
1762
+ `${ClassHelpers__NS__getName(controllerClassFn)}`
1763
+ )
1764
+ .replace(/\/\//g, '/')
1765
+ .split('/')
1766
+ .reduce((acc, bc) => {
1767
+ return ___NS__last(acc) === bc ? acc : [...acc, bc];
1768
+ }, [])
1769
+ .join('/');
1770
+ }
1771
+
1772
+ // console.log('calculatedPath', classConfig.calculatedPath);
1773
+ }
1774
+ //#endregion
1775
+
1776
+ //#region methods & getters / dedupe class configs
1777
+ private mergeControllerMethodsConfigs(
1778
+ rawConfigs: ControllerConfig[],
1779
+ classConfig: ControllerConfig,
1780
+ controllerClassFn: Function,
1781
+ ): void {
1782
+ const currentControllerMethodsConfig = classConfig.methods;
1783
+
1784
+ ___NS__slice(rawConfigs, 1).forEach(bc => {
1785
+ const parentControllerMethods = ___NS__cloneDeep(bc.methods);
1786
+
1787
+ for (const methodsName in parentControllerMethods) {
1788
+ if (parentControllerMethods.hasOwnProperty(methodsName)) {
1789
+ if (!currentControllerMethodsConfig[methodsName]) {
1790
+ //#region add non existed method
1791
+ const methodConfig = parentControllerMethods[methodsName];
1792
+ currentControllerMethodsConfig[methodsName] = methodConfig;
1793
+ //#endregion
1794
+ }
1795
+ }
1796
+ }
1797
+ });
1798
+ }
1799
+
1800
+ //#endregion
1801
+ async initControllersHook(
1802
+ ctxStorage: ContextsEndpointStorage,
1803
+ ): Promise<void> {
1804
+ if (this.isRunOrRevertOnlyMigrationAppStart) {
1805
+ return;
1806
+ }
1807
+ const allControllers = this.getClassFunByArr(Models__NS__ClassType.CONTROLLER);
1808
+ for (const controllerClassFn of allControllers) {
1809
+ const instance = this.getInstanceBy(
1810
+ controllerClassFn as any,
1811
+ ) as TaonBaseController;
1812
+ if (___NS__isFunction(instance.afterAllCtxInited)) {
1813
+ await instance.afterAllCtxInited({ ctxStorage });
1814
+ }
1815
+ }
1816
+ }
1817
+
1818
+ async initControllers(): Promise<void> {
1819
+ if (this.isRunOrRevertOnlyMigrationAppStart) {
1820
+ return;
1821
+ }
1822
+ const allControllers = this.getClassFunByArr(Models__NS__ClassType.CONTROLLER);
1823
+ // debugger
1824
+ // console.log('allControllers', allControllers);
1825
+ for (const controllerClassFn of allControllers) {
1826
+ // console.log(ClassHelpers__NS__getClassConfig(controllerClassFn));
1827
+
1828
+ // const controllerName = ClassHelpers__NS__getName(controllerClassFn);
1829
+
1830
+ // console.log(
1831
+ // `for ${controllerName}`,
1832
+ // ClassHelpers__NS__getClassConfig(controllerClassFn),
1833
+ // );
1834
+
1835
+ controllerClassFn[Symbols__NS__classMethodsNames] =
1836
+ ClassHelpers__NS__getMethodsNames(controllerClassFn);
1837
+
1838
+ const rawConfigs = ClassHelpers__NS__getControllerConfigs(controllerClassFn);
1839
+ // console.log(controllerName, { rawConfigs });
1840
+ // console.log(`Class config for ${ClassHelpers__NS__getName(controllerClassFn)}`, configs)
1841
+ const classConfig: ControllerConfig = rawConfigs[0];
1842
+
1843
+ this.updateCalculatedPathsForControllers(
1844
+ rawConfigs,
1845
+ classConfig,
1846
+ controllerClassFn,
1847
+ );
1848
+ this.mergeControllerMethodsConfigs(
1849
+ rawConfigs,
1850
+ classConfig,
1851
+ controllerClassFn,
1852
+ );
1853
+
1854
+ //#region combine middlewares from controllers
1855
+ classConfig.calculatedMiddlewaresControllerObj = {};
1856
+ [...rawConfigs].reverse().forEach(rc => {
1857
+ if (___NS__isFunction(rc.middlewares)) {
1858
+ classConfig.calculatedMiddlewaresControllerObj = rc.middlewares({
1859
+ parentMiddlewares: classConfig.calculatedMiddlewaresControllerObj,
1860
+ className(middlewareClass) {
1861
+ return ClassHelpers__NS__getName(controllerClassFn);
1862
+ },
1863
+ });
1864
+ }
1865
+ });
1866
+ //#endregion
1867
+
1868
+ //#region group start
1869
+ //#region @backend
1870
+ if (!UtilsOs__NS__isRunningInCliMode()) {
1871
+ //#endregion
1872
+ this.logHttp &&
1873
+ console.groupCollapsed(
1874
+ `[taon][express-server] routes [${classConfig.className}]`,
1875
+ );
1876
+ //#region @backend
1877
+ }
1878
+ //#endregion
1879
+ //#endregion
1880
+
1881
+ //#region init client or server methods
1882
+ const methodNames = Object.keys(classConfig.methods);
1883
+ for (const methodName of methodNames) {
1884
+ const methodConfig: Partial<MethodConfig> =
1885
+ classConfig.methods[methodName];
1886
+
1887
+ //#region combine all class methods middlewares
1888
+ let calculatedMiddlewaresMethodObj = {};
1889
+
1890
+ [...rawConfigs].reverse().forEach(rc => {
1891
+ if (rc.methods[methodName]) {
1892
+ const parentMethodConfig = rc.methods[methodName];
1893
+
1894
+ if (___NS__isFunction(parentMethodConfig.middlewares)) {
1895
+ calculatedMiddlewaresMethodObj = parentMethodConfig.middlewares({
1896
+ parentMiddlewares: calculatedMiddlewaresMethodObj,
1897
+ className(middlewareClass) {
1898
+ return ClassHelpers__NS__getName(controllerClassFn);
1899
+ },
1900
+ });
1901
+ }
1902
+ }
1903
+ });
1904
+
1905
+ // add class middlewares to method middlewares
1906
+ methodConfig.calculatedMiddlewaresMethodObj = {
1907
+ ...calculatedMiddlewaresMethodObj,
1908
+ ...classConfig.calculatedMiddlewaresControllerObj,
1909
+ };
1910
+ methodConfig.calculatedMiddlewares = Object.values(
1911
+ methodConfig.calculatedMiddlewaresMethodObj || {},
1912
+ );
1913
+ //#endregion
1914
+
1915
+ // methodConfig.calculatedMiddlewares = TODO
1916
+
1917
+ //#region initialized method express path
1918
+ const httpMethodType: CoreModels__NS__HttpMethod = methodConfig.type;
1919
+
1920
+ // this is quick fix - in docker global path should not be used
1921
+ const globalPathPart =
1922
+ this.isRunningInsideDocker ||
1923
+ !this.frontendHostUri?.origin?.includes('localhost') // fe with domain -> is in docker
1924
+ ? `${this.uriPathnameOrNothingIfRoot.replace(
1925
+ /\/$/,
1926
+ '',
1927
+ )}/${apiPrefix}/${this.contextName}`.replace(/\/\//, '/')
1928
+ : '';
1929
+ const expressPath = methodConfig.global
1930
+ ? `${globalPathPart}/${methodConfig.path?.replace(
1931
+ /\/$/,
1932
+ '',
1933
+ )}`.replace(/\/\//, '/')
1934
+ : TaonHelpers__NS__getExpressPath(classConfig, methodConfig);
1935
+
1936
+ //#endregion
1937
+
1938
+ //#region init server
1939
+ // console.log({ expressPath });
1940
+ if (UtilsOs__NS__isNode || UtilsOs__NS__isWebSQL) {
1941
+ //#region @websql
1942
+
1943
+ const route = this.initServer(
1944
+ httpMethodType,
1945
+ methodConfig,
1946
+ classConfig,
1947
+ expressPath,
1948
+ controllerClassFn,
1949
+ );
1950
+
1951
+ this.activeRoutes.push({
1952
+ expressPath: route.expressPath,
1953
+ method: route.method,
1954
+ });
1955
+ //#endregion
1956
+ }
1957
+ //#endregion
1958
+
1959
+ //#region init client
1960
+ const shouldInitClient =
1961
+ UtilsOs__NS__isBrowser || this.isRemoteHost || UtilsOs__NS__isWebSQL;
1962
+ // console.log('shouldInitClient', shouldInitClient);
1963
+ if (shouldInitClient) {
1964
+ // console.log(
1965
+ // 'initClient',
1966
+ // ClassHelpers__NS__getFullInternalName(controllerClassFn),
1967
+ // type,
1968
+ // methodConfig,
1969
+ // expressPath,
1970
+ // );
1971
+ await this.initClient(
1972
+ controllerClassFn,
1973
+ httpMethodType,
1974
+ methodConfig as any,
1975
+ expressPath,
1976
+ );
1977
+ }
1978
+ //#endregion
1979
+ }
1980
+ //#endregion
1981
+
1982
+ //#region group end
1983
+ //#region @backend
1984
+ if (!UtilsOs__NS__isRunningInCliMode()) {
1985
+ //#endregion
1986
+ this.logHttp && console.groupEnd();
1987
+ //#region @backend
1988
+ }
1989
+ //#endregion
1990
+ //#endregion
1991
+ }
1992
+ }
1993
+ //#endregion
1994
+
1995
+ //#region methods & getters / write active routes
1996
+ public writeActiveRoutes(): void {
1997
+ if (this.isRemoteHost || this.isRunOrRevertOnlyMigrationAppStart) {
1998
+ return;
1999
+ }
2000
+ // const contexts: EndpointContext[] = [this];
2001
+ //#region @websql
2002
+
2003
+ const troutes = Utils__NS__uniqArray(
2004
+ this.activeRoutes.map(f => {
2005
+ return `${f.method} ${f.expressPath}`;
2006
+ }),
2007
+ ).map(f => {
2008
+ const [method, expressPath] = f.split(' ');
2009
+ return (
2010
+ `\n### ${___NS__startCase(___NS__last(expressPath.split('/')))}\n` +
2011
+ TaonHelpers__NS__fillUpTo(method.toUpperCase() + ' ', 10) +
2012
+ this.uriOrigin +
2013
+ expressPath
2014
+ );
2015
+
2016
+ // return `${TaonHelpers.string(method.toUpperCase() + ':')
2017
+ // .fillUpTo(10)}${context.uriHref.replace(/\/$/, '')}${expressPath}`
2018
+ });
2019
+ const routes = [
2020
+ ...['', `# ROUTES FOR HOST ${this.uriOrigin} `],
2021
+ ...troutes,
2022
+ ].join('\n');
2023
+
2024
+ const fileName = crossPlatformPath([
2025
+ //#region @backend
2026
+ process.cwd(),
2027
+ //#endregion
2028
+ `routes/routes-${this.config.contextName}.rest`,
2029
+ ]);
2030
+
2031
+ this.logFramework && console.log(`[taon] routes file: ${fileName} `);
2032
+ this.logRoutes && console.log(routes);
2033
+ //#region @backend
2034
+ if (!UtilsOs__NS__isElectron && !this.skipWritingServerRoutes) {
2035
+ Helpers__NS__writeFile(fileName, routes);
2036
+ }
2037
+ //#endregion
2038
+ //#endregion
2039
+ }
2040
+ //#endregion
2041
+
2042
+ //#region methods & getters / middlewares
2043
+ public get middlewares(): Models__NS__MiddlewareType[] {
2044
+ //#region @backendFunc
2045
+ return this.config.middlewares || [];
2046
+ //#endregion
2047
+ }
2048
+ //#endregion
2049
+
2050
+ //#region methods & getters / init middlewares
2051
+
2052
+ private async initCustomClientMiddlewares(): Promise<void> {
2053
+ const middlewares = this.getClassesInstancesArrBy(
2054
+ Models__NS__ClassType.MIDDLEWARE,
2055
+ )
2056
+ .map(f => f as TaonBaseMiddleware)
2057
+ .filter(f => ___NS__isFunction(f.interceptClient));
2058
+
2059
+ middlewares.forEach(middlewareInstanceName => {
2060
+ const contextName = this.contextName;
2061
+ const interceptorName = `${contextName}-${ClassHelpers__NS__getName(
2062
+ middlewareInstanceName,
2063
+ )}`;
2064
+ Resource.request.interceptors.set(interceptorName, {
2065
+ intercept: ({ req, next }) => {
2066
+ const url = new URL(req.url);
2067
+ if (
2068
+ url.pathname.startsWith(
2069
+ `${this.uriPathnameOrNothingIfRoot}/${apiPrefix}/${contextName}/`,
2070
+ )
2071
+ ) {
2072
+ // console.log('intercepting', url.pathname, req);
2073
+ return middlewareInstanceName.interceptClient({
2074
+ req,
2075
+ next,
2076
+ });
2077
+ }
2078
+ return next.handle(req);
2079
+ },
2080
+ });
2081
+ });
2082
+ }
2083
+
2084
+ private async initCustomBackendMiddlewares(): Promise<void> {
2085
+ //#region @backend
2086
+ const app = this.expressApp;
2087
+ const middlewares = this.getClassesInstancesArrBy(
2088
+ Models__NS__ClassType.MIDDLEWARE,
2089
+ );
2090
+
2091
+ for (const middleware of middlewares) {
2092
+ const middlewareInstance: TaonBaseMiddleware = middleware as any;
2093
+ if (___NS__isFunction(middlewareInstance.interceptServer)) {
2094
+ const middlewareFn = ClassHelpers__NS__asyncHandler(
2095
+ async (
2096
+ req: express.Request,
2097
+ res: express.Response,
2098
+ next: express.NextFunction,
2099
+ ) => {
2100
+ if (
2101
+ req.originalUrl.startsWith(
2102
+ `${this.uriPathnameOrNothingIfRoot}/${apiPrefix}/${this.contextName}/`,
2103
+ )
2104
+ ) {
2105
+ await middlewareInstance.interceptServer({
2106
+ req,
2107
+ res,
2108
+ next,
2109
+ });
2110
+ } else {
2111
+ next();
2112
+ }
2113
+ },
2114
+ );
2115
+
2116
+ app.use(middlewareFn);
2117
+ }
2118
+ }
2119
+ //#endregion
2120
+ }
2121
+
2122
+ private async initBackendMiddlewares(): Promise<void> {
2123
+ //#region @backend
2124
+ const app = this.expressApp;
2125
+
2126
+ // if (this.middlewares) {
2127
+ // this.middlewares.forEach(m => {
2128
+ // const [fun, args] = m;
2129
+ // app.use(fun.apply(null, args));
2130
+ // });
2131
+ // }
2132
+
2133
+ this.expressApp.get('/helloworld', (req, res) => {
2134
+ res.send(`Hello, world from context ${this.contextName}`);
2135
+ });
2136
+
2137
+ // app.use(fileUpload());
2138
+ app.use(bodyParser.urlencoded({ extended: true }));
2139
+ app.use(bodyParser.json());
2140
+ app.use(methodOverride());
2141
+ app.use(cookieParser());
2142
+
2143
+ if (this.session) {
2144
+ Helpers__NS__info(
2145
+ '[taon][express-server] session enabled for this context ' +
2146
+ this.contextName,
2147
+ );
2148
+ const { cookieMaxAge } = this.session;
2149
+ const frontendHost = this.config.frontendHost;
2150
+
2151
+ const sessionObj = {
2152
+ frontendHost,
2153
+ secret: 'mysecretsessioncookithing',
2154
+ saveUninitialized: true,
2155
+ cookieMaxAge,
2156
+ secure: frontendHost.startsWith('https://'),
2157
+ resave: false,
2158
+ } as Models__NS__ISession;
2159
+
2160
+ app.use(
2161
+ cors({
2162
+ credentials: true,
2163
+ origin: frontendHost,
2164
+ }),
2165
+ );
2166
+ app.use(expressSession(sessionObj));
2167
+ console.log(`
2168
+
2169
+ CORS ENABLED FOR SESSION
2170
+
2171
+ `);
2172
+ } else {
2173
+ // if(this.config?.serverLogs) {
2174
+ this.logHttp &&
2175
+ Helpers__NS__info(
2176
+ `[taon][express-server] session not enabled for this context '${this.contextName}'`,
2177
+ );
2178
+ // }
2179
+ app.use(
2180
+ cors({
2181
+ // origin: "http://localhost:5555",
2182
+ // methods: ["GET", "POST"],
2183
+ // allowedHeaders: ["my-custom-header"],
2184
+ // credentials: true
2185
+ }),
2186
+ );
2187
+ this.logHttp &&
2188
+ console.log(`
2189
+
2190
+ CORS ENABLED WITHOUT SESSION
2191
+
2192
+ `);
2193
+ }
2194
+
2195
+ (() => {
2196
+ app.use((req, res, next) => {
2197
+ //#region good for cors session obj
2198
+ // if (this.context.session) {
2199
+ // res.header('Access-Control-Allow-Origin', this.context.session.frontendHost);
2200
+ // res.header('Access-Control-Allow-Credentials', 'true');
2201
+ // res.header(
2202
+ // 'Access-Control-Allow-Headers',
2203
+ // 'Origin, X-Requested-With, Content-Type, Accept'
2204
+ // );
2205
+ // res.header("Access-Control-Allow-Methods", "PUT,POST,GET,HEAD,DELETE,OPTIONS,PATCH");
2206
+ // // maybe this
2207
+ // res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
2208
+ // }
2209
+ //#endregion
2210
+
2211
+ res.set(
2212
+ 'Access-Control-Expose-Headers',
2213
+ [
2214
+ 'Content-Type',
2215
+ 'Authorization',
2216
+ 'X-Requested-With',
2217
+ Symbols__NS__old.X_TOTAL_COUNT,
2218
+ Symbols__NS__old.MAPPING_CONFIG_HEADER,
2219
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY,
2220
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_QUERY_PARAM,
2221
+ ].join(', '),
2222
+ );
2223
+ next();
2224
+ });
2225
+ })();
2226
+
2227
+ //#endregion
2228
+ }
2229
+ //#endregion
2230
+
2231
+ //#region methods & getters / init methods node
2232
+ private initServer(
2233
+ //#region parameters
2234
+ httpMethodType: CoreModels__NS__HttpMethod,
2235
+ methodConfig: Partial<MethodConfig>,
2236
+ classConfig: ControllerConfig,
2237
+ expressPath: string,
2238
+ target: Function,
2239
+ //#endregion
2240
+ ): { expressPath: string; method: CoreModels__NS__HttpMethod } {
2241
+ //#region resolve variables
2242
+ // console.log(
2243
+ // `CLIENT: expressPath: "${expressPath}" interceptor for method: ${methodConfig.calculatedMiddlewares.length}`,
2244
+ // );
2245
+
2246
+ const middlewareHandlers = methodConfig.calculatedMiddlewares
2247
+ .map(middlewareClassFun => {
2248
+ const middlewareInstance: TaonBaseMiddleware = this.getInstanceBy(
2249
+ middlewareClassFun as any,
2250
+ );
2251
+ if (
2252
+ middlewareInstance &&
2253
+ ___NS__isFunction(middlewareInstance.interceptServerMethod)
2254
+ ) {
2255
+ const middlewareFn = ClassHelpers__NS__asyncHandler(
2256
+ async (
2257
+ req: express.Request,
2258
+ res: express.Response,
2259
+ next: express.NextFunction,
2260
+ ) => {
2261
+ await middlewareInstance.interceptServerMethod(
2262
+ {
2263
+ req,
2264
+ res,
2265
+ next,
2266
+ },
2267
+ {
2268
+ methodName: methodConfig.methodName,
2269
+ expressPath,
2270
+ httpRequestType: methodConfig.type,
2271
+ },
2272
+ );
2273
+ },
2274
+ );
2275
+ return middlewareFn;
2276
+ }
2277
+ })
2278
+ .filter(f => !!f) as express.RequestHandler[];
2279
+
2280
+ // const url = this.uri;
2281
+
2282
+ //#region get result
2283
+ const getResult = async (resolvedParams, req, res) => {
2284
+ const response: Models__NS__Http__NS__Response<any> =
2285
+ methodConfig.descriptor.value.apply(
2286
+ /**
2287
+ * Context for method @GET,@PUT etc.
2288
+ */
2289
+ this.getInstanceBy(target as any),
2290
+ /**
2291
+ * Params for method @GET, @PUT etc.
2292
+ */
2293
+ resolvedParams,
2294
+ );
2295
+ let result = await getResponseValue(response, { req, res });
2296
+ return result;
2297
+ };
2298
+ //#endregion
2299
+
2300
+ // console.log(`BACKEND: expressPath: "${expressPath}" `);
2301
+ //#endregion
2302
+
2303
+ if (UtilsOs__NS__isElectron) {
2304
+ //#region @backend
2305
+ const ipcKeyName = TaonHelpers__NS__ipcKeyNameRequest(
2306
+ target,
2307
+ methodConfig,
2308
+ expressPath,
2309
+ );
2310
+ ipcMain.on(ipcKeyName, async (event, paramsFromBrowser) => {
2311
+ const responseJsonData = await getResult(
2312
+ paramsFromBrowser,
2313
+ void 0,
2314
+ void 0,
2315
+ );
2316
+ const sendToIpsMainOn = TaonHelpers__NS__ipcKeyNameResponse(
2317
+ target,
2318
+ methodConfig,
2319
+ expressPath,
2320
+ );
2321
+ // console.log({ sendToIpsMainOn });
2322
+ event.sender.send(sendToIpsMainOn, responseJsonData);
2323
+ });
2324
+ return {
2325
+ expressPath,
2326
+ method: methodConfig.type,
2327
+ };
2328
+ //#endregion
2329
+ }
2330
+
2331
+ if (!this.isRemoteHost) {
2332
+ //#region apply dummy websql express routers
2333
+ //#region @websql
2334
+ if (UtilsOs__NS__isWebSQL) {
2335
+ if (!this.expressApp[httpMethodType.toLowerCase()]) {
2336
+ this.expressApp[httpMethodType.toLowerCase()] = () => {};
2337
+ // TODO add middlewares for WEBSQL and ELECTRON mode
2338
+ }
2339
+ }
2340
+ //#endregion
2341
+ //#endregion
2342
+
2343
+ //#region @backend
2344
+ // this.logHttp &&
2345
+ // console.log(`[${httpMethodType.toUpperCase()}] ${expressPath} `);
2346
+ this.expressApp[httpMethodType.toLowerCase()](
2347
+ expressPath,
2348
+ ...middlewareHandlers,
2349
+ async (req: express.Request, res: express.Response) => {
2350
+ // console.log(`[${type.toUpperCase()}] ${expressPath} `);
2351
+ //#region process params
2352
+ const args: any[] = [];
2353
+
2354
+ let tBody = req.body;
2355
+ let tParams = req.params;
2356
+ let tQuery: Object = req.query;
2357
+
2358
+ if (req.headers[Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY]) {
2359
+ try {
2360
+ tBody = JSON.parse(
2361
+ JSON.stringify(tBody),
2362
+ JSON.parse(
2363
+ TaonHelpers__NS__firstStringOrElemFromArray(
2364
+ req.headers[Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY],
2365
+ ),
2366
+ ),
2367
+ );
2368
+ } catch (e) {}
2369
+ }
2370
+
2371
+ if (req.headers[Symbols__NS__old.CIRCURAL_OBJECTS_MAP_QUERY_PARAM]) {
2372
+ try {
2373
+ tQuery = JSON.parse(
2374
+ JSON.stringify(tQuery),
2375
+ JSON.parse(
2376
+ TaonHelpers__NS__firstStringOrElemFromArray(
2377
+ req.headers[Symbols__NS__old.CIRCURAL_OBJECTS_MAP_QUERY_PARAM],
2378
+ ),
2379
+ ),
2380
+ );
2381
+ } catch (e) {}
2382
+ }
2383
+
2384
+ // make class instance from body
2385
+ // console.log('req.headers', req.headers)
2386
+ if (req.headers[Symbols__NS__old.MAPPING_CONFIG_HEADER_BODY_PARAMS]) {
2387
+ try {
2388
+ const entity = JSON.parse(
2389
+ TaonHelpers__NS__firstStringOrElemFromArray(
2390
+ req.headers[Symbols__NS__old.MAPPING_CONFIG_HEADER_BODY_PARAMS],
2391
+ ),
2392
+ );
2393
+ tBody = Mapping__NS__encode(tBody, entity);
2394
+ } catch (e) {}
2395
+ } else {
2396
+ Object.keys(tBody).forEach(paramName => {
2397
+ try {
2398
+ const entityForParam = JSON.parse(
2399
+ TaonHelpers__NS__firstStringOrElemFromArray(
2400
+ req.headers[
2401
+ `${Symbols__NS__old.MAPPING_CONFIG_HEADER_BODY_PARAMS}${paramName} `
2402
+ ],
2403
+ ),
2404
+ );
2405
+ tBody[paramName] = Mapping__NS__encode(
2406
+ tBody[paramName],
2407
+ entityForParam,
2408
+ );
2409
+ } catch (e) {}
2410
+ });
2411
+ }
2412
+
2413
+ // make class instance from query params
2414
+ // console.log('req.headers', tQuery)
2415
+ if (req.headers[Symbols__NS__old.MAPPING_CONFIG_HEADER_QUERY_PARAMS]) {
2416
+ try {
2417
+ const entity = JSON.parse(
2418
+ TaonHelpers__NS__firstStringOrElemFromArray(
2419
+ req.headers[Symbols__NS__old.MAPPING_CONFIG_HEADER_QUERY_PARAMS],
2420
+ ),
2421
+ );
2422
+ tQuery = TaonHelpers__NS__parseJSONwithStringJSONs(
2423
+ Mapping__NS__encode(tQuery, entity),
2424
+ );
2425
+ } catch (e) {}
2426
+ } else {
2427
+ Object.keys(tQuery).forEach(queryParamName => {
2428
+ try {
2429
+ const entityForParam = JSON.parse(
2430
+ TaonHelpers__NS__firstStringOrElemFromArray(
2431
+ req.headers[
2432
+ `${Symbols__NS__old.MAPPING_CONFIG_HEADER_QUERY_PARAMS}${queryParamName} `
2433
+ ],
2434
+ ),
2435
+ );
2436
+ let beforeTransofrm = tQuery[queryParamName];
2437
+ if (___NS__isString(beforeTransofrm)) {
2438
+ try {
2439
+ const paresed =
2440
+ TaonHelpers__NS__tryTransformParam(beforeTransofrm);
2441
+ beforeTransofrm = paresed;
2442
+ } catch (e) {}
2443
+ }
2444
+ const afterEncoding = Mapping__NS__encode(
2445
+ beforeTransofrm,
2446
+ entityForParam,
2447
+ );
2448
+ tQuery[queryParamName] =
2449
+ TaonHelpers__NS__parseJSONwithStringJSONs(afterEncoding);
2450
+ } catch (e) {}
2451
+ });
2452
+ }
2453
+
2454
+ Object.keys(methodConfig.parameters).forEach(paramName => {
2455
+ let p: Partial<ParamConfig> = methodConfig.parameters[paramName];
2456
+ if (p.paramType === 'Path' && tParams) {
2457
+ args.push(tParams[p.paramName]);
2458
+ }
2459
+ if (p.paramType === 'Query' && tQuery) {
2460
+ if (p.paramName) {
2461
+ args.push(tQuery[p.paramName]);
2462
+ } else {
2463
+ args.push(tQuery);
2464
+ }
2465
+ }
2466
+
2467
+ if (p.paramType === 'Header' && req.headers) {
2468
+ args.push(req.headers[p.paramName.toLowerCase()]);
2469
+ }
2470
+ if (p.paramType === 'Cookie' && req.cookies) {
2471
+ args.push(req.cookies[p.paramName]);
2472
+ }
2473
+ if (p.paramType === 'Body' && tBody) {
2474
+ if (p.paramName && typeof tBody === 'object') {
2475
+ args.push(tBody[p.paramName]);
2476
+ } else {
2477
+ args.push(tBody);
2478
+ }
2479
+ }
2480
+ });
2481
+ //#endregion
2482
+
2483
+ const resolvedParams = args
2484
+ .reverse()
2485
+ .map(v => TaonHelpers__NS__tryTransformParam(v));
2486
+
2487
+ try {
2488
+ let result = await getResult(resolvedParams, req, res);
2489
+ if (methodConfig.responseType)
2490
+ if (res.headersSent) {
2491
+ // SKIP FURTHER PROCESSING IF RESPONSE ALREADY SENT
2492
+ return;
2493
+ }
2494
+ if (methodConfig.overrideExpressSendAsHtml) {
2495
+ res.setHeader('Content-Type', 'text/html');
2496
+ res.send(result);
2497
+ return;
2498
+ }
2499
+ if (
2500
+ result instanceof Blob &&
2501
+ (methodConfig.responseType as ModelsNg2Rest__NS__ResponseTypeAxios) ===
2502
+ 'blob'
2503
+ ) {
2504
+ // console.log('INSTANCE OF BLOB')
2505
+ //#region processs blob result type
2506
+ const blob = result as Blob;
2507
+ const file = Buffer.from(await blob.arrayBuffer());
2508
+ res.writeHead(200, {
2509
+ 'Content-Type': blob.type,
2510
+ 'Content-Length': file.length,
2511
+ });
2512
+ res.end(file);
2513
+ //#endregion
2514
+ } else if (
2515
+ ___NS__isString(result) &&
2516
+ (methodConfig.responseType as ModelsNg2Rest__NS__ResponseTypeAxios) ===
2517
+ 'blob'
2518
+ ) {
2519
+ // console.log('BASE64')
2520
+ //#region process string buffer TODO refacetor
2521
+ const img_base64 = result;
2522
+ const m = /^data:(.+?);base64,(.+)$/.exec(img_base64);
2523
+ if (!m) {
2524
+ throw new Error(
2525
+ `[taon - framework] Not a base64 image[${img_base64}]`,
2526
+ );
2527
+ }
2528
+ const [_, content_type, file_base64] = m;
2529
+ const file = Buffer.from(file_base64, 'base64');
2530
+
2531
+ res.writeHead(200, {
2532
+ 'Content-Type': content_type,
2533
+ 'Content-Length': file.length,
2534
+ });
2535
+ res.end(file);
2536
+ //#endregion
2537
+ } else {
2538
+ //#region process json request
2539
+ await EntityProcess.init(result, res);
2540
+ //#endregion
2541
+ }
2542
+ } catch (error) {
2543
+ if (res.headersSent) {
2544
+ // SKIP FURTHER PROCESSING IF RESPONSE ALREADY SENT
2545
+ return;
2546
+ }
2547
+ if (methodConfig.overrideExpressSendAsHtml) {
2548
+ res.setHeader('Content-Type', 'text/html');
2549
+ res.send(error);
2550
+ return;
2551
+ }
2552
+
2553
+ this.sendError(res, error, req, expressPath);
2554
+ }
2555
+ },
2556
+ );
2557
+ //#endregion
2558
+ }
2559
+
2560
+ return {
2561
+ expressPath: expressPath,
2562
+ method: methodConfig.type,
2563
+ };
2564
+ }
2565
+ //#endregion
2566
+
2567
+ //#region methods & getters / send error
2568
+ protected sendError(
2569
+ res: express.Response,
2570
+ error: unknown,
2571
+ req: express.Request,
2572
+ expressPath: string,
2573
+ ): void {
2574
+ //#region @backendFunc
2575
+ let status = 500;
2576
+ let message = 'Internal Server Error';
2577
+ let details: any = undefined;
2578
+ let success = false;
2579
+ let code = undefined;
2580
+ if (typeof error === 'function') {
2581
+ const obj: RestErrorResponseWrapper = error(res) || {};
2582
+ status = obj.status || 400;
2583
+ message = obj.message;
2584
+ details = obj.details;
2585
+ code = obj.code;
2586
+ } else if (typeof error === 'string') {
2587
+ message = error;
2588
+ status = 400;
2589
+ } else if (error instanceof Error) {
2590
+ message = error.message;
2591
+ details = process.env.NODE_ENV !== 'production' ? error.stack : undefined;
2592
+ } else {
2593
+ message = 'Unexpected error';
2594
+ details = error;
2595
+ }
2596
+
2597
+ res.status(status).json({
2598
+ success,
2599
+ message,
2600
+ details,
2601
+ code,
2602
+ [CoreModels__NS__TaonHttpErrorCustomProp]: true,
2603
+ } as RestErrorResponseWrapper);
2604
+ //#endregion
2605
+ }
2606
+ //#endregion
2607
+
2608
+ //#region methods & getters / init client
2609
+ /**
2610
+ * client can be browser or nodejs (when remote host)
2611
+ */
2612
+ private async initClient(
2613
+ target: Function,
2614
+ httpRequestType: CoreModels__NS__HttpMethod,
2615
+ methodConfig: Partial<MethodConfig>, // Models.Http.Rest.MethodConfig,
2616
+ expressPath: string,
2617
+ ): Promise<void> {
2618
+ const ctx = this;
2619
+
2620
+ // console.log(
2621
+ // `CLIENT: expressPath: "${expressPath}" interceptor for method: ${methodConfig.calculatedMiddlewares?.length} `,
2622
+ // );
2623
+
2624
+ //#region init middlewares
2625
+ const middlewares = methodConfig.calculatedMiddlewares;
2626
+ const middlewaresInstances = middlewares
2627
+ .map(f => this.getInstanceBy(f as any) as TaonBaseMiddleware)
2628
+ .filter(f => ___NS__isFunction(f.interceptClientMethod));
2629
+
2630
+ middlewaresInstances.forEach(instance => {
2631
+ const middlewareName = ClassHelpers__NS__getName(instance);
2632
+ // middlewareName - only needed for inheritace and uniqness of interceptors
2633
+ const interceptorKey = `${middlewareName}-${methodConfig.type?.toUpperCase()}-${expressPath}`;
2634
+ Resource.request.methodsInterceptors.set(interceptorKey, {
2635
+ intercept: ({ req, next }) => {
2636
+ return instance.interceptClientMethod(
2637
+ {
2638
+ req,
2639
+ next,
2640
+ },
2641
+ {
2642
+ methodName: methodConfig.methodName,
2643
+ expressPath,
2644
+ httpRequestType: httpRequestType,
2645
+ },
2646
+ );
2647
+ },
2648
+ });
2649
+ });
2650
+ //#endregion
2651
+
2652
+ // : { received: any; /* Rest<any, any> */ }
2653
+ // this.logHttp &&
2654
+ // console.log(`${httpRequestType?.toUpperCase()} ${expressPath} `);
2655
+ // console.log('INITING', methodConfig); // TODO inject in static
2656
+ //#region resolve storage
2657
+ // TODO not a good idea
2658
+ const storage = globalThis;
2659
+ //#endregion
2660
+
2661
+ const orgMethods = target.prototype[methodConfig.methodName];
2662
+
2663
+ //#region handle electron ipc request
2664
+
2665
+ if (UtilsOs__NS__isElectron) {
2666
+ const ipcRenderer = (window as any).require('electron').ipcRenderer;
2667
+ target.prototype[methodConfig.methodName] = function (...args) {
2668
+ const received = new Promise(async (resolve, reject) => {
2669
+ const headers = {};
2670
+ const { request, response } = TaonHelpers__NS__websqlMocks(headers);
2671
+
2672
+ /* */
2673
+ /* */
2674
+ /* */
2675
+ /* */
2676
+ /* */
2677
+ /* */
2678
+ /* */
2679
+ /* */
2680
+ /* */
2681
+ /* */
2682
+ /* */
2683
+ /* */
2684
+ /* */
2685
+ /* */
2686
+ /* */
2687
+ /* */
2688
+ /* */
2689
+ /* */
2690
+ /* */
2691
+ /* */
2692
+ /* */
2693
+ /* */
2694
+ /* */
2695
+ /* */
2696
+ /* */
2697
+ /* */
2698
+ /* */
2699
+ /* */
2700
+ /* */
2701
+ /* */
2702
+ /* */
2703
+ /* */
2704
+ /* */
2705
+ /* */
2706
+ /* */
2707
+ /* */
2708
+
2709
+ });
2710
+ received['observable'] = from(received);
2711
+ return {
2712
+ received,
2713
+ request(axiosConfig: ModelsNg2Rest__NS__Ng2RestAxiosRequestConfig) {
2714
+ return received;
2715
+ },
2716
+ } as Models__NS__Http__NS__ClientAction<any>;
2717
+ };
2718
+ return;
2719
+ }
2720
+ //#endregion
2721
+
2722
+ //#region handling web sql request
2723
+ /* */
2724
+ /* */
2725
+ /* */
2726
+ /* */
2727
+ /* */
2728
+ /* */
2729
+ /* */
2730
+ /* */
2731
+ /* */
2732
+ /* */
2733
+ /* */
2734
+ /* */
2735
+ /* */
2736
+ /* */
2737
+ /* */
2738
+ /* */
2739
+ /* */
2740
+ /* */
2741
+ /* */
2742
+ /* */
2743
+ /* */
2744
+ /* */
2745
+ /* */
2746
+ /* */
2747
+ /* */
2748
+ /* */
2749
+ /* */
2750
+ /* */
2751
+ /* */
2752
+ /* */
2753
+ /* */
2754
+ /* */
2755
+ /* */
2756
+ /* */
2757
+ /* */
2758
+ /* */
2759
+ /* */
2760
+ /* */
2761
+ /* */
2762
+ /* */
2763
+ /* */
2764
+ /* */
2765
+ /* */
2766
+ /* */
2767
+ /* */
2768
+ /* */
2769
+ /* */
2770
+ /* */
2771
+ /* */
2772
+ /* */
2773
+ /* */
2774
+ /* */
2775
+ /* */
2776
+ /* */
2777
+ /* */
2778
+ /* */
2779
+ /* */
2780
+ /* */
2781
+ /* */
2782
+ /* */
2783
+ /* */
2784
+ /* */
2785
+ /* */
2786
+ /* */
2787
+ /* */
2788
+ /* */
2789
+ /* */
2790
+ /* */
2791
+ /* */
2792
+ /* */
2793
+ /* */
2794
+ /* */
2795
+ /* */
2796
+ /* */
2797
+ /* */
2798
+ /* */
2799
+ /* */
2800
+ /* */
2801
+ /* */
2802
+ /* */
2803
+ /* */
2804
+ /* */
2805
+ /* */
2806
+ /* */
2807
+ /* */
2808
+ /* */
2809
+ /* */
2810
+ /* */
2811
+ /* */
2812
+ /* */
2813
+ /* */
2814
+ /* */
2815
+ /* */
2816
+ /* */
2817
+ /* */
2818
+ /* */
2819
+ /* */
2820
+ /* */
2821
+ /* */
2822
+ /* */
2823
+ /* */
2824
+ /* */
2825
+ /* */
2826
+ /* */
2827
+ /* */
2828
+ /* */
2829
+ /* */
2830
+ /* */
2831
+ /* */
2832
+ /* */
2833
+ /* */
2834
+ /* */
2835
+ /* */
2836
+ /* */
2837
+ /* */
2838
+ /* */
2839
+ /* */
2840
+ /* */
2841
+ /* */
2842
+ /* */
2843
+ /* */
2844
+ /* */
2845
+ /* */
2846
+ /* */
2847
+ /* */
2848
+ /* */
2849
+ /* */
2850
+ /* */
2851
+ /* */
2852
+ /* */
2853
+ /* */
2854
+ /* */
2855
+ /* */
2856
+ /* */
2857
+ /* */
2858
+ /* */
2859
+ /* */
2860
+ /* */
2861
+ /* */
2862
+ /* */
2863
+ /* */
2864
+ /* */
2865
+ /* */
2866
+ /* */
2867
+ /* */
2868
+ /* */
2869
+ /* */
2870
+ /* */
2871
+ /* */
2872
+ /* */
2873
+
2874
+ //#endregion
2875
+
2876
+ //#region handle normal request
2877
+
2878
+ target.prototype[methodConfig.methodName] = function (
2879
+ this: {},
2880
+ ...args
2881
+ ): Models__NS__Http__NS__ClientAction<any> {
2882
+ // console.log('[init method browser] FRONTEND expressPath', expressPath)
2883
+ // const productionMode = FrameworkContext.isProductionMode;
2884
+
2885
+ //#region resolve frontend parameters
2886
+
2887
+ if (!storage[Symbols__NS__old.ENDPOINT_META_CONFIG])
2888
+ storage[Symbols__NS__old.ENDPOINT_META_CONFIG] = {};
2889
+ if (!storage[Symbols__NS__old.ENDPOINT_META_CONFIG][ctx.uriOrigin])
2890
+ storage[Symbols__NS__old.ENDPOINT_META_CONFIG][ctx.uriOrigin] = {};
2891
+ const endpoints = storage[Symbols__NS__old.ENDPOINT_META_CONFIG];
2892
+ let rest: ModelsNg2Rest__NS__ResourceModel<any, any>;
2893
+ if (!endpoints[ctx.uriOrigin][expressPath]) {
2894
+ let headers = {};
2895
+ if (methodConfig.contentType && !methodConfig.responseType) {
2896
+ rest = Resource.create(
2897
+ ctx.uriOrigin,
2898
+ expressPath,
2899
+ Symbols__NS__old.MAPPING_CONFIG_HEADER as any,
2900
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY as any,
2901
+ RestHeaders.from({
2902
+ 'Content-Type': methodConfig.contentType,
2903
+ Accept: methodConfig.contentType,
2904
+ }),
2905
+ );
2906
+ } else if (methodConfig.contentType && methodConfig.responseType) {
2907
+ rest = Resource.create(
2908
+ ctx.uriOrigin,
2909
+ expressPath,
2910
+ Symbols__NS__old.MAPPING_CONFIG_HEADER as any,
2911
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY as any,
2912
+ RestHeaders.from({
2913
+ 'Content-Type': methodConfig.contentType,
2914
+ Accept: methodConfig.contentType,
2915
+ responsetypeaxios: methodConfig.responseType,
2916
+ }),
2917
+ );
2918
+ } else if (!methodConfig.contentType && methodConfig.responseType) {
2919
+ rest = Resource.create(
2920
+ ctx.uriOrigin,
2921
+ expressPath,
2922
+ Symbols__NS__old.MAPPING_CONFIG_HEADER as any,
2923
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY as any,
2924
+ RestHeaders.from({
2925
+ responsetypeaxios: methodConfig.responseType,
2926
+ }),
2927
+ );
2928
+ } else {
2929
+ rest = Resource.create(
2930
+ ctx.uriOrigin,
2931
+ expressPath,
2932
+ Symbols__NS__old.MAPPING_CONFIG_HEADER as any,
2933
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY as any,
2934
+ );
2935
+ }
2936
+
2937
+ endpoints[ctx.uriOrigin][expressPath] = rest;
2938
+ } else {
2939
+ rest = endpoints[ctx.uriOrigin][expressPath] as any;
2940
+ }
2941
+
2942
+ const method = httpRequestType.toLowerCase();
2943
+
2944
+ const pathPrams = {};
2945
+ let queryParams = {};
2946
+ let bodyObject = {};
2947
+ args.forEach((param, i) => {
2948
+ let currentParam: Partial<ParamConfig> = void 0 as any;
2949
+
2950
+ for (let pp in methodConfig.parameters) {
2951
+ let v = methodConfig.parameters[pp];
2952
+ if (v.index === i) {
2953
+ currentParam = v;
2954
+ break;
2955
+ }
2956
+ }
2957
+
2958
+ if (!currentParam) {
2959
+ const errorMessage =
2960
+ `[${config.frameworkName}] Unable to resolve parameter` +
2961
+ ` at index ${i} for method ${methodConfig.methodName} at path ${expressPath}.`;
2962
+
2963
+ //#region @backend
2964
+ console.error(errorMessage);
2965
+ process.exit(0);
2966
+ //#endregion
2967
+ throw new Error(errorMessage);
2968
+ }
2969
+
2970
+ if (currentParam.paramType === 'Path') {
2971
+ pathPrams[currentParam.paramName] = param;
2972
+ }
2973
+ if (currentParam.paramType === 'Query') {
2974
+ if (currentParam.paramName) {
2975
+ const mapping = Mapping__NS__decode(param, !ctx.isProductionMode);
2976
+ if (mapping) {
2977
+ rest.headers.set(
2978
+ `${Symbols__NS__old.MAPPING_CONFIG_HEADER_QUERY_PARAMS}${currentParam.paramName} `,
2979
+ JSON.stringify(mapping),
2980
+ );
2981
+ }
2982
+ queryParams[currentParam.paramName] = param;
2983
+ } else {
2984
+ const mapping = Mapping__NS__decode(param, !ctx.isProductionMode);
2985
+ if (mapping) {
2986
+ rest.headers.set(
2987
+ Symbols__NS__old.MAPPING_CONFIG_HEADER_QUERY_PARAMS,
2988
+ JSON.stringify(mapping),
2989
+ );
2990
+ }
2991
+ queryParams = ___NS__cloneDeep(param);
2992
+ }
2993
+ }
2994
+ if (currentParam.paramType === 'Header') {
2995
+ if (currentParam.paramName) {
2996
+ if (currentParam.paramName === Symbols__NS__old.MDC_KEY) {
2997
+ // parese MDC
2998
+ rest.headers.set(
2999
+ currentParam.paramName,
3000
+ encodeURIComponent(JSON.stringify(param)),
3001
+ );
3002
+ } else {
3003
+ rest.headers.set(currentParam.paramName, param);
3004
+ }
3005
+ } else {
3006
+ for (let header in param) {
3007
+ rest.headers.set(header, param[header]);
3008
+ }
3009
+ }
3010
+ }
3011
+ if (currentParam.paramType === 'Cookie') {
3012
+ Resource.Cookies.write(
3013
+ currentParam.paramName,
3014
+ param,
3015
+ currentParam.expireInSeconds,
3016
+ );
3017
+ }
3018
+ if (currentParam.paramType === 'Body') {
3019
+ if (currentParam.paramName) {
3020
+ if (ClassHelpers__NS__getName(bodyObject) === 'FormData') {
3021
+ throw new Error(`[taon - framework] Don use param names when posting / putting FormData.
3022
+ Use this:
3023
+ // ...
3024
+ (@Taon.Http.Param.Body() formData: FormData) ...
3025
+ // ...
3026
+
3027
+ instead
3028
+ // ...
3029
+ (@Taon.Http.Param.Body('${currentParam.paramName}') formData: FormData) ...
3030
+ // ...
3031
+ `);
3032
+ }
3033
+ const mapping = Mapping__NS__decode(param, !ctx.isProductionMode);
3034
+ if (mapping) {
3035
+ rest.headers.set(
3036
+ `${Symbols__NS__old.MAPPING_CONFIG_HEADER_BODY_PARAMS}${currentParam.paramName} `,
3037
+ JSON.stringify(mapping),
3038
+ );
3039
+ }
3040
+ bodyObject[currentParam.paramName] = param;
3041
+ } else {
3042
+ const mapping = Mapping__NS__decode(param, !ctx.isProductionMode);
3043
+ if (mapping) {
3044
+ rest.headers.set(
3045
+ Symbols__NS__old.MAPPING_CONFIG_HEADER_BODY_PARAMS,
3046
+ JSON.stringify(mapping),
3047
+ );
3048
+ }
3049
+ bodyObject = param;
3050
+ }
3051
+ }
3052
+ });
3053
+
3054
+ if (
3055
+ typeof bodyObject === 'object' &&
3056
+ ClassHelpers__NS__getName(bodyObject) !== 'FormData'
3057
+ ) {
3058
+ let circuralFromItem = [];
3059
+ bodyObject = JSON10.parse(
3060
+ JSON10.stringify(bodyObject, void 0, void 0, circs => {
3061
+ circuralFromItem = circs;
3062
+ }),
3063
+ );
3064
+ rest.headers.set(
3065
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_BODY,
3066
+ JSON10.stringify(circuralFromItem),
3067
+ );
3068
+ }
3069
+
3070
+ if (typeof queryParams === 'object') {
3071
+ let circuralFromQueryParams = [];
3072
+ queryParams = JSON10.parse(
3073
+ JSON10.stringify(queryParams, void 0, void 0, circs => {
3074
+ circuralFromQueryParams = circs;
3075
+ }),
3076
+ );
3077
+
3078
+ rest.headers.set(
3079
+ Symbols__NS__old.CIRCURAL_OBJECTS_MAP_QUERY_PARAM,
3080
+ JSON10.stringify(circuralFromQueryParams),
3081
+ );
3082
+ }
3083
+ //#endregion
3084
+
3085
+ const httpResultObj: Models__NS__Http__NS__ClientAction<any> = {
3086
+ get received() {
3087
+ return rest.model(pathPrams)[method](bodyObject, [queryParams]);
3088
+ },
3089
+ request(axiosConfig?: ModelsNg2Rest__NS__Ng2RestAxiosRequestConfig) {
3090
+ return rest
3091
+ .model(pathPrams)
3092
+ [method](bodyObject, [queryParams], axiosConfig);
3093
+ },
3094
+ };
3095
+ return httpResultObj as Models__NS__Http__NS__ClientAction<any>;
3096
+ };
3097
+ //#endregion
3098
+ }
3099
+ //#endregion
3100
+ }