@solidxai/core 0.1.2 → 0.1.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/dist/commands/run-tests.command.d.ts +37 -0
  3. package/dist/commands/run-tests.command.d.ts.map +1 -0
  4. package/dist/commands/run-tests.command.js +345 -0
  5. package/dist/commands/run-tests.command.js.map +1 -0
  6. package/dist/commands/test-data.command.d.ts +6 -6
  7. package/dist/commands/test-data.command.d.ts.map +1 -1
  8. package/dist/commands/test-data.command.js +25 -25
  9. package/dist/commands/test-data.command.js.map +1 -1
  10. package/dist/commands/test.command.d.ts +5 -0
  11. package/dist/commands/test.command.d.ts.map +1 -0
  12. package/dist/commands/test.command.js +26 -0
  13. package/dist/commands/test.command.js.map +1 -0
  14. package/dist/constants/error-messages.d.ts +1 -0
  15. package/dist/constants/error-messages.d.ts.map +1 -1
  16. package/dist/constants/error-messages.js +1 -0
  17. package/dist/constants/error-messages.js.map +1 -1
  18. package/dist/constants.d.ts +3 -3
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +12 -12
  21. package/dist/constants.js.map +1 -1
  22. package/dist/controllers/otp-authentication.controller.d.ts +1 -4
  23. package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
  24. package/dist/controllers/otp-authentication.controller.js +1 -1
  25. package/dist/controllers/role-metadata.controller.d.ts +1 -0
  26. package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
  27. package/dist/controllers/role-metadata.controller.js +15 -0
  28. package/dist/controllers/role-metadata.controller.js.map +1 -1
  29. package/dist/controllers/service.controller.d.ts +0 -9
  30. package/dist/controllers/service.controller.d.ts.map +1 -1
  31. package/dist/controllers/service.controller.js +0 -45
  32. package/dist/controllers/service.controller.js.map +1 -1
  33. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  34. package/dist/dtos/basic-filters.dto.js.map +1 -1
  35. package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
  36. package/dist/dtos/create-email-template.dto.js.map +1 -1
  37. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  38. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  39. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  40. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  41. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  42. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  43. package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
  44. package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
  45. package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
  46. package/dist/dtos/create-security-rule.dto.js.map +1 -1
  47. package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
  48. package/dist/dtos/create-sms-template.dto.js.map +1 -1
  49. package/dist/dtos/create-user.dto.d.ts +1 -0
  50. package/dist/dtos/create-user.dto.d.ts.map +1 -1
  51. package/dist/dtos/create-user.dto.js +2 -1
  52. package/dist/dtos/create-user.dto.js.map +1 -1
  53. package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
  54. package/dist/dtos/create-view-metadata.dto.js.map +1 -1
  55. package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
  56. package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
  57. package/dist/dtos/otp-sign-in.dto.js +2 -2
  58. package/dist/dtos/otp-sign-in.dto.js.map +1 -1
  59. package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
  60. package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
  61. package/dist/dtos/otp-sign-up.dto.js +2 -2
  62. package/dist/dtos/otp-sign-up.dto.js.map +1 -1
  63. package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
  64. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  65. package/dist/dtos/resolve-s3-url.dto.js +1 -13
  66. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  67. package/dist/dtos/sign-up.dto.d.ts.map +1 -1
  68. package/dist/dtos/sign-up.dto.js.map +1 -1
  69. package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
  70. package/dist/dtos/update-email-template.dto.js.map +1 -1
  71. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  72. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  73. package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
  74. package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
  75. package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
  76. package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
  77. package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
  78. package/dist/dtos/update-security-rule.dto.js.map +1 -1
  79. package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
  80. package/dist/dtos/update-sms-template.dto.js.map +1 -1
  81. package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
  82. package/dist/dtos/update-view-metadata.dto.js.map +1 -1
  83. package/dist/entities/user.entity.d.ts +1 -0
  84. package/dist/entities/user.entity.d.ts.map +1 -1
  85. package/dist/entities/user.entity.js +6 -1
  86. package/dist/entities/user.entity.js.map +1 -1
  87. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
  88. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  89. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
  90. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  91. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
  92. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  93. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
  94. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  95. package/dist/helpers/security.helper.js +1 -0
  96. package/dist/helpers/security.helper.js.map +1 -1
  97. package/dist/index.d.ts +3 -4
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +3 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/repository/solid-base.repository.d.ts +10 -1
  102. package/dist/repository/solid-base.repository.d.ts.map +1 -1
  103. package/dist/repository/solid-base.repository.js +109 -0
  104. package/dist/repository/solid-base.repository.js.map +1 -1
  105. package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
  106. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  107. package/dist/seeders/module-metadata-seeder.service.js +142 -91
  108. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  109. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  110. package/dist/seeders/module-test-data.service.js +3 -3
  111. package/dist/seeders/module-test-data.service.js.map +1 -1
  112. package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
  113. package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
  114. package/dist/seeders/permission-metadata-seeder.service.js +1 -1
  115. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  116. package/dist/seeders/seed-data/solid-core-metadata.json +12 -25
  117. package/dist/services/authentication.service.d.ts +22 -8
  118. package/dist/services/authentication.service.d.ts.map +1 -1
  119. package/dist/services/authentication.service.js +228 -214
  120. package/dist/services/authentication.service.js.map +1 -1
  121. package/dist/services/chatter-message.service.d.ts +2 -0
  122. package/dist/services/chatter-message.service.d.ts.map +1 -1
  123. package/dist/services/chatter-message.service.js +18 -2
  124. package/dist/services/chatter-message.service.js.map +1 -1
  125. package/dist/services/crud-helper.service.d.ts +4 -0
  126. package/dist/services/crud-helper.service.d.ts.map +1 -1
  127. package/dist/services/crud-helper.service.js +66 -32
  128. package/dist/services/crud-helper.service.js.map +1 -1
  129. package/dist/services/crud.service.d.ts.map +1 -1
  130. package/dist/services/crud.service.js +7 -4
  131. package/dist/services/crud.service.js.map +1 -1
  132. package/dist/services/field-metadata.service.d.ts.map +1 -1
  133. package/dist/services/field-metadata.service.js.map +1 -1
  134. package/dist/services/file/disk-file.service.d.ts +0 -2
  135. package/dist/services/file/disk-file.service.d.ts.map +1 -1
  136. package/dist/services/file/disk-file.service.js +7 -16
  137. package/dist/services/file/disk-file.service.js.map +1 -1
  138. package/dist/services/file/index.d.ts +1 -0
  139. package/dist/services/file/index.d.ts.map +1 -1
  140. package/dist/services/file/index.js +1 -0
  141. package/dist/services/file/index.js.map +1 -1
  142. package/dist/services/file/storage-path-builder.d.ts +17 -0
  143. package/dist/services/file/storage-path-builder.d.ts.map +1 -0
  144. package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
  145. package/dist/services/file/storage-path-builder.js.map +1 -0
  146. package/dist/services/media.service.d.ts +1 -1
  147. package/dist/services/media.service.d.ts.map +1 -1
  148. package/dist/services/media.service.js +45 -6
  149. package/dist/services/media.service.js.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  151. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  152. package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
  153. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  154. package/dist/services/module-metadata.service.d.ts +4 -6
  155. package/dist/services/module-metadata.service.d.ts.map +1 -1
  156. package/dist/services/module-metadata.service.js +16 -14
  157. package/dist/services/module-metadata.service.js.map +1 -1
  158. package/dist/services/queues/common.d.ts +3 -0
  159. package/dist/services/queues/common.d.ts.map +1 -0
  160. package/dist/services/queues/common.js +39 -0
  161. package/dist/services/queues/common.js.map +1 -0
  162. package/dist/services/queues/database-publisher.service.d.ts.map +1 -1
  163. package/dist/services/queues/database-publisher.service.js +3 -1
  164. package/dist/services/queues/database-publisher.service.js.map +1 -1
  165. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  166. package/dist/services/queues/database-subscriber.service.js +5 -2
  167. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  168. package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
  169. package/dist/services/queues/rabbitmq-publisher.service.js +13 -6
  170. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  171. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  172. package/dist/services/queues/rabbitmq-subscriber.service.js +9 -5
  173. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  174. package/dist/services/setting.service.d.ts +3 -2
  175. package/dist/services/setting.service.d.ts.map +1 -1
  176. package/dist/services/setting.service.js +7 -4
  177. package/dist/services/setting.service.js.map +1 -1
  178. package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
  179. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  180. package/dist/services/settings/default-settings-provider.service.js +8 -6
  181. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  182. package/dist/solid-core.module.d.ts +3 -1
  183. package/dist/solid-core.module.d.ts.map +1 -1
  184. package/dist/solid-core.module.js +49 -9
  185. package/dist/solid-core.module.js.map +1 -1
  186. package/dist/testing/__examples__/register-example-specs.d.ts +3 -0
  187. package/dist/testing/__examples__/register-example-specs.d.ts.map +1 -0
  188. package/dist/testing/__examples__/register-example-specs.js +8 -0
  189. package/dist/testing/__examples__/register-example-specs.js.map +1 -0
  190. package/dist/testing/__examples__/specs/custom-health.spec.d.ts +17 -0
  191. package/dist/testing/__examples__/specs/custom-health.spec.d.ts.map +1 -0
  192. package/dist/testing/__examples__/specs/custom-health.spec.js +30 -0
  193. package/dist/testing/__examples__/specs/custom-health.spec.js.map +1 -0
  194. package/dist/testing/adapters/api/api-adapter.d.ts +9 -0
  195. package/dist/testing/adapters/api/api-adapter.d.ts.map +1 -0
  196. package/dist/testing/adapters/api/api-adapter.js +76 -0
  197. package/dist/testing/adapters/api/api-adapter.js.map +1 -0
  198. package/dist/testing/adapters/api/api.types.d.ts +14 -0
  199. package/dist/testing/adapters/api/api.types.d.ts.map +1 -0
  200. package/dist/testing/adapters/api/api.types.js +3 -0
  201. package/dist/testing/adapters/api/api.types.js.map +1 -0
  202. package/dist/testing/adapters/ui/playwright-adapter.d.ts +14 -0
  203. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -0
  204. package/dist/testing/adapters/ui/playwright-adapter.js +80 -0
  205. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -0
  206. package/dist/testing/adapters/ui/ui.types.d.ts +5 -0
  207. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -0
  208. package/dist/testing/adapters/ui/ui.types.js +3 -0
  209. package/dist/testing/adapters/ui/ui.types.js.map +1 -0
  210. package/dist/testing/contracts/runtime-context.types.d.ts +35 -0
  211. package/dist/testing/contracts/runtime-context.types.d.ts.map +1 -0
  212. package/dist/testing/contracts/runtime-context.types.js +3 -0
  213. package/dist/testing/contracts/runtime-context.types.js.map +1 -0
  214. package/dist/testing/contracts/test-spec.types.d.ts +21 -0
  215. package/dist/testing/contracts/test-spec.types.d.ts.map +1 -0
  216. package/dist/testing/contracts/test-spec.types.js +3 -0
  217. package/dist/testing/contracts/test-spec.types.js.map +1 -0
  218. package/dist/testing/contracts/testing-metadata.types.d.ts +41 -0
  219. package/dist/testing/contracts/testing-metadata.types.d.ts.map +1 -0
  220. package/dist/testing/contracts/testing-metadata.types.js +3 -0
  221. package/dist/testing/contracts/testing-metadata.types.js.map +1 -0
  222. package/dist/testing/core/interpolation.d.ts +4 -0
  223. package/dist/testing/core/interpolation.d.ts.map +1 -0
  224. package/dist/testing/core/interpolation.js +180 -0
  225. package/dist/testing/core/interpolation.js.map +1 -0
  226. package/dist/testing/core/normalize-steps.d.ts +7 -0
  227. package/dist/testing/core/normalize-steps.d.ts.map +1 -0
  228. package/dist/testing/core/normalize-steps.js +20 -0
  229. package/dist/testing/core/normalize-steps.js.map +1 -0
  230. package/dist/testing/core/resource-store.d.ts +8 -0
  231. package/dist/testing/core/resource-store.d.ts.map +1 -0
  232. package/dist/testing/core/resource-store.js +41 -0
  233. package/dist/testing/core/resource-store.js.map +1 -0
  234. package/dist/testing/core/spec-registry.d.ts +10 -0
  235. package/dist/testing/core/spec-registry.d.ts.map +1 -0
  236. package/dist/testing/core/spec-registry.js +32 -0
  237. package/dist/testing/core/spec-registry.js.map +1 -0
  238. package/dist/testing/core/step-registry.d.ts +10 -0
  239. package/dist/testing/core/step-registry.d.ts.map +1 -0
  240. package/dist/testing/core/step-registry.js +26 -0
  241. package/dist/testing/core/step-registry.js.map +1 -0
  242. package/dist/testing/core/testing-engine.d.ts +14 -0
  243. package/dist/testing/core/testing-engine.d.ts.map +1 -0
  244. package/dist/testing/core/testing-engine.js +97 -0
  245. package/dist/testing/core/testing-engine.js.map +1 -0
  246. package/dist/testing/core/timeout.d.ts +2 -0
  247. package/dist/testing/core/timeout.d.ts.map +1 -0
  248. package/dist/testing/core/timeout.js +18 -0
  249. package/dist/testing/core/timeout.js.map +1 -0
  250. package/dist/testing/reporter/attachments.d.ts +4 -0
  251. package/dist/testing/reporter/attachments.d.ts.map +1 -0
  252. package/dist/testing/reporter/attachments.js +25 -0
  253. package/dist/testing/reporter/attachments.js.map +1 -0
  254. package/dist/testing/reporter/console-reporter.d.ts +45 -0
  255. package/dist/testing/reporter/console-reporter.d.ts.map +1 -0
  256. package/dist/testing/reporter/console-reporter.js +189 -0
  257. package/dist/testing/reporter/console-reporter.js.map +1 -0
  258. package/dist/testing/reporter/reporter.types.d.ts +37 -0
  259. package/dist/testing/reporter/reporter.types.d.ts.map +1 -0
  260. package/dist/testing/reporter/reporter.types.js +3 -0
  261. package/dist/testing/reporter/reporter.types.js.map +1 -0
  262. package/dist/testing/runner/lifecycle.d.ts +9 -0
  263. package/dist/testing/runner/lifecycle.d.ts.map +1 -0
  264. package/dist/testing/runner/lifecycle.js +33 -0
  265. package/dist/testing/runner/lifecycle.js.map +1 -0
  266. package/dist/testing/runner/run-from-metadata.d.ts +24 -0
  267. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -0
  268. package/dist/testing/runner/run-from-metadata.js +70 -0
  269. package/dist/testing/runner/run-from-metadata.js.map +1 -0
  270. package/dist/testing/runner/scenario-filter.d.ts +9 -0
  271. package/dist/testing/runner/scenario-filter.d.ts.map +1 -0
  272. package/dist/testing/runner/scenario-filter.js +22 -0
  273. package/dist/testing/runner/scenario-filter.js.map +1 -0
  274. package/dist/testing/steps/api/auth.step.d.ts +3 -0
  275. package/dist/testing/steps/api/auth.step.d.ts.map +1 -0
  276. package/dist/testing/steps/api/auth.step.js +38 -0
  277. package/dist/testing/steps/api/auth.step.js.map +1 -0
  278. package/dist/testing/steps/api/index.d.ts +3 -0
  279. package/dist/testing/steps/api/index.d.ts.map +1 -0
  280. package/dist/testing/steps/api/index.js +10 -0
  281. package/dist/testing/steps/api/index.js.map +1 -0
  282. package/dist/testing/steps/api/request.step.d.ts +3 -0
  283. package/dist/testing/steps/api/request.step.d.ts.map +1 -0
  284. package/dist/testing/steps/api/request.step.js +281 -0
  285. package/dist/testing/steps/api/request.step.js.map +1 -0
  286. package/dist/testing/steps/assert/http.step.d.ts +3 -0
  287. package/dist/testing/steps/assert/http.step.d.ts.map +1 -0
  288. package/dist/testing/steps/assert/http.step.js +27 -0
  289. package/dist/testing/steps/assert/http.step.js.map +1 -0
  290. package/dist/testing/steps/assert/index.d.ts +3 -0
  291. package/dist/testing/steps/assert/index.d.ts.map +1 -0
  292. package/dist/testing/steps/assert/index.js +12 -0
  293. package/dist/testing/steps/assert/index.js.map +1 -0
  294. package/dist/testing/steps/assert/jsonpath.step.d.ts +3 -0
  295. package/dist/testing/steps/assert/jsonpath.step.d.ts.map +1 -0
  296. package/dist/testing/steps/assert/jsonpath.step.js +40 -0
  297. package/dist/testing/steps/assert/jsonpath.step.js.map +1 -0
  298. package/dist/testing/steps/assert/primitives.step.d.ts +3 -0
  299. package/dist/testing/steps/assert/primitives.step.d.ts.map +1 -0
  300. package/dist/testing/steps/assert/primitives.step.js +43 -0
  301. package/dist/testing/steps/assert/primitives.step.js.map +1 -0
  302. package/dist/testing/steps/test/index.d.ts +3 -0
  303. package/dist/testing/steps/test/index.d.ts.map +1 -0
  304. package/dist/testing/steps/test/index.js +8 -0
  305. package/dist/testing/steps/test/index.js.map +1 -0
  306. package/dist/testing/steps/test/test-spec.step.d.ts +3 -0
  307. package/dist/testing/steps/test/test-spec.step.d.ts.map +1 -0
  308. package/dist/testing/steps/test/test-spec.step.js +41 -0
  309. package/dist/testing/steps/test/test-spec.step.js.map +1 -0
  310. package/dist/testing/steps/ui/actions.step.d.ts +3 -0
  311. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -0
  312. package/dist/testing/steps/ui/actions.step.js +31 -0
  313. package/dist/testing/steps/ui/actions.step.js.map +1 -0
  314. package/dist/testing/steps/ui/assertions.step.d.ts +3 -0
  315. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -0
  316. package/dist/testing/steps/ui/assertions.step.js +41 -0
  317. package/dist/testing/steps/ui/assertions.step.js.map +1 -0
  318. package/dist/testing/steps/ui/form.step.d.ts +3 -0
  319. package/dist/testing/steps/ui/form.step.d.ts.map +1 -0
  320. package/dist/testing/steps/ui/form.step.js +34 -0
  321. package/dist/testing/steps/ui/form.step.js.map +1 -0
  322. package/dist/testing/steps/ui/index.d.ts +3 -0
  323. package/dist/testing/steps/ui/index.d.ts.map +1 -0
  324. package/dist/testing/steps/ui/index.js +14 -0
  325. package/dist/testing/steps/ui/index.js.map +1 -0
  326. package/dist/testing/steps/ui/navigation.step.d.ts +3 -0
  327. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -0
  328. package/dist/testing/steps/ui/navigation.step.js +39 -0
  329. package/dist/testing/steps/ui/navigation.step.js.map +1 -0
  330. package/dist/testing/steps/util/index.d.ts +3 -0
  331. package/dist/testing/steps/util/index.d.ts.map +1 -0
  332. package/dist/testing/steps/util/index.js +12 -0
  333. package/dist/testing/steps/util/index.js.map +1 -0
  334. package/dist/testing/steps/util/log.step.d.ts +3 -0
  335. package/dist/testing/steps/util/log.step.d.ts.map +1 -0
  336. package/dist/testing/steps/util/log.step.js +18 -0
  337. package/dist/testing/steps/util/log.step.js.map +1 -0
  338. package/dist/testing/steps/util/require.step.d.ts +3 -0
  339. package/dist/testing/steps/util/require.step.d.ts.map +1 -0
  340. package/dist/testing/steps/util/require.step.js +16 -0
  341. package/dist/testing/steps/util/require.step.js.map +1 -0
  342. package/dist/testing/steps/util/sleep.step.d.ts +3 -0
  343. package/dist/testing/steps/util/sleep.step.d.ts.map +1 -0
  344. package/dist/testing/steps/util/sleep.step.js +13 -0
  345. package/dist/testing/steps/util/sleep.step.js.map +1 -0
  346. package/docs/test-data-workflow.md +51 -11
  347. package/package.json +10 -2
  348. package/src/commands/run-tests.command.ts +278 -0
  349. package/src/commands/test-data.command.ts +26 -26
  350. package/src/commands/test.command.ts +14 -0
  351. package/src/constants/error-messages.ts +1 -0
  352. package/src/constants.ts +3 -3
  353. package/src/controllers/role-metadata.controller.ts +26 -18
  354. package/src/controllers/service.controller.ts +58 -59
  355. package/src/dtos/basic-filters.dto.ts +0 -2
  356. package/src/dtos/create-email-template.dto.ts +7 -0
  357. package/src/dtos/create-list-of-values.dto.ts +7 -0
  358. package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
  359. package/src/dtos/create-role-metadata.dto.ts +9 -0
  360. package/src/dtos/create-scheduled-job.dto.ts +14 -0
  361. package/src/dtos/create-security-rule.dto.ts +6 -0
  362. package/src/dtos/create-sms-template.dto.ts +6 -0
  363. package/src/dtos/create-user.dto.ts +1 -0
  364. package/src/dtos/create-view-metadata.dto.ts +11 -0
  365. package/src/dtos/otp-sign-in.dto.ts +3 -3
  366. package/src/dtos/otp-sign-up.dto.ts +3 -3
  367. package/src/dtos/resolve-s3-url.dto.ts +2 -12
  368. package/src/dtos/sign-up.dto.ts +0 -2
  369. package/src/dtos/update-email-template.dto.ts +6 -0
  370. package/src/dtos/update-list-of-values.dto.ts +8 -0
  371. package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
  372. package/src/dtos/update-scheduled-job.dto.ts +15 -0
  373. package/src/dtos/update-security-rule.dto.ts +7 -0
  374. package/src/dtos/update-sms-template.dto.ts +32 -32
  375. package/src/dtos/update-view-metadata.dto.ts +12 -0
  376. package/src/entities/user.entity.ts +3 -0
  377. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
  378. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
  379. package/src/helpers/security.helper.ts +1 -1
  380. package/src/index.ts +3 -4
  381. package/src/repository/solid-base.repository.ts +172 -1
  382. package/src/seeders/module-metadata-seeder.service.ts +191 -150
  383. package/src/seeders/module-test-data.service.ts +5 -3
  384. package/src/seeders/permission-metadata-seeder.service.ts +1 -4
  385. package/src/seeders/seed-data/solid-core-metadata.json +12 -25
  386. package/src/services/authentication.service.ts +268 -266
  387. package/src/services/chatter-message.service.ts +18 -1
  388. package/src/services/crud-helper.service.ts +79 -36
  389. package/src/services/crud.service.ts +10 -4
  390. package/src/services/field-metadata.service.ts +0 -71
  391. package/src/services/file/disk-file.service.ts +8 -18
  392. package/src/services/file/index.ts +1 -0
  393. package/src/services/file/storage-path-builder.ts +56 -0
  394. package/src/services/media.service.ts +13 -7
  395. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
  396. package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
  397. package/src/services/module-metadata.service.ts +18 -15
  398. package/src/services/queues/common.ts +75 -0
  399. package/src/services/queues/database-publisher.service.ts +4 -1
  400. package/src/services/queues/database-subscriber.service.ts +5 -3
  401. package/src/services/queues/rabbitmq-publisher.service.ts +17 -7
  402. package/src/services/queues/rabbitmq-subscriber.service.ts +9 -5
  403. package/src/services/setting.service.ts +5 -3
  404. package/src/services/settings/default-settings-provider.service.ts +5 -3
  405. package/src/solid-core.module.ts +20 -12
  406. package/src/testing/README.md +364 -0
  407. package/src/testing/__examples__/register-example-specs.ts +6 -0
  408. package/src/testing/__examples__/specs/custom-health.spec.ts +29 -0
  409. package/src/testing/__examples__/testing.sample.json +82 -0
  410. package/src/testing/adapters/api/api-adapter.ts +85 -0
  411. package/src/testing/adapters/api/api.types.ts +15 -0
  412. package/src/testing/adapters/ui/playwright-adapter.ts +54 -0
  413. package/src/testing/adapters/ui/ui.types.ts +4 -0
  414. package/src/testing/contracts/runtime-context.types.ts +36 -0
  415. package/src/testing/contracts/test-spec.types.ts +24 -0
  416. package/src/testing/contracts/testing-metadata.types.ts +46 -0
  417. package/src/testing/core/interpolation.ts +189 -0
  418. package/src/testing/core/normalize-steps.ts +21 -0
  419. package/src/testing/core/resource-store.ts +38 -0
  420. package/src/testing/core/spec-registry.ts +33 -0
  421. package/src/testing/core/step-registry.ts +27 -0
  422. package/src/testing/core/testing-engine.ts +127 -0
  423. package/src/testing/core/timeout.ts +19 -0
  424. package/src/testing/reporter/attachments.ts +25 -0
  425. package/src/testing/reporter/console-reporter.ts +229 -0
  426. package/src/testing/reporter/reporter.types.ts +36 -0
  427. package/src/testing/runner/lifecycle.ts +31 -0
  428. package/src/testing/runner/run-from-metadata.ts +87 -0
  429. package/src/testing/runner/scenario-filter.ts +33 -0
  430. package/src/testing/steps/api/auth.step.ts +66 -0
  431. package/src/testing/steps/api/index.ts +10 -0
  432. package/src/testing/steps/api/request.step.ts +358 -0
  433. package/src/testing/steps/assert/http.step.ts +33 -0
  434. package/src/testing/steps/assert/index.ts +12 -0
  435. package/src/testing/steps/assert/jsonpath.step.ts +50 -0
  436. package/src/testing/steps/assert/primitives.step.ts +69 -0
  437. package/src/testing/steps/test/index.ts +8 -0
  438. package/src/testing/steps/test/test-spec.step.ts +52 -0
  439. package/src/testing/steps/ui/actions.step.ts +36 -0
  440. package/src/testing/steps/ui/assertions.step.ts +54 -0
  441. package/src/testing/steps/ui/form.step.ts +39 -0
  442. package/src/testing/steps/ui/index.ts +12 -0
  443. package/src/testing/steps/ui/navigation.step.ts +53 -0
  444. package/src/testing/steps/util/index.ts +10 -0
  445. package/src/testing/steps/util/log.step.ts +19 -0
  446. package/src/testing/steps/util/require.step.ts +16 -0
  447. package/src/testing/steps/util/sleep.step.ts +15 -0
  448. package/tsconfig.json +35 -25
  449. package/tsconfig.tests.json +14 -0
  450. package/dist/passport-strategies/local.strategy.d.ts +0 -15
  451. package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
  452. package/dist/passport-strategies/local.strategy.js +0 -44
  453. package/dist/passport-strategies/local.strategy.js.map +0 -1
  454. package/dist/seeders/email-template-seeder.service.d.ts +0 -10
  455. package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
  456. package/dist/seeders/email-template-seeder.service.js +0 -84
  457. package/dist/seeders/email-template-seeder.service.js.map +0 -1
  458. package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
  459. package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
  460. package/dist/seeders/sms-template-seeder.service.js.map +0 -1
  461. package/dist/seeders/user-seeder.service.d.ts +0 -10
  462. package/dist/seeders/user-seeder.service.d.ts.map +0 -1
  463. package/dist/seeders/user-seeder.service.js +0 -44
  464. package/dist/seeders/user-seeder.service.js.map +0 -1
  465. package/dist/tsconfig.tsbuildinfo +0 -1
  466. package/src/passport-strategies/local.strategy.ts +0 -28
  467. package/src/seeders/email-template-seeder.service.ts +0 -49
  468. package/src/seeders/sms-template-seeder.service.ts +0 -50
  469. package/src/seeders/user-seeder.service.ts +0 -33
@@ -7,7 +7,9 @@ import { MediaStorageProvider } from "src/interfaces";
7
7
  import { MediaRepository } from "src/repository/media.repository";
8
8
  import { DiskFileService } from "src/services/file";
9
9
  import { Readable } from "stream";
10
+ import * as path from "path";
10
11
  import { SettingService } from "../setting.service";
12
+ import { DEFAULT_MEDIA_FILE_STORAGE_DIR } from "src/services/settings/default-settings-provider.service";
11
13
  import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
12
14
 
13
15
  @Injectable()
@@ -34,7 +36,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
34
36
  // media.forEach(m => {
35
37
  // });
36
38
  for (const m of media) {
37
- m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>("baseUrl")}/${await this.getFullFilePath(m.relativeUri)}`;
39
+ m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>("baseUrl")}/${this.getFullFilePath(m.relativeUri)}`;
38
40
  }
39
41
 
40
42
 
@@ -48,7 +50,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
48
50
  const result: Media[] = [];
49
51
  for (const file of files) {
50
52
  // Store the file in the configured file storage directory
51
- const fileStoragePath = await this.getFullFilePath(this.getFileName(file));
53
+ const fileStoragePath = this.getFullFilePath(this.getFileName(file));
52
54
  await this.fileService.copy(file.path, fileStoragePath);
53
55
  await this.fileService.delete(file.path);
54
56
 
@@ -78,7 +80,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
78
80
  for (const pair of streamPairs) {
79
81
  const stream = pair[0];
80
82
  const fileName = pair[1];
81
- await this.fileService.writeStream(await this.getFullFilePath(fileName), stream);
83
+ await this.fileService.writeStream(this.getFullFilePath(fileName), stream);
82
84
  const mediaEntity = await this.mediaRepository.createMedia({
83
85
  //@ts-ignore
84
86
  entityId: entity.id,
@@ -102,16 +104,19 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
102
104
  this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
103
105
 
104
106
  for (const media of existingMedia) {
105
- await this.fileService.delete(await this.getFullFilePath(media.relativeUri));
107
+ await this.fileService.delete(this.getFullFilePath(media.relativeUri));
106
108
  }
107
109
  // existingMedia.forEach(media => {
108
110
  // });
109
111
  }
110
112
 
111
- private async getFullFilePath(fileName: string): Promise<string> {
112
- const fileStorageDir = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
113
- return `${fileStorageDir}/${fileName}`;
114
- // return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;
113
+ private getFullFilePath(fileName: string): string {
114
+ const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
115
+ || DEFAULT_MEDIA_FILE_STORAGE_DIR;
116
+ if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
117
+ return fileName;
118
+ }
119
+ return `${base}/${fileName}`;
115
120
  }
116
121
 
117
122
  private getFileName(file: Express.Multer.File): string {
@@ -1,14 +1,19 @@
1
1
  import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
2
- import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
3
- import { DataSource, EntityManager, Repository, SelectQueryBuilder } from 'typeorm';
2
+ import { InjectDataSource } from '@nestjs/typeorm';
3
+ import { DEFAULT_MEDIA_FILE_STORAGE_DIR } from "src/services/settings/default-settings-provider.service";
4
+ import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
5
+ import { DataSource, EntityManager, SelectQueryBuilder } from 'typeorm';
4
6
  import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
5
7
  import { ModuleMetadata } from '../entities/module-metadata.entity';
6
- import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
7
8
 
8
- import { classify, dasherize } from '@angular-devkit/core/src/utils/strings';
9
+ import { classify } from '@angular-devkit/core/src/utils/strings';
9
10
  import { ConfigService } from '@nestjs/config';
10
11
  import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
11
12
  import * as path from 'path'; // To handle file paths
13
+ import { ERROR_MESSAGES } from 'src/constants/error-messages';
14
+ import { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';
15
+ import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
16
+ import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
12
17
  import { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';
13
18
  import { DiskFileService } from 'src/services/file';
14
19
  import { BasicFilterDto } from '../dtos/basic-filters.dto';
@@ -21,11 +26,6 @@ import { SolidRegistry } from '../helpers/solid-registry';
21
26
  import { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';
22
27
  import { CrudHelperService } from './crud-helper.service';
23
28
  import { ModelMetadataService } from './model-metadata.service';
24
- import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
25
- import { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';
26
- import { ERROR_MESSAGES } from 'src/constants/error-messages';
27
- import Module from 'module';
28
- import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
29
29
  import { SettingService } from './setting.service';
30
30
 
31
31
  @Injectable()
@@ -40,7 +40,6 @@ export class ModuleMetadataService {
40
40
  private readonly moduleMetadataRepo: ModuleMetadataRepository,
41
41
  private readonly crudHelperService: CrudHelperService,
42
42
  private readonly schematicService: SchematicService,
43
- private readonly configService: ConfigService,
44
43
  private readonly fileService: DiskFileService,
45
44
  private readonly settingService: SettingService,
46
45
 
@@ -133,7 +132,7 @@ export class ModuleMetadataService {
133
132
 
134
133
  async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {
135
134
  if (files.length > 0) {
136
- const fileStoragePath = await this.getFileSysytemFullFilePath(this.getFileName(files[0]));
135
+ const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));
137
136
  this.fileService.copy(files[0].path, fileStoragePath);
138
137
  this.fileService.delete(files[0].path);
139
138
  createDto.menuIconUrl = fileStoragePath;
@@ -239,7 +238,7 @@ export class ModuleMetadataService {
239
238
  }
240
239
  if (files.length > 0) {
241
240
 
242
- const fileStoragePath = await this.getFileSysytemFullFilePath(this.getFileName(files[0]));
241
+ const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));
243
242
  this.fileService.copy(files[0].path, fileStoragePath);
244
243
  this.fileService.delete(files[0].path);
245
244
  module.menuIconUrl = fileStoragePath;
@@ -464,9 +463,13 @@ export class ModuleMetadataService {
464
463
  return outputLines.join('\n');
465
464
  }
466
465
 
467
- private async getFileSysytemFullFilePath(fileName: string): Promise<string> {
468
- const fileStorageDir = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
469
- return `${fileStorageDir}/${fileName}`;
466
+ private getFullFilePathForDisk(fileName: string): string {
467
+ const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
468
+ || DEFAULT_MEDIA_FILE_STORAGE_DIR;
469
+ if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
470
+ return fileName;
471
+ }
472
+ return `${base}/${fileName}`;
470
473
  }
471
474
 
472
475
  private getFileName(file: Express.Multer.File): string {
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Convert a string into a lower-case slug separated by a join character.
3
+ *
4
+ * Logic:
5
+ * - Keep only ASCII letters and digits.
6
+ * - Convert A-Z to a-z.
7
+ * - Replace runs of non-alphanumeric characters with a single join character.
8
+ * - Trim leading/trailing join characters.
9
+ *
10
+ * Examples (joinChar "_"):
11
+ * - "Venue App" -> "venue_app"
12
+ * - "My-App@2025" -> "my_app_2025"
13
+ * - " CORE__API!! " -> "core_api"
14
+ *
15
+ * Examples (joinChar "-"):
16
+ * - "Venue App" -> "venue-app"
17
+ */
18
+ export function toSlug(value?: string | null, joinChar: string = '-'): string {
19
+ if (!value) {
20
+ return '';
21
+ }
22
+
23
+ const slugChars: string[] = [];
24
+ let lastJoin = true;
25
+
26
+ for (let i = 0; i < value.length; i += 1) {
27
+ const code = value.charCodeAt(i);
28
+
29
+ // ASCII uppercase -> lowercase
30
+ if (code >= 65 && code <= 90) {
31
+ slugChars.push(String.fromCharCode(code + 32));
32
+ lastJoin = false;
33
+ continue;
34
+ }
35
+
36
+ // ASCII lowercase letters or digits are kept as-is
37
+ if ((code >= 97 && code <= 122) || (code >= 48 && code <= 57)) {
38
+ slugChars.push(value[i]);
39
+ lastJoin = false;
40
+ continue;
41
+ }
42
+
43
+ // Any other char becomes a single join character (collapse runs)
44
+ if (!lastJoin && slugChars.length > 0) {
45
+ slugChars.push(joinChar);
46
+ lastJoin = true;
47
+ }
48
+ }
49
+
50
+ if (slugChars.length && slugChars[slugChars.length - 1] === joinChar) {
51
+ slugChars.pop();
52
+ }
53
+
54
+ return slugChars.join('');
55
+ }
56
+
57
+ /**
58
+ * Build a namespaced queue name by prefixing the queue name with the
59
+ * slugged app name, the slugged env, and underscores.
60
+ *
61
+ * Examples:
62
+ * - appName "Venue App", env "Prod", queue "orders" -> "venue_app_prod_orders"
63
+ * - appName "core-api", env "staging", queue "sync" -> "core_api_staging_sync"
64
+ * - appName "" or undefined, env "" or undefined, queue "jobs" -> "_dev_jobs"
65
+ */
66
+ export function buildNamespacedQueueName(
67
+ queueName: string,
68
+ appName: string | undefined | null = process.env.SOLID_APP_NAME,
69
+ env: string | undefined | null = process.env.ENV,
70
+ ): string {
71
+ const appNameSlug = toSlug(appName, '_');
72
+ const envValue = env && env.length > 0 ? env : (process.env.ENV && process.env.ENV.length > 0 ? process.env.ENV : 'dev');
73
+ const envSlug = toSlug(envValue, '_');
74
+ return `${appNameSlug}_${envSlug}_${queueName}`;
75
+ }
@@ -4,6 +4,7 @@ import { QueuesModuleOptions } from "../../interfaces";
4
4
  import { QueueMessage, QueuePublisher } from '../../interfaces/mq';
5
5
  import { MqMessageQueueService } from '../mq-message-queue.service';
6
6
  import { MqMessageService } from '../mq-message.service';
7
+ import { buildNamespacedQueueName } from './common';
7
8
 
8
9
  export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
9
10
  private readonly logger = new Logger(DatabasePublisher.name);
@@ -38,6 +39,8 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
38
39
  const options = this.options();
39
40
 
40
41
  const queueName = options.queueName;
42
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
43
+
41
44
  if (!message.retryCount) message.retryCount = 0;
42
45
  if (!message.retryInterval) message.retryInterval = 1000;
43
46
 
@@ -45,7 +48,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
45
48
  message.messageId = uuidv4();
46
49
 
47
50
  // Save the message to the DB so that we can then change its status in the subscriber...
48
- await this.persistToDatabase(queueName, message);
51
+ await this.persistToDatabase(namespacedQueueName, message);
49
52
 
50
53
  // return the newly created message id.
51
54
  return message.messageId;
@@ -4,7 +4,7 @@ import { QueueMessage, QueueSubscriber } from '../../interfaces/mq';
4
4
  import { MqMessageQueueService } from '../mq-message-queue.service';
5
5
  import { MqMessageService } from '../mq-message.service';
6
6
  import { PollerService } from '../poller.service';
7
-
7
+ import { buildNamespacedQueueName } from './common';
8
8
 
9
9
  export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscriber<T> {
10
10
  private readonly logger = new Logger(DatabaseSubscriber.name);
@@ -97,7 +97,8 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
97
97
  }
98
98
  }
99
99
 
100
- this.poller.start(queueName, (q) => this.processNext(q), {
100
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
101
+ this.poller.start(namespacedQueueName, (q) => this.processNext(q), {
101
102
  baseDelayMs: 1000,
102
103
  maxDelayMs: 30_000,
103
104
  timeoutPerIterationMs: 5 * 60_000,
@@ -111,7 +112,8 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
111
112
  onModuleDestroy() {
112
113
  const options = this.options();
113
114
  const queueName = options.queueName;
114
- this.poller.stop(queueName);
115
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
116
+ this.poller.stop(namespacedQueueName);
115
117
  }
116
118
 
117
119
  /**
@@ -5,6 +5,7 @@ import { QueuesModuleOptions } from "../../interfaces";
5
5
  import { QueueMessage, QueuePublisher } from '../../interfaces/mq';
6
6
  import { MqMessageQueueService } from '../mq-message-queue.service';
7
7
  import { MqMessageService } from '../mq-message.service';
8
+ import { buildNamespacedQueueName } from './common';
8
9
 
9
10
  export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePublisher<T> {
10
11
  private readonly logger = new Logger(RabbitMqPublisher.name);
@@ -70,13 +71,21 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
70
71
 
71
72
  const channel = await conn.createChannel();
72
73
 
74
+ channel.on('return', (msg) => {
75
+ const content = msg.content?.toString?.() ?? '';
76
+ this.logger.warn(
77
+ `RabbitMqPublisher message returned from exchange ${msg.fields.exchange} with routingKey ${msg.fields.routingKey}: ${content}`,
78
+ );
79
+ });
80
+
73
81
  const options = this.options();
74
82
  const queueName = options.queueName;
75
- const exchangeName = `${queueName}.exchange`;
76
- const routingKey = `${queueName}.routing-key`;
83
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
84
+ const exchangeName = `${namespacedQueueName}.exchange`;
85
+ const routingKey = `${namespacedQueueName}.routing-key`;
77
86
 
78
87
  await channel.assertExchange(exchangeName, 'direct', {});
79
- const queue = await channel.assertQueue(queueName, {});
88
+ const queue = await channel.assertQueue(namespacedQueueName, {});
80
89
  await channel.bindQueue(queue.queue, exchangeName, routingKey);
81
90
 
82
91
  this.connection = conn;
@@ -127,7 +136,6 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
127
136
  }
128
137
  }
129
138
 
130
-
131
139
  async publish(message: QueueMessage<T>): Promise<string> {
132
140
  if (!this.url) {
133
141
  this.logger.error('RabbitMqPublisher url is not defined in the environment variables');
@@ -148,8 +156,10 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
148
156
  const options = this.options();
149
157
 
150
158
  const queueName = options.queueName;
151
- const exchangeName = `${queueName}.exchange`;
152
- const routingKey = `${queueName}.routing-key`;
159
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
160
+
161
+ const exchangeName = `${namespacedQueueName}.exchange`;
162
+ const routingKey = `${namespacedQueueName}.routing-key`;
153
163
 
154
164
  // Set default values for retry.
155
165
  // by default there are no retries.
@@ -160,7 +170,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
160
170
  message.messageId = uuidv4();
161
171
 
162
172
  // Save the message to the DB so that we can then change its status in the subscriber...
163
- await this.persistToDatabase(queueName, message);
173
+ await this.persistToDatabase(namespacedQueueName, message);
164
174
 
165
175
  // wait for the channel to confirm
166
176
  try {
@@ -4,6 +4,7 @@ import { QueuesModuleOptions } from "../../interfaces";
4
4
  import { QueueMessage, QueueSubscriber } from '../../interfaces/mq';
5
5
  import { MqMessageQueueService } from '../mq-message-queue.service';
6
6
  import { MqMessageService } from '../mq-message.service';
7
+ import { buildNamespacedQueueName } from './common';
7
8
 
8
9
 
9
10
  export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscriber<T> { // TODO This can be made a generic type for better type visibility
@@ -80,19 +81,21 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
80
81
  }
81
82
  }
82
83
 
84
+ const namespacedQueueName = buildNamespacedQueueName(queueName);
83
85
  try {
84
- await this.connectAndConsume(queueName);
86
+ await this.connectAndConsume(namespacedQueueName);
85
87
  } catch (err) {
86
- this.logger.error(`Failed to connect to RabbitMQ for queue ${queueName}: ${(err as Error).message}`, (err as Error).stack);
87
- this.triggerReconnect(queueName, 'initial connection failure');
88
+ this.logger.error(`Failed to connect to RabbitMQ for queue ${namespacedQueueName}: ${(err as Error).message}`, (err as Error).stack);
89
+ this.triggerReconnect(namespacedQueueName, 'initial connection failure');
88
90
  }
89
91
 
90
- this.logger.log(`RabbitMqSubscriber ready to consume messages: ${JSON.stringify(this.options())} and url: ${this.url}`);
92
+ this.logger.log(`RabbitMqSubscriber ready to consume messages: ${JSON.stringify(options)} and url: ${this.url}`);
91
93
  }
92
94
  }
93
95
 
94
96
  private async connectAndConsume(queueName: string): Promise<void> {
95
97
  await this.cleanup();
98
+ this.logger.log(`RabbitMqSubscriber in connectAndConsume for queue: ${queueName} and url: ${this.url}`);
96
99
 
97
100
  let connection: amqp.Connection;
98
101
  try {
@@ -159,11 +162,12 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
159
162
  return;
160
163
  }
161
164
 
162
- const messageContentString = rawMessage.content.toString();
163
165
  let message: QueueMessage<T> = null;
164
166
 
165
167
  try {
168
+ const messageContentString = rawMessage.content.toString();
166
169
  message = JSON.parse(messageContentString) as QueueMessage<T>;
170
+ this.logger.debug(`rabbitmq subscriber received message with id: ${message.messageId} for queue ${queueName}`);
167
171
  } catch (error) {
168
172
  this.logger.error(`Invalid JSON message on queue ${queueName}: ${(error as Error).message}`);
169
173
  await this.publishToFailedQueue(queueName, rawMessage.content, channel, error);
@@ -7,7 +7,7 @@ import { CreateSettingDto } from 'src/dtos/create-setting.dto';
7
7
  import { GetMcpUrlDto } from 'src/dtos/get-mcp-url.dto';
8
8
  import { User } from 'src/entities/user.entity';
9
9
  import { SettingRepository } from '../repository/setting.repository';
10
- import { FILE_SERVICE, IFileService } from './file';
10
+ import { FILE_SERVICE, IFileService, FILE_STORAGE_PATH_BUILDER, IStoragePathBuilder } from './file';
11
11
  import { Setting } from '../entities/setting.entity';
12
12
  import { RequestContextService } from './request-context.service';
13
13
  import { SolidRegistry } from 'src/helpers/solid-registry';
@@ -32,6 +32,7 @@ export class SettingService {
32
32
 
33
33
  constructor(
34
34
  @Inject(FILE_SERVICE) readonly fileService: IFileService,
35
+ @Inject(FILE_STORAGE_PATH_BUILDER) readonly pathBuilder: IStoragePathBuilder,
35
36
  readonly solidRegistry: SolidRegistry,
36
37
  readonly repo: SettingRepository,
37
38
  readonly moduleMetadataRepo: ModuleMetadataRepository,
@@ -251,9 +252,10 @@ export class SettingService {
251
252
  const relativeFileName = `${file.filename}-${file.originalname}`;
252
253
 
253
254
  // Read file from local disk (where Multer stores uploads) and write to storage
254
- // The file service resolves the storage path and returns the public URL
255
+ // The path builder constructs the provider-appropriate storage path
255
256
  const fileContent = await fsPromises.readFile(file.path);
256
- const fileUrl = await this.fileService.write(relativeFileName, fileContent, { contentType: file.mimetype });
257
+ const storagePath = this.pathBuilder.build(relativeFileName);
258
+ const fileUrl = await this.fileService.write(storagePath, fileContent, { contentType: file.mimetype });
257
259
  // Delete the temp file from local disk
258
260
  await fsPromises.unlink(file.path);
259
261
 
@@ -3,8 +3,8 @@ import { Environment } from "src/decorators/disallow-in-production.decorator";
3
3
  import { SettingsProvider } from "src/decorators/settings-provider.decorator";
4
4
  import { ISettingsProvider, SettingDefinition, SettingLevel } from "src/interfaces";
5
5
 
6
- const DEFAULT_MEDIA_UPLOAD_DIR = 'media-uploads';
7
- const DEFAULT_MEDIA_FILE_STORAGE_DIR = 'media-files-storage';
6
+ export const DEFAULT_MEDIA_UPLOAD_DIR = 'media-uploads';
7
+ export const DEFAULT_MEDIA_FILE_STORAGE_DIR = 'media-files-storage';
8
8
 
9
9
  // 1.
10
10
  const getSolidCoreSettings = (isProd: boolean) => ([
@@ -87,7 +87,8 @@ const getSolidCoreSettings = (isProd: boolean) => ([
87
87
  // iam-settings-provider.service.ts
88
88
  { moduleName: "solid-core", key: "passwordLessAuth", value: (process.env.IAM_PASSWORD_LESS_AUTH?.trim() ?? 'false') === 'true', level: SettingLevel.SystemAdminEditable },
89
89
  { moduleName: "solid-core", key: "passwordBasedAuth", value: (process.env.IAM_PASSWORD_BASED_AUTH?.trim() ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
90
- { moduleName: "solid-core", key: "passwordlessRegistrationValidateWhat", value: (process.env.IAM_PASSWORD_LESS_REGISTRATION_VALIDATE_WHAT ?? 'email').split(',').map((item) => item.trim()), level: SettingLevel.SystemAdminEditable },
90
+ { moduleName: "solid-core", key: "passwordlessRegistrationValidateWhat", value: (process.env.IAM_PASSWORD_LESS_REGISTRATION_VALIDATE_WHAT ?? 'email').trim(), level: SettingLevel.SystemAdminEditable },
91
+ { moduleName: "solid-core", key: "passwordlessLoginValidateWhat", value: process.env.IAM_PASSWORD_LESS_LOGIN_VALIDATE_WHAT ?? 'email', level: SettingLevel.SystemAdminEditable },
91
92
  { moduleName: "solid-core", key: "allowPublicRegistration", value: (process.env.IAM_ALLOW_PUBLIC_REGISTRATION ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
92
93
  { moduleName: "solid-core", key: "activateUserOnRegistration", value: (process.env.IAM_ACTIVATE_USER_ON_REGISTRATION ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
93
94
  { moduleName: "solid-core", key: "autoLoginUserOnRegistration", value: (process.env.IAM_AUTO_LOGIN_USER_ON_REGISTRATION ?? 'false') === 'true', level: SettingLevel.SystemEnv },
@@ -96,6 +97,7 @@ const getSolidCoreSettings = (isProd: boolean) => ([
96
97
  { moduleName: "solid-core", key: "defaultRole", value: process.env.IAM_DEFAULT_ROLE ?? 'Public', level: SettingLevel.SystemAdminEditable },
97
98
  { moduleName: "solid-core", key: "dummyOtp", value: process.env.IAM_OTP_DUMMY, level: SettingLevel.SystemEnv },
98
99
  { moduleName: "solid-core", key: "forgotPasswordSendVerificationTokenOn", value: process.env.IAM_FORGOT_PASSWORD_SEND_VERIFICATION_TOKEN_ON ?? 'email', level: SettingLevel.SystemEnv },
100
+ { moduleName: "solid-core", key: "maxFailedLoginAttempts", value: parseInt(process.env.IAM_MAX_FAILED_LOGIN_ATTEMPTS ?? '0'), level: SettingLevel.SystemAdminReadonly },
99
101
  { moduleName: "solid-core", key: "forceChangePasswordOnFirstLogin", value: false, level: SettingLevel.SystemAdminEditable },
100
102
  { moduleName: "solid-core", key: "authenticationPasswordRegex", value: process.env.PASSWORD_REGEX || '^$|^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).*$', level: SettingLevel.SystemAdminEditable },
101
103
  { moduleName: "solid-core", key: "authenticationPasswordRegexErrorMessage", value: process.env.PASSWORD_REGEX_ERROR_MESSAGE || 'Password must contain at least one uppercase, one lowercase, one number, and one special character.', level: SettingLevel.SystemAdminEditable },
@@ -1,4 +1,5 @@
1
- import { Global, Module } from '@nestjs/common';
1
+ import { Global, MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
2
+ import * as express from 'express';
2
3
  import { ConfigModule, ConfigService } from '@nestjs/config';
3
4
  import {
4
5
  APP_FILTER,
@@ -58,6 +59,8 @@ import { HttpModule } from '@nestjs/axios';
58
59
  import { JwtModule } from '@nestjs/jwt';
59
60
  import { SeedCommand } from './commands/seed.command';
60
61
  import { TestDataCommand } from './commands/test-data.command';
62
+ import { TestRunCommand } from './commands/run-tests.command';
63
+ import { TestCommand } from './commands/test.command';
61
64
  import { AuthenticationController } from './controllers/authentication.controller';
62
65
  import { EmailTemplateController } from './controllers/email-template.controller';
63
66
  import { GoogleAuthenticationController } from './controllers/google-authentication.controller';
@@ -95,16 +98,12 @@ import { TestQueuePublisher } from './jobs/test-queue-publisher.service';
95
98
  import { TestQueueSubscriber } from './jobs/test-queue-subscriber.service';
96
99
  import { UserRegistrationListener } from './listeners/user-registration.listener';
97
100
  import { GoogleOauthStrategy } from './passport-strategies/google-oauth.strategy';
98
- import { LocalStrategy } from './passport-strategies/local.strategy';
99
- import { EmailTemplateSeederService } from './seeders/email-template-seeder.service';
100
- import { SmsTemplateSeederService } from './seeders/sms-template-seeder.service';
101
- import { UserSeederService } from './seeders/user-seeder.service';
102
101
  import { AuthenticationService } from './services/authentication.service';
103
102
  import { BcryptService } from './services/bcrypt.service';
104
103
  import { UuidExternalIdEntityComputedFieldProvider } from './services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service';
105
104
  import { UuidExternalIdComputedFieldProvider } from './services/computed-fields/uuid-external-id-computed-field-provider.service';
106
105
  import { EmailTemplateService } from './services/email-template.service';
107
- import { DiskFileService, S3FileService, FileServiceFactory } from './services/file';
106
+ import { DiskFileService, S3FileService, FileServiceFactory, DiskStoragePathBuilder, S3StoragePathBuilder, StoragePathBuilderFactory } from './services/file';
108
107
  import { HashingService } from './services/hashing.service';
109
108
  import { ElasticEmailService } from './services/mail/elastic-email.service';
110
109
  import { SMTPEMailService } from './services/mail/smtp-email.service';
@@ -503,10 +502,15 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
503
502
  DiskFileService,
504
503
  S3FileService,
505
504
  FileServiceFactory,
505
+ DiskStoragePathBuilder,
506
+ S3StoragePathBuilder,
507
+ StoragePathBuilderFactory,
506
508
  TextractService,
507
509
  SolidRegistry,
508
510
  SeedCommand,
511
+ TestCommand,
509
512
  TestDataCommand,
513
+ TestRunCommand,
510
514
  McpCommand,
511
515
  IngestCommand,
512
516
  IngestMetadataService,
@@ -559,8 +563,6 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
559
563
  Three60WhatsappService,
560
564
  MqMessageService,
561
565
  MqMessageQueueService,
562
- EmailTemplateSeederService,
563
- SmsTemplateSeederService,
564
566
  TinyUrlService,
565
567
  PdfService,
566
568
  UuidExternalIdComputedFieldProvider,
@@ -573,8 +575,6 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
573
575
  AuthenticationService,
574
576
  GoogleAuthenticationController,
575
577
  RefreshTokenIdsStorageService,
576
- UserSeederService,
577
- LocalStrategy,
578
578
  GoogleOauthStrategy,
579
579
  UserRegistrationListener,
580
580
  TestQueuePublisher,
@@ -730,6 +730,9 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
730
730
  DiskFileService,
731
731
  S3FileService,
732
732
  FileServiceFactory,
733
+ DiskStoragePathBuilder,
734
+ S3StoragePathBuilder,
735
+ StoragePathBuilderFactory,
733
736
  HttpModule,
734
737
  ImportTransactionService,
735
738
  ListOfValuesService,
@@ -764,11 +767,16 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
764
767
  TwilioSMSService,
765
768
  TypeOrmModule,
766
769
  UserActivityHistoryService,
767
- UserSeederService,
768
770
  ImageEncodingService,
769
771
  SolidMicroserviceAdapter,
770
772
  UserService,
771
773
  SettingService,
772
774
  ],
773
775
  })
774
- export class SolidCoreModule { }
776
+ export class SolidCoreModule implements NestModule {
777
+ configure(consumer: MiddlewareConsumer) {
778
+ consumer
779
+ .apply(express.json({ limit: '10mb' }), express.urlencoded({ limit: '10mb', extended: true }))
780
+ .forRoutes('*');
781
+ }
782
+ }