@solidxai/core 0.1.6-beta.9 → 0.1.7

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 (311) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CHANGELOG.md +71 -0
  3. package/dist/controllers/dashboard-layout.controller.d.ts +47 -0
  4. package/dist/controllers/dashboard-layout.controller.d.ts.map +1 -0
  5. package/dist/controllers/dashboard-layout.controller.js +204 -0
  6. package/dist/controllers/dashboard-layout.controller.js.map +1 -0
  7. package/dist/dtos/create-dashboard-layout.dto.d.ts +8 -0
  8. package/dist/dtos/create-dashboard-layout.dto.d.ts.map +1 -0
  9. package/dist/dtos/create-dashboard-layout.dto.js +53 -0
  10. package/dist/dtos/create-dashboard-layout.dto.js.map +1 -0
  11. package/dist/dtos/create-dashboard-variable.dto.d.ts +1 -0
  12. package/dist/dtos/create-dashboard-variable.dto.d.ts.map +1 -1
  13. package/dist/dtos/create-dashboard-variable.dto.js +7 -1
  14. package/dist/dtos/create-dashboard-variable.dto.js.map +1 -1
  15. package/dist/dtos/update-dashboard-layout.dto.d.ts +8 -0
  16. package/dist/dtos/update-dashboard-layout.dto.d.ts.map +1 -0
  17. package/dist/dtos/update-dashboard-layout.dto.js +53 -0
  18. package/dist/dtos/update-dashboard-layout.dto.js.map +1 -0
  19. package/dist/dtos/update-dashboard-variable.dto.d.ts +1 -0
  20. package/dist/dtos/update-dashboard-variable.dto.d.ts.map +1 -1
  21. package/dist/dtos/update-dashboard-variable.dto.js +7 -1
  22. package/dist/dtos/update-dashboard-variable.dto.js.map +1 -1
  23. package/dist/entities/action-metadata.entity.d.ts.map +1 -1
  24. package/dist/entities/action-metadata.entity.js.map +1 -1
  25. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  26. package/dist/entities/ai-interaction.entity.js +5 -4
  27. package/dist/entities/ai-interaction.entity.js.map +1 -1
  28. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  29. package/dist/entities/chatter-message-details.entity.js +4 -3
  30. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  31. package/dist/entities/chatter-message.entity.d.ts.map +1 -1
  32. package/dist/entities/chatter-message.entity.js +4 -3
  33. package/dist/entities/chatter-message.entity.js.map +1 -1
  34. package/dist/entities/dashboard-layout.entity.d.ts +9 -0
  35. package/dist/entities/dashboard-layout.entity.d.ts.map +1 -0
  36. package/dist/entities/dashboard-layout.entity.js +41 -0
  37. package/dist/entities/dashboard-layout.entity.js.map +1 -0
  38. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -1
  39. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +5 -4
  40. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  41. package/dist/entities/dashboard-question.entity.d.ts.map +1 -1
  42. package/dist/entities/dashboard-question.entity.js +5 -4
  43. package/dist/entities/dashboard-question.entity.js.map +1 -1
  44. package/dist/entities/dashboard-variable.entity.d.ts +1 -0
  45. package/dist/entities/dashboard-variable.entity.d.ts.map +1 -1
  46. package/dist/entities/dashboard-variable.entity.js +10 -4
  47. package/dist/entities/dashboard-variable.entity.js.map +1 -1
  48. package/dist/entities/dashboard.entity.d.ts +2 -0
  49. package/dist/entities/dashboard.entity.d.ts.map +1 -1
  50. package/dist/entities/dashboard.entity.js +9 -3
  51. package/dist/entities/dashboard.entity.js.map +1 -1
  52. package/dist/entities/email-attachment.entity.d.ts.map +1 -1
  53. package/dist/entities/email-attachment.entity.js +2 -1
  54. package/dist/entities/email-attachment.entity.js.map +1 -1
  55. package/dist/entities/email-template.entity.js +1 -1
  56. package/dist/entities/email-template.entity.js.map +1 -1
  57. package/dist/entities/export-transaction.entity.d.ts.map +1 -1
  58. package/dist/entities/export-transaction.entity.js +2 -1
  59. package/dist/entities/export-transaction.entity.js.map +1 -1
  60. package/dist/entities/field-metadata.entity.js +2 -2
  61. package/dist/entities/field-metadata.entity.js.map +1 -1
  62. package/dist/entities/import-transaction-error-log.entity.d.ts.map +1 -1
  63. package/dist/entities/import-transaction-error-log.entity.js +3 -2
  64. package/dist/entities/import-transaction-error-log.entity.js.map +1 -1
  65. package/dist/entities/import-transaction.entity.d.ts.map +1 -1
  66. package/dist/entities/import-transaction.entity.js +2 -1
  67. package/dist/entities/import-transaction.entity.js.map +1 -1
  68. package/dist/entities/mq-message-queue.entity.d.ts.map +1 -1
  69. package/dist/entities/mq-message-queue.entity.js.map +1 -1
  70. package/dist/entities/mq-message.entity.d.ts.map +1 -1
  71. package/dist/entities/mq-message.entity.js +5 -3
  72. package/dist/entities/mq-message.entity.js.map +1 -1
  73. package/dist/entities/saved-filters.entity.d.ts.map +1 -1
  74. package/dist/entities/saved-filters.entity.js +3 -2
  75. package/dist/entities/saved-filters.entity.js.map +1 -1
  76. package/dist/entities/security-rule.entity.d.ts.map +1 -1
  77. package/dist/entities/security-rule.entity.js +2 -1
  78. package/dist/entities/security-rule.entity.js.map +1 -1
  79. package/dist/entities/sms-template.entity.js +1 -1
  80. package/dist/entities/sms-template.entity.js.map +1 -1
  81. package/dist/entities/user-view-metadata.entity.d.ts.map +1 -1
  82. package/dist/entities/user-view-metadata.entity.js +2 -1
  83. package/dist/entities/user-view-metadata.entity.js.map +1 -1
  84. package/dist/entities/user.entity.d.ts.map +1 -1
  85. package/dist/entities/user.entity.js +2 -0
  86. package/dist/entities/user.entity.js.map +1 -1
  87. package/dist/entities/view-metadata.entity.d.ts.map +1 -1
  88. package/dist/entities/view-metadata.entity.js.map +1 -1
  89. package/dist/helpers/bootstrap.helper.d.ts +14 -0
  90. package/dist/helpers/bootstrap.helper.d.ts.map +1 -0
  91. package/dist/helpers/bootstrap.helper.js +132 -0
  92. package/dist/helpers/bootstrap.helper.js.map +1 -0
  93. package/dist/helpers/cache.helper.d.ts +2 -0
  94. package/dist/helpers/cache.helper.d.ts.map +1 -0
  95. package/dist/helpers/cache.helper.js +8 -0
  96. package/dist/helpers/cache.helper.js.map +1 -0
  97. package/dist/helpers/cors.helper.d.ts.map +1 -1
  98. package/dist/helpers/cors.helper.js +13 -4
  99. package/dist/helpers/cors.helper.js.map +1 -1
  100. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  101. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  102. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +8 -9
  103. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  104. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts +2 -2
  105. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
  106. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +8 -5
  107. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  108. package/dist/helpers/solid-registry.d.ts +3 -0
  109. package/dist/helpers/solid-registry.d.ts.map +1 -1
  110. package/dist/helpers/solid-registry.js +7 -0
  111. package/dist/helpers/solid-registry.js.map +1 -1
  112. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  113. package/dist/helpers/typeorm-db-helper.js +21 -0
  114. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  115. package/dist/index.d.ts +3 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +3 -0
  118. package/dist/index.js.map +1 -1
  119. package/dist/interfaces.d.ts +2 -0
  120. package/dist/interfaces.d.ts.map +1 -1
  121. package/dist/interfaces.js.map +1 -1
  122. package/dist/jobs/chatter-queue-options.js +1 -1
  123. package/dist/jobs/chatter-queue-options.js.map +1 -1
  124. package/dist/jobs/chatter-queue-publisher.service.d.ts +9 -9
  125. package/dist/jobs/chatter-queue-publisher.service.d.ts.map +1 -1
  126. package/dist/jobs/chatter-queue-publisher.service.js +5 -5
  127. package/dist/jobs/chatter-queue-publisher.service.js.map +1 -1
  128. package/dist/jobs/chatter-queue-subscriber.service.d.ts +4 -4
  129. package/dist/jobs/chatter-queue-subscriber.service.d.ts.map +1 -1
  130. package/dist/jobs/chatter-queue-subscriber.service.js +11 -11
  131. package/dist/jobs/chatter-queue-subscriber.service.js.map +1 -1
  132. package/dist/jobs/computed-field-evaluation-queue-options.d.ts +2 -0
  133. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -1
  134. package/dist/jobs/computed-field-evaluation-queue-options.js +2 -0
  135. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -1
  136. package/dist/jobs/database/chatter-queue-options-database.d.ts +8 -0
  137. package/dist/jobs/database/chatter-queue-options-database.d.ts.map +1 -0
  138. package/dist/jobs/database/chatter-queue-options-database.js +10 -0
  139. package/dist/jobs/database/chatter-queue-options-database.js.map +1 -0
  140. package/dist/jobs/database/chatter-queue-publisher-database.service.d.ts +12 -0
  141. package/dist/jobs/database/chatter-queue-publisher-database.service.d.ts.map +1 -0
  142. package/dist/jobs/database/chatter-queue-publisher-database.service.js +39 -0
  143. package/dist/jobs/database/chatter-queue-publisher-database.service.js.map +1 -0
  144. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts +19 -0
  145. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -0
  146. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +62 -0
  147. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -0
  148. package/dist/repository/dashboard-layout.repository.d.ts +12 -0
  149. package/dist/repository/dashboard-layout.repository.d.ts.map +1 -0
  150. package/dist/repository/dashboard-layout.repository.js +34 -0
  151. package/dist/repository/dashboard-layout.repository.js.map +1 -0
  152. package/dist/repository/model-metadata.repository.d.ts +6 -1
  153. package/dist/repository/model-metadata.repository.d.ts.map +1 -1
  154. package/dist/repository/model-metadata.repository.js +41 -2
  155. package/dist/repository/model-metadata.repository.js.map +1 -1
  156. package/dist/seeders/module-metadata-seeder.service.js +4 -4
  157. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  158. package/dist/seeders/seed-data/solid-core-metadata.json +372 -32
  159. package/dist/services/chatter-message.service.d.ts +4 -4
  160. package/dist/services/chatter-message.service.d.ts.map +1 -1
  161. package/dist/services/chatter-message.service.js +33 -9
  162. package/dist/services/chatter-message.service.js.map +1 -1
  163. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +7 -3
  164. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -1
  165. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +61 -22
  166. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -1
  167. package/dist/services/crud.service.js +1 -1
  168. package/dist/services/crud.service.js.map +1 -1
  169. package/dist/services/dashboard-layout.service.d.ts +20 -0
  170. package/dist/services/dashboard-layout.service.d.ts.map +1 -0
  171. package/dist/services/dashboard-layout.service.js +120 -0
  172. package/dist/services/dashboard-layout.service.js.map +1 -0
  173. package/dist/services/dashboard.service.d.ts +2 -0
  174. package/dist/services/dashboard.service.d.ts.map +1 -1
  175. package/dist/services/dashboard.service.js +4 -0
  176. package/dist/services/dashboard.service.js.map +1 -1
  177. package/dist/services/model-metadata.service.d.ts +3 -1
  178. package/dist/services/model-metadata.service.d.ts.map +1 -1
  179. package/dist/services/model-metadata.service.js +21 -2
  180. package/dist/services/model-metadata.service.js.map +1 -1
  181. package/dist/services/permission-metadata.service.d.ts +5 -1
  182. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  183. package/dist/services/permission-metadata.service.js +66 -20
  184. package/dist/services/permission-metadata.service.js.map +1 -1
  185. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  186. package/dist/services/queues/database-subscriber.service.js +6 -1
  187. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  188. package/dist/services/queues/publisher-factory.service.js +0 -1
  189. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  190. package/dist/services/queues/rabbitmq-publisher.service.d.ts +1 -0
  191. package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
  192. package/dist/services/queues/rabbitmq-publisher.service.js +6 -1
  193. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  194. package/dist/services/queues/rabbitmq-subscriber.service.d.ts +5 -1
  195. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  196. package/dist/services/queues/rabbitmq-subscriber.service.js +84 -9
  197. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  198. package/dist/services/request-context.service.d.ts +2 -1
  199. package/dist/services/request-context.service.d.ts.map +1 -1
  200. package/dist/services/request-context.service.js.map +1 -1
  201. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  202. package/dist/services/scheduled-jobs/scheduler.service.js +20 -2
  203. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  204. package/dist/services/solid-introspect.service.d.ts +6 -1
  205. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  206. package/dist/services/solid-introspect.service.js +27 -2
  207. package/dist/services/solid-introspect.service.js.map +1 -1
  208. package/dist/services/solid-ts-morph.service.d.ts +9 -0
  209. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  210. package/dist/services/solid-ts-morph.service.js +76 -0
  211. package/dist/services/solid-ts-morph.service.js.map +1 -1
  212. package/dist/solid-core.module.d.ts.map +1 -1
  213. package/dist/solid-core.module.js +16 -0
  214. package/dist/solid-core.module.js.map +1 -1
  215. package/dist/subscribers/audit.subscriber.d.ts +10 -7
  216. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  217. package/dist/subscribers/audit.subscriber.js +58 -85
  218. package/dist/subscribers/audit.subscriber.js.map +1 -1
  219. package/dist/subscribers/computed-entity-field.subscriber.js +3 -1
  220. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  221. package/dist/subscribers/created-by-updated-by.subscriber.d.ts +0 -1
  222. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  223. package/dist/subscribers/created-by-updated-by.subscriber.js +3 -13
  224. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  225. package/dist/winston.logger.d.ts.map +1 -1
  226. package/dist/winston.logger.js +2 -1
  227. package/dist/winston.logger.js.map +1 -1
  228. package/package.json +3 -1
  229. package/sql/default/mariadb/proc_CleanupModelMetadata.sql +153 -0
  230. package/sql/default/mariadb/proc_CleanupModuleMetadata.sql +56 -0
  231. package/sql/default/mysql/proc_CleanupModelMetadata.sql +153 -0
  232. package/sql/default/mysql/proc_CleanupModuleMetadata.sql +56 -0
  233. package/src/controllers/dashboard-layout.controller.ts +106 -0
  234. package/src/dtos/create-dashboard-layout.dto.ts +31 -0
  235. package/src/dtos/create-dashboard-variable.dto.ts +4 -0
  236. package/src/dtos/update-dashboard-layout.dto.ts +30 -0
  237. package/src/dtos/update-dashboard-variable.dto.ts +5 -1
  238. package/src/entities/action-metadata.entity.ts +3 -2
  239. package/src/entities/ai-interaction.entity.ts +5 -4
  240. package/src/entities/chatter-message-details.entity.ts +4 -3
  241. package/src/entities/chatter-message.entity.ts +4 -3
  242. package/src/entities/dashboard-layout.entity.ts +18 -0
  243. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +5 -4
  244. package/src/entities/dashboard-question.entity.ts +5 -4
  245. package/src/entities/dashboard-variable.entity.ts +9 -4
  246. package/src/entities/dashboard.entity.ts +7 -2
  247. package/src/entities/email-attachment.entity.ts +2 -1
  248. package/src/entities/email-template.entity.ts +1 -1
  249. package/src/entities/export-transaction.entity.ts +2 -1
  250. package/src/entities/field-metadata.entity.ts +2 -2
  251. package/src/entities/import-transaction-error-log.entity.ts +3 -2
  252. package/src/entities/import-transaction.entity.ts +2 -1
  253. package/src/entities/mq-message-queue.entity.ts +8 -8
  254. package/src/entities/mq-message.entity.ts +5 -3
  255. package/src/entities/saved-filters.entity.ts +3 -2
  256. package/src/entities/security-rule.entity.ts +2 -1
  257. package/src/entities/sms-template.entity.ts +1 -1
  258. package/src/entities/user-view-metadata.entity.ts +2 -1
  259. package/src/entities/user.entity.ts +37 -2
  260. package/src/entities/view-metadata.entity.ts +3 -0
  261. package/src/helpers/bootstrap.helper.ts +222 -0
  262. package/src/helpers/cache.helper.ts +5 -0
  263. package/src/helpers/cors.helper.ts +26 -6
  264. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +9 -9
  265. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +9 -6
  266. package/src/helpers/solid-registry.ts +10 -5
  267. package/src/helpers/typeorm-db-helper.ts +26 -0
  268. package/src/index.ts +3 -0
  269. package/src/interfaces.ts +3 -0
  270. package/src/jobs/chatter-queue-options.ts +1 -1
  271. package/src/jobs/chatter-queue-publisher.service.ts +11 -11
  272. package/src/jobs/chatter-queue-subscriber.service.ts +13 -8
  273. package/src/jobs/computed-field-evaluation-queue-options.ts +2 -0
  274. package/src/jobs/database/chatter-queue-options-database.ts +9 -0
  275. package/src/jobs/database/chatter-queue-publisher-database.service.ts +24 -0
  276. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +53 -0
  277. package/src/repository/dashboard-layout.repository.ts +17 -0
  278. package/src/repository/model-metadata.repository.ts +45 -2
  279. package/src/seeders/module-metadata-seeder.service.ts +5 -5
  280. package/src/seeders/seed-data/solid-core-metadata.json +373 -33
  281. package/src/services/1.js +6 -0
  282. package/src/services/chatter-message.service.ts +41 -9
  283. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +79 -40
  284. package/src/services/crud.service.ts +1 -1
  285. package/src/services/dashboard-layout.service.ts +111 -0
  286. package/src/services/dashboard.service.ts +7 -0
  287. package/src/services/model-metadata.service.ts +22 -43
  288. package/src/services/permission-metadata.service.ts +73 -20
  289. package/src/services/queues/database-subscriber.service.ts +7 -1
  290. package/src/services/queues/publisher-factory.service.ts +1 -1
  291. package/src/services/queues/rabbitmq-publisher.service.ts +8 -2
  292. package/src/services/queues/rabbitmq-subscriber.service.ts +127 -10
  293. package/src/services/request-context.service.ts +2 -1
  294. package/src/services/scheduled-jobs/scheduler.service.ts +22 -4
  295. package/src/services/solid-introspect.service.ts +28 -0
  296. package/src/services/solid-ts-morph.service.ts +98 -0
  297. package/src/solid-core.module.ts +21 -2
  298. package/src/subscribers/audit.subscriber.ts +63 -271
  299. package/src/subscribers/computed-entity-field.subscriber.ts +3 -3
  300. package/src/subscribers/created-by-updated-by.subscriber.ts +22 -16
  301. package/src/winston.logger.ts +2 -1
  302. package/dist-tests/api/authenticate.spec.js +0 -119
  303. package/dist-tests/api/authenticate.spec.js.map +0 -1
  304. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  305. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  306. package/dist-tests/api/ping.spec.js +0 -21
  307. package/dist-tests/api/ping.spec.js.map +0 -1
  308. package/dist-tests/helpers/auth.js +0 -41
  309. package/dist-tests/helpers/auth.js.map +0 -1
  310. package/dist-tests/helpers/env.js +0 -11
  311. package/dist-tests/helpers/env.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"solid-ts-morph.service.d.ts","sourceRoot":"","sources":["../../src/services/solid-ts-morph.service.ts"],"names":[],"mappings":"AAOA,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAStC,qBACa,mBAAmB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,gBAAgB,CAAqB;IAG7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;;IA0BtD,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,GAAG;IAMX,KAAK,IAAI,IAAI;IAmBb,QAAQ,IAAI,IAAI;IAgBV,MAAM,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiD1C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG;QAAE,eAAe,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAqB/G,oBAAoB,CAChB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EACzB,WAAW,UAAO,GACnB;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE;IAyDtB,wBAAwB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACnB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IA6B9D,wBAAwB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAClB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAwB9D,SAAS,CACL,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACnB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;CA6CjE"}
1
+ {"version":3,"file":"solid-ts-morph.service.d.ts","sourceRoot":"","sources":["../../src/services/solid-ts-morph.service.ts"],"names":[],"mappings":"AAOA,KAAK,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAStC,qBACa,mBAAmB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,gBAAgB,CAAqB;IAG7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;;IA0BtD,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,GAAG;IAMX,KAAK,IAAI,IAAI;IAmBb,QAAQ,IAAI,IAAI;IAgBV,MAAM,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiD1C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG;QAAE,eAAe,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAqB/G,oBAAoB,CAChB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EACzB,WAAW,UAAO,GACnB;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE;IAyDtB,wBAAwB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACnB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IA6B9D,wBAAwB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAClB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IA2B9D,aAAa,CACT,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,GAC7C;QAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAqCzE,mBAAmB,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAC9B;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAoDxC,SAAS,CACL,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACnB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;CA6CjE"}
@@ -249,6 +249,82 @@ let SolidTsMorphService = SolidTsMorphService_1 = class SolidTsMorphService {
249
249
  this.logger.log(`Staged new line in ${this.rel(abs)}: ${lineToAdd}`);
250
250
  return { staged: true, overwritten: false, skipped: false };
251
251
  }
252
+ removeImports(filePath, filter) {
253
+ const abs = this.resolveRepoPath(filePath);
254
+ if (!(0, node_fs_1.existsSync)(abs)) {
255
+ this.logger.warn(`removeImport: file not found at ${filePath}, skipping.`);
256
+ return { removedIdentifiers: new Set(), staged: false, skipped: true };
257
+ }
258
+ const existing = this.project.getSourceFile(abs);
259
+ const sourceFile = existing
260
+ ? existing
261
+ : this.project.createSourceFile(abs, (0, node_fs_1.readFileSync)(abs, "utf8"), { overwrite: true });
262
+ const importsToRemove = sourceFile.getImportDeclarations().filter(decl => {
263
+ const spec = decl.getModuleSpecifierValue().replace(/\\/g, "/");
264
+ return filter(spec);
265
+ });
266
+ if (importsToRemove.length === 0) {
267
+ return { removedIdentifiers: new Set(), staged: false, skipped: true };
268
+ }
269
+ const removedIdentifiers = new Set();
270
+ for (const decl of importsToRemove) {
271
+ for (const named of decl.getNamedImports()) {
272
+ removedIdentifiers.add(named.getAliasNode()?.getText() ?? named.getName());
273
+ }
274
+ const defaultImport = decl.getDefaultImport();
275
+ if (defaultImport)
276
+ removedIdentifiers.add(defaultImport.getText());
277
+ decl.remove();
278
+ }
279
+ this.dirtySourceFiles.add(abs);
280
+ this.logger.log(`Staged removal of ${importsToRemove.length} import(s) in: ${this.rel(abs)}`);
281
+ return { removedIdentifiers, staged: true, skipped: false };
282
+ }
283
+ removeModuleMembers(filePath, names) {
284
+ const abs = this.resolveRepoPath(filePath);
285
+ if (!(0, node_fs_1.existsSync)(abs)) {
286
+ this.logger.warn(`removeImportMembers: file not found at ${filePath}, skipping.`);
287
+ return { staged: false, skipped: true };
288
+ }
289
+ const identifiers = names instanceof Set ? names : new Set(names);
290
+ if (identifiers.size === 0)
291
+ return { staged: false, skipped: true };
292
+ const existing = this.project.getSourceFile(abs);
293
+ const sourceFile = existing
294
+ ? existing
295
+ : this.project.createSourceFile(abs, (0, node_fs_1.readFileSync)(abs, "utf8"), { overwrite: true });
296
+ const nestModuleClass = sourceFile.getClasses().find(cls => cls.getDecorators().some(dec => dec.getName() === "Module"));
297
+ if (!nestModuleClass) {
298
+ this.logger.warn(`removeImportMembers: no @Module() class found in ${filePath}`);
299
+ return { staged: false, skipped: true };
300
+ }
301
+ const moduleDec = nestModuleClass.getDecorators().find(dec => dec.getName() === "Module");
302
+ const arg0 = moduleDec?.getCallExpression()?.getArguments()[0];
303
+ if (!arg0 || !ts_morph_1.Node.isObjectLiteralExpression(arg0))
304
+ return { staged: false, skipped: true };
305
+ const meta = arg0;
306
+ for (const propName of ["imports", "providers", "controllers", "exports"]) {
307
+ const prop = meta.getProperty(propName);
308
+ if (!prop || !ts_morph_1.Node.isPropertyAssignment(prop))
309
+ continue;
310
+ const init = prop.getInitializer();
311
+ if (!init || !ts_morph_1.Node.isArrayLiteralExpression(init))
312
+ continue;
313
+ const arr = init;
314
+ const elements = arr.getElements();
315
+ for (let i = elements.length - 1; i >= 0; i--) {
316
+ const elemText = elements[i].getText().trim();
317
+ const shouldRemove = identifiers.has(elemText) ||
318
+ [...identifiers].some(id => new RegExp(`\\b${id}\\b`).test(elemText));
319
+ if (shouldRemove) {
320
+ arr.removeElement(i);
321
+ }
322
+ }
323
+ }
324
+ this.dirtySourceFiles.add(abs);
325
+ this.logger.log(`Staged removal of [${[...identifiers].join(", ")}] from @Module arrays in: ${this.rel(abs)}`);
326
+ return { staged: true, skipped: false };
327
+ }
252
328
  addImport(filePath, importLine) {
253
329
  const abs = this.resolveRepoPath(filePath);
254
330
  if (!(0, node_fs_1.existsSync)(abs))
@@ -1 +1 @@
1
- {"version":3,"file":"solid-ts-morph.service.js","sourceRoot":"","sources":["../../src/services/solid-ts-morph.service.ts"],"names":[],"mappings":"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","sourcesContent":["// src/ai/services/solid-ts-morph.service.ts\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { join, dirname, normalize, isAbsolute, basename } from \"node:path\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { Project, Node, ObjectLiteralExpression, ArrayLiteralExpression, QuoteKind, IndentationText } from \"ts-morph\";\nimport { MethodDeclarationStructure, StructureKind } from \"ts-morph\";\n\ntype Bucket = \"providers\" | \"exports\";\n\n// interface SolidTsMorphOptions {\n// /** Absolute path to monorepo root. Defaults to auto-detect or ENV. */\n// repoRoot?: string;\n// /** Map of workspace prefixes to absolute directories. Defaults for solid-api / solid-ui. */\n// workspaceMap?: Record<string, string>;\n// }\n\n@Injectable()\nexport class SolidTsMorphService {\n private readonly logger = new Logger(SolidTsMorphService.name);\n private project: Project;\n\n // transaction state\n private inTxn = false;\n private stagedWrites = new Map<string, { content: string; overwrite: boolean }>(); // absPath -> write\n private dirtySourceFiles = new Set<string>(); // absPath\n\n // path roots\n private readonly repoRoot: string;\n private readonly workspaceMap: Record<string, string>;\n\n // constructor(opts: SolidTsMorphOptions = {}) {\n constructor() {\n // this.repoRoot = this.discoverRepoRoot(opts.repoRoot);\n this.repoRoot = this.discoverRepoRoot();\n this.workspaceMap = {\n \"solid-api\": join(this.repoRoot, \"solid-api\"),\n \"solid-ui\": join(this.repoRoot, \"solid-ui\"),\n // ...(opts.workspaceMap ?? {}),\n };\n\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n\n this.logger.debug(`SolidTsMorphService repoRoot = ${this.repoRoot}`);\n Object.entries(this.workspaceMap).forEach(([k, v]) => this.logger.debug(`workspace '${k}' => ${v}`));\n }\n\n // ---- repo-root discovery ----\n private discoverRepoRoot(): string {\n // if (input && isAbsolute(input)) return normalize(input);\n\n // ENV override\n const envRoot = process.env.SOLID_REPO_ROOT;\n if (envRoot && isAbsolute(envRoot)) return normalize(envRoot);\n\n // Auto-detect: if current cwd is a workspace (solid-api/solid-ui), then repoRoot = parent(cwd)\n const cwd = normalize(process.cwd());\n const base = basename(cwd);\n if (base === \"solid-api\" || base === \"solid-ui\") {\n return normalize(dirname(cwd));\n }\n\n // Otherwise assume cwd itself is the repo root\n return cwd;\n }\n\n /** Resolve a repo-relative path with optional workspace prefix (e.g. 'solid-api/...', 'solid-ui/...'). */\n private resolveRepoPath(relPath: string): string {\n if (!relPath) throw new Error(\"resolveRepoPath: empty path\");\n const p = normalize(relPath);\n\n if (isAbsolute(p)) return p;\n\n // Prefix-aware mapping: 'solid-api/...', 'solid-ui/...'\n for (const [prefix, root] of Object.entries(this.workspaceMap)) {\n if (p === prefix || p.startsWith(prefix + \"/\") || p.startsWith(prefix + \"\\\\\")) {\n const suffix = p.slice(prefix.length + (p.length > prefix.length ? 1 : 0));\n return normalize(join(root, suffix));\n }\n }\n\n // Default: treat as repo-root relative\n return normalize(join(this.repoRoot, p));\n }\n\n private rel(abs: string): string {\n const root = this.repoRoot.replace(/\\\\/g, \"/\");\n return abs.replace(/\\\\/g, \"/\").replace(root + \"/\", \"\");\n }\n\n // ---- transaction API ----\n begin(): void {\n if (this.inTxn) {\n this.logger.warn(\"begin(): already in a transaction; reusing current transaction.\");\n return;\n }\n this.inTxn = true;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n this.logger.log(\"Transaction started.\");\n }\n\n rollback(): void {\n if (!this.inTxn) return;\n this.inTxn = false;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n this.logger.log(\"Transaction rolled back.\");\n }\n\n async commit(): Promise<{ wrote: number }> {\n if (!this.inTxn) {\n this.logger.log(\"commit(): not in a transaction; nothing to commit.\");\n return { wrote: 0 };\n }\n\n let writes = 0;\n\n // 1) write staged new/overwritten files\n for (const [abs, { content, overwrite }] of this.stagedWrites.entries()) {\n const dir = dirname(abs);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n if (existsSync(abs) && !overwrite) {\n this.logger.log(`createNewFile (staged): skipped (exists) ${this.rel(abs)}`);\n } else {\n writeFileSync(abs, content, \"utf8\");\n writes++;\n this.logger.log(`${existsSync(abs) && overwrite ? \"Overwrote\" : \"Created\"} file: ${this.rel(abs)}`);\n }\n }\n\n // 2) save all mutated module files once\n for (const abs of this.dirtySourceFiles.values()) {\n const sf = this.project.getSourceFile(abs);\n if (!sf) continue;\n sf.fixMissingImports();\n sf.organizeImports();\n await sf.save();\n writes++;\n this.logger.log(`Updated module: ${this.rel(abs)}`);\n }\n\n // end txn\n this.inTxn = false;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n\n return { wrote: writes };\n }\n\n // ---- operations ----\n createNewFile(path: string, content: string, overwrite = false): { createdOrStaged: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(path);\n const dir = dirname(abs);\n\n if (this.inTxn) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n this.stagedWrites.set(abs, { content, overwrite });\n this.logger.log(`Staged createNewFile: ${this.rel(abs)} (overwrite=${overwrite})`);\n return { createdOrStaged: true, skipped: false };\n }\n\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n if (existsSync(abs) && !overwrite) {\n this.logger.log(`createNewFile: skipped (exists): ${path}`);\n return { createdOrStaged: false, skipped: true };\n }\n writeFileSync(abs, content, \"utf8\");\n this.logger.log(`${existsSync(abs) && overwrite ? \"Overwrote\" : \"Created\"} file: ${path}`);\n return { createdOrStaged: true, skipped: false };\n }\n\n registerNestProvider(\n modulePath: string,\n providerClassName: string,\n importFrom: string,\n registerIn: Array<Bucket>,\n uniqueGuard = true\n ): { staged: boolean } {\n const abs = this.resolveRepoPath(modulePath);\n if (!existsSync(abs)) throw new Error(`registerNestProvider: module file not found at ${modulePath}`);\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n // ensure import\n const imp = sourceFile.getImportDeclarations().find(d => d.getModuleSpecifierValue() === importFrom);\n if (imp) {\n const has = imp.getNamedImports().some(ni => ni.getName() === providerClassName);\n if (!has) imp.addNamedImport(providerClassName);\n } else {\n sourceFile.addImportDeclaration({ moduleSpecifier: importFrom, namedImports: [providerClassName] });\n }\n\n // mutate @Module metadata\n const nestModuleClass = sourceFile.getClasses().find(cls =>\n cls.getDecorators().some(dec => dec.getName() === \"Module\")\n );\n if (!nestModuleClass) throw new Error(`registerNestProvider: No @Module() class found in ${modulePath}`);\n\n const moduleDec = nestModuleClass.getDecorators().find(dec => dec.getName() === \"Module\");\n const callExpr = moduleDec!.getCallExpression();\n const arg0 = callExpr?.getArguments()[0];\n if (!arg0 || !Node.isObjectLiteralExpression(arg0)) {\n throw new Error(`registerNestProvider: Malformed @Module() in ${modulePath}`);\n }\n const meta = arg0 as ObjectLiteralExpression;\n\n const ensureInArray = (propName: Bucket) => {\n let prop = meta.getProperty(propName);\n if (!prop) {\n meta.addPropertyAssignment({ name: propName, initializer: \"[]\" });\n prop = meta.getProperty(propName);\n }\n let arr: ArrayLiteralExpression | undefined;\n if (Node.isPropertyAssignment(prop)) {\n const init = prop.getInitializer();\n if (init && Node.isArrayLiteralExpression(init)) arr = init;\n }\n if (!arr) throw new Error(`registerNestProvider: Property ${propName} is not an array in ${modulePath}`);\n\n const exists = arr.getElements().some(el => el.getText().replace(/\\s/g, \"\") === providerClassName);\n if (!exists || !uniqueGuard) arr.addElement(providerClassName);\n };\n\n for (const bucket of registerIn) ensureInArray(bucket);\n\n this.dirtySourceFiles.add(abs); // defer save to commit()\n this.logger.log(`Staged provider registration in: ${this.rel(abs)} (${registerIn.join(\", \")})`);\n return { staged: true };\n }\n\n\n addMethodToExistingClass(\n filePath: string,\n className: string,\n methodName: string,\n methodCode: string,\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`addMethodToExistingClass: File not found at ${filePath}`);\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n const targetClass = sourceFile.getClass(className);\n if (!targetClass)\n throw new Error(`addMethodToExistingClass: Class ${className} not found in ${filePath}`);\n\n const existingMethod = targetClass.getMethod(methodName);\n if (existingMethod) {\n\n this.logger.log(`Skipped adding method '${methodName}' (already exists)`);\n return { staged: false, overwritten: false, skipped: true };\n }\n // Add the LLM-generated method directly\n targetClass.addMember(methodCode);\n\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged method '${methodName}' in class ${className} at ${this.rel(abs)}`);\n return { staged: true, overwritten: !!existingMethod, skipped: false };\n }\n\n registerSolidUiExtension(\n filePath: string,\n lineToAdd: string\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`registerSolidUiExtension: File not found at ${filePath}`);\n\n const fileContent = readFileSync(abs, \"utf8\");\n\n // Check if the line already exists (avoid duplicates)\n if (fileContent.includes(lineToAdd.trim())) {\n this.logger.log(`Skipped adding line (already exists): ${lineToAdd}`);\n return { staged: false, overwritten: false, skipped: true };\n }\n\n // Append the new line at the end, ensuring newline\n const newContent = fileContent.trimEnd() + \"\\n\" + lineToAdd.trim() + \"\\n\";\n\n // Write updated content back\n writeFileSync(abs, newContent, \"utf8\");\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged new line in ${this.rel(abs)}: ${lineToAdd}`);\n return { staged: true, overwritten: false, skipped: false };\n }\n\n addImport(\n filePath: string,\n importLine: string\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`addImport: File not found at ${filePath}`);\n\n let fileContent = readFileSync(abs, \"utf8\");\n\n // If import already exists — skip\n if (fileContent.includes(importLine.trim())) {\n this.logger.log(`Skipped adding import (already exists): ${importLine}`);\n return { staged: false, overwritten: false, skipped: true };\n }\n\n // Find last import statement (so we can insert after all imports)\n const importRegex = /^import .+ from .+;$/gm;\n let lastImportMatch: RegExpExecArray | null;\n let lastImportIndex = -1;\n\n while ((lastImportMatch = importRegex.exec(fileContent)) !== null) {\n lastImportIndex = lastImportMatch.index + lastImportMatch[0].length;\n }\n\n // Insert after last import (or at top if none exist)\n let newContent: string;\n if (lastImportIndex !== -1) {\n newContent =\n fileContent.slice(0, lastImportIndex) +\n \"\\n\" +\n importLine.trim() +\n \"\\n\" +\n fileContent.slice(lastImportIndex);\n } else {\n // No imports found — insert at top\n newContent = importLine.trim() + \"\\n\\n\" + fileContent;\n }\n\n writeFileSync(abs, newContent, \"utf8\");\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged import in ${this.rel(abs)}: ${importLine}`);\n return { staged: true, overwritten: false, skipped: false };\n }\n\n\n\n}"]}
1
+ {"version":3,"file":"solid-ts-morph.service.js","sourceRoot":"","sources":["../../src/services/solid-ts-morph.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,2CAAoD;AACpD,yCAA2E;AAC3E,qCAA6E;AAC7E,uCAAsH;AAa/G,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAc5B;QAbiB,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;QAIvD,UAAK,GAAG,KAAK,CAAC;QACd,iBAAY,GAAG,IAAI,GAAG,EAAmD,CAAC;QAC1E,qBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QASzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG;YAChB,WAAW,EAAE,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC7C,UAAU,EAAE,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;SAE9C,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC;YACvB,2BAA2B,EAAE,IAAI;YACjC,oBAAoB,EAAE;gBAClB,SAAS,EAAE,oBAAS,CAAC,MAAM;gBAC3B,eAAe,EAAE,0BAAe,CAAC,UAAU;gBAC3C,qDAAqD,EAAE,IAAI;aAC9D;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAGO,gBAAgB;QAIpB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC5C,IAAI,OAAO,IAAI,IAAA,sBAAU,EAAC,OAAO,CAAC;YAAE,OAAO,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAG9D,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9C,OAAO,IAAA,qBAAS,EAAC,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QAGD,OAAO,GAAG,CAAC;IACf,CAAC;IAGO,eAAe,CAAC,OAAe;QACnC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,IAAA,sBAAU,EAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAG5B,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC5E,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,OAAO,IAAA,qBAAS,EAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QAGD,OAAO,IAAA,qBAAS,EAAC,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAEO,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAGD,KAAK;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YACpF,OAAO;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC;YACvB,2BAA2B,EAAE,IAAI;YACjC,oBAAoB,EAAE;gBAClB,SAAS,EAAE,oBAAS,CAAC,MAAM;gBAC3B,eAAe,EAAE,0BAAe,CAAC,UAAU;gBAC3C,qDAAqD,EAAE,IAAI;aAC9D;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC;YACvB,2BAA2B,EAAE,IAAI;YACjC,oBAAoB,EAAE;gBAClB,SAAS,EAAE,oBAAS,CAAC,MAAM;gBAC3B,eAAe,EAAE,0BAAe,CAAC,UAAU;gBAC3C,qDAAqD,EAAE,IAAI;aAC9D;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM;QACR,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YACtE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QAGf,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;gBAAE,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,IAAA,oBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACJ,IAAA,uBAAa,EAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpC,MAAM,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,oBAAU,EAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxG,CAAC;QACL,CAAC;QAGD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,EAAE,CAAC,iBAAiB,EAAE,CAAC;YACvB,EAAE,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC;YACvB,2BAA2B,EAAE,IAAI;YACjC,oBAAoB,EAAE;gBAClB,SAAS,EAAE,oBAAS,CAAC,MAAM;gBAC3B,eAAe,EAAE,0BAAe,CAAC,UAAU;gBAC3C,qDAAqD,EAAE,IAAI;aAC9D;SACJ,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAGD,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,SAAS,GAAG,KAAK;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;gBAAE,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,SAAS,GAAG,CAAC,CAAC;YACnF,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;YAAE,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAA,oBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAA,uBAAa,EAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,oBAAU,EAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,UAAU,IAAI,EAAE,CAAC,CAAC;QAC3F,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,oBAAoB,CAChB,UAAkB,EAClB,iBAAyB,EACzB,UAAkB,EAClB,UAAyB,EACzB,WAAW,GAAG,IAAI;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,UAAU,EAAE,CAAC,CAAC;QAEtG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,QAAQ;YACvB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAGzF,MAAM,GAAG,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,EAAE,KAAK,UAAU,CAAC,CAAC;QACrG,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,iBAAiB,CAAC,CAAC;YACjF,IAAI,CAAC,GAAG;gBAAE,GAAG,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,oBAAoB,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACxG,CAAC;QAGD,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACvD,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAC9D,CAAC;QACF,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,UAAU,EAAE,CAAC,CAAC;QAEzG,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,SAAU,CAAC,iBAAiB,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,gDAAgD,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,GAAG,IAA+B,CAAC;QAE7C,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,EAAE;YACvC,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,GAAuC,CAAC;YAC5C,IAAI,eAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACnC,IAAI,IAAI,IAAI,eAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;oBAAE,GAAG,GAAG,IAAI,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,uBAAuB,UAAU,EAAE,CAAC,CAAC;YAEzG,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,iBAAiB,CAAC,CAAC;YACnG,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW;gBAAE,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,UAAU;YAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAoC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAGD,wBAAwB,CACpB,QAAgB,EAChB,SAAiB,EACjB,UAAkB,EAClB,UAAkB;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QAE/E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,QAAQ;YACvB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzF,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW;YACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAE7F,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,cAAc,EAAE,CAAC;YAEjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,UAAU,oBAAoB,CAAC,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC;QAED,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAGlC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,UAAU,cAAc,SAAS,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;IAED,wBAAwB,CACpB,QAAgB,EAChB,SAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QAE/E,MAAM,WAAW,GAAG,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAG9C,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC;QAGD,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QAG1E,IAAA,uBAAa,EAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAEvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAKD,aAAa,CACT,QAAgB,EAChB,MAA4C;QAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,aAAa,CAAC,CAAC;YAC3E,OAAO,EAAE,kBAAkB,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3E,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,QAAQ;YACvB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzF,MAAM,eAAe,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACrE,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,kBAAkB,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3E,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBACzC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9C,IAAI,aAAa;gBAAE,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,eAAe,CAAC,MAAM,kBAAkB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAGD,mBAAmB,CACf,QAAgB,EAChB,KAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,QAAQ,aAAa,CAAC,CAAC;YAClF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,QAAQ;YACvB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzF,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACvD,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAC9D,CAAC;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,QAAQ,EAAE,CAAC,CAAC;YACjF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,SAAS,EAAE,iBAAiB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,IAAI,CAAC,eAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE5F,MAAM,IAAI,GAAG,IAA+B,CAAC;QAC7C,KAAK,MAAM,QAAQ,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,CAAU,EAAE,CAAC;YACjF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5D,MAAM,GAAG,GAAG,IAA8B,CAAC;YAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;gBAE9C,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC1C,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1E,IAAI,YAAY,EAAE,CAAC;oBACf,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/G,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAGD,SAAS,CACL,QAAgB,EAChB,UAAkB;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QAEhE,IAAI,WAAW,GAAG,IAAA,sBAAY,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAG5C,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;YACzE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC;QAGD,MAAM,WAAW,GAAG,wBAAwB,CAAC;QAC7C,IAAI,eAAuC,CAAC;QAC5C,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;QAEzB,OAAO,CAAC,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChE,eAAe,GAAG,eAAe,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxE,CAAC;QAGD,IAAI,UAAkB,CAAC;QACvB,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,UAAU;gBACN,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;oBACrC,IAAI;oBACJ,UAAU,CAAC,IAAI,EAAE;oBACjB,IAAI;oBACJ,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YAEJ,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,WAAW,CAAC;QAC1D,CAAC;QAED,IAAA,uBAAa,EAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAEvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;CAIJ,CAAA;AAvcY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAuc/B","sourcesContent":["// src/ai/services/solid-ts-morph.service.ts\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { join, dirname, normalize, isAbsolute, basename } from \"node:path\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { Project, Node, ObjectLiteralExpression, ArrayLiteralExpression, QuoteKind, IndentationText } from \"ts-morph\";\nimport { MethodDeclarationStructure, StructureKind } from \"ts-morph\";\n\ntype Bucket = \"providers\" | \"exports\";\n\n// interface SolidTsMorphOptions {\n// /** Absolute path to monorepo root. Defaults to auto-detect or ENV. */\n// repoRoot?: string;\n// /** Map of workspace prefixes to absolute directories. Defaults for solid-api / solid-ui. */\n// workspaceMap?: Record<string, string>;\n// }\n\n@Injectable()\nexport class SolidTsMorphService {\n private readonly logger = new Logger(SolidTsMorphService.name);\n private project: Project;\n\n // transaction state\n private inTxn = false;\n private stagedWrites = new Map<string, { content: string; overwrite: boolean }>(); // absPath -> write\n private dirtySourceFiles = new Set<string>(); // absPath\n\n // path roots\n private readonly repoRoot: string;\n private readonly workspaceMap: Record<string, string>;\n\n // constructor(opts: SolidTsMorphOptions = {}) {\n constructor() {\n // this.repoRoot = this.discoverRepoRoot(opts.repoRoot);\n this.repoRoot = this.discoverRepoRoot();\n this.workspaceMap = {\n \"solid-api\": join(this.repoRoot, \"solid-api\"),\n \"solid-ui\": join(this.repoRoot, \"solid-ui\"),\n // ...(opts.workspaceMap ?? {}),\n };\n\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n\n this.logger.debug(`SolidTsMorphService repoRoot = ${this.repoRoot}`);\n Object.entries(this.workspaceMap).forEach(([k, v]) => this.logger.debug(`workspace '${k}' => ${v}`));\n }\n\n // ---- repo-root discovery ----\n private discoverRepoRoot(): string {\n // if (input && isAbsolute(input)) return normalize(input);\n\n // ENV override\n const envRoot = process.env.SOLID_REPO_ROOT;\n if (envRoot && isAbsolute(envRoot)) return normalize(envRoot);\n\n // Auto-detect: if current cwd is a workspace (solid-api/solid-ui), then repoRoot = parent(cwd)\n const cwd = normalize(process.cwd());\n const base = basename(cwd);\n if (base === \"solid-api\" || base === \"solid-ui\") {\n return normalize(dirname(cwd));\n }\n\n // Otherwise assume cwd itself is the repo root\n return cwd;\n }\n\n /** Resolve a repo-relative path with optional workspace prefix (e.g. 'solid-api/...', 'solid-ui/...'). */\n private resolveRepoPath(relPath: string): string {\n if (!relPath) throw new Error(\"resolveRepoPath: empty path\");\n const p = normalize(relPath);\n\n if (isAbsolute(p)) return p;\n\n // Prefix-aware mapping: 'solid-api/...', 'solid-ui/...'\n for (const [prefix, root] of Object.entries(this.workspaceMap)) {\n if (p === prefix || p.startsWith(prefix + \"/\") || p.startsWith(prefix + \"\\\\\")) {\n const suffix = p.slice(prefix.length + (p.length > prefix.length ? 1 : 0));\n return normalize(join(root, suffix));\n }\n }\n\n // Default: treat as repo-root relative\n return normalize(join(this.repoRoot, p));\n }\n\n private rel(abs: string): string {\n const root = this.repoRoot.replace(/\\\\/g, \"/\");\n return abs.replace(/\\\\/g, \"/\").replace(root + \"/\", \"\");\n }\n\n // ---- transaction API ----\n begin(): void {\n if (this.inTxn) {\n this.logger.warn(\"begin(): already in a transaction; reusing current transaction.\");\n return;\n }\n this.inTxn = true;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n this.logger.log(\"Transaction started.\");\n }\n\n rollback(): void {\n if (!this.inTxn) return;\n this.inTxn = false;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n this.logger.log(\"Transaction rolled back.\");\n }\n\n async commit(): Promise<{ wrote: number }> {\n if (!this.inTxn) {\n this.logger.log(\"commit(): not in a transaction; nothing to commit.\");\n return { wrote: 0 };\n }\n\n let writes = 0;\n\n // 1) write staged new/overwritten files\n for (const [abs, { content, overwrite }] of this.stagedWrites.entries()) {\n const dir = dirname(abs);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n if (existsSync(abs) && !overwrite) {\n this.logger.log(`createNewFile (staged): skipped (exists) ${this.rel(abs)}`);\n } else {\n writeFileSync(abs, content, \"utf8\");\n writes++;\n this.logger.log(`${existsSync(abs) && overwrite ? \"Overwrote\" : \"Created\"} file: ${this.rel(abs)}`);\n }\n }\n\n // 2) save all mutated module files once\n for (const abs of this.dirtySourceFiles.values()) {\n const sf = this.project.getSourceFile(abs);\n if (!sf) continue;\n sf.fixMissingImports();\n sf.organizeImports();\n await sf.save();\n writes++;\n this.logger.log(`Updated module: ${this.rel(abs)}`);\n }\n\n // end txn\n this.inTxn = false;\n this.stagedWrites.clear();\n this.dirtySourceFiles.clear();\n this.project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Double,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n\n return { wrote: writes };\n }\n\n // ---- operations ----\n createNewFile(path: string, content: string, overwrite = false): { createdOrStaged: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(path);\n const dir = dirname(abs);\n\n if (this.inTxn) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n this.stagedWrites.set(abs, { content, overwrite });\n this.logger.log(`Staged createNewFile: ${this.rel(abs)} (overwrite=${overwrite})`);\n return { createdOrStaged: true, skipped: false };\n }\n\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n if (existsSync(abs) && !overwrite) {\n this.logger.log(`createNewFile: skipped (exists): ${path}`);\n return { createdOrStaged: false, skipped: true };\n }\n writeFileSync(abs, content, \"utf8\");\n this.logger.log(`${existsSync(abs) && overwrite ? \"Overwrote\" : \"Created\"} file: ${path}`);\n return { createdOrStaged: true, skipped: false };\n }\n\n registerNestProvider(\n modulePath: string,\n providerClassName: string,\n importFrom: string,\n registerIn: Array<Bucket>,\n uniqueGuard = true\n ): { staged: boolean } {\n const abs = this.resolveRepoPath(modulePath);\n if (!existsSync(abs)) throw new Error(`registerNestProvider: module file not found at ${modulePath}`);\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n // ensure import\n const imp = sourceFile.getImportDeclarations().find(d => d.getModuleSpecifierValue() === importFrom);\n if (imp) {\n const has = imp.getNamedImports().some(ni => ni.getName() === providerClassName);\n if (!has) imp.addNamedImport(providerClassName);\n } else {\n sourceFile.addImportDeclaration({ moduleSpecifier: importFrom, namedImports: [providerClassName] });\n }\n\n // mutate @Module metadata\n const nestModuleClass = sourceFile.getClasses().find(cls =>\n cls.getDecorators().some(dec => dec.getName() === \"Module\")\n );\n if (!nestModuleClass) throw new Error(`registerNestProvider: No @Module() class found in ${modulePath}`);\n\n const moduleDec = nestModuleClass.getDecorators().find(dec => dec.getName() === \"Module\");\n const callExpr = moduleDec!.getCallExpression();\n const arg0 = callExpr?.getArguments()[0];\n if (!arg0 || !Node.isObjectLiteralExpression(arg0)) {\n throw new Error(`registerNestProvider: Malformed @Module() in ${modulePath}`);\n }\n const meta = arg0 as ObjectLiteralExpression;\n\n const ensureInArray = (propName: Bucket) => {\n let prop = meta.getProperty(propName);\n if (!prop) {\n meta.addPropertyAssignment({ name: propName, initializer: \"[]\" });\n prop = meta.getProperty(propName);\n }\n let arr: ArrayLiteralExpression | undefined;\n if (Node.isPropertyAssignment(prop)) {\n const init = prop.getInitializer();\n if (init && Node.isArrayLiteralExpression(init)) arr = init;\n }\n if (!arr) throw new Error(`registerNestProvider: Property ${propName} is not an array in ${modulePath}`);\n\n const exists = arr.getElements().some(el => el.getText().replace(/\\s/g, \"\") === providerClassName);\n if (!exists || !uniqueGuard) arr.addElement(providerClassName);\n };\n\n for (const bucket of registerIn) ensureInArray(bucket);\n\n this.dirtySourceFiles.add(abs); // defer save to commit()\n this.logger.log(`Staged provider registration in: ${this.rel(abs)} (${registerIn.join(\", \")})`);\n return { staged: true };\n }\n\n\n addMethodToExistingClass(\n filePath: string,\n className: string,\n methodName: string,\n methodCode: string,\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`addMethodToExistingClass: File not found at ${filePath}`);\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n const targetClass = sourceFile.getClass(className);\n if (!targetClass)\n throw new Error(`addMethodToExistingClass: Class ${className} not found in ${filePath}`);\n\n const existingMethod = targetClass.getMethod(methodName);\n if (existingMethod) {\n\n this.logger.log(`Skipped adding method '${methodName}' (already exists)`);\n return { staged: false, overwritten: false, skipped: true };\n }\n // Add the LLM-generated method directly\n targetClass.addMember(methodCode);\n\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged method '${methodName}' in class ${className} at ${this.rel(abs)}`);\n return { staged: true, overwritten: !!existingMethod, skipped: false };\n }\n\n registerSolidUiExtension(\n filePath: string,\n lineToAdd: string\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`registerSolidUiExtension: File not found at ${filePath}`);\n\n const fileContent = readFileSync(abs, \"utf8\");\n\n // Check if the line already exists (avoid duplicates)\n if (fileContent.includes(lineToAdd.trim())) {\n this.logger.log(`Skipped adding line (already exists): ${lineToAdd}`);\n return { staged: false, overwritten: false, skipped: true };\n }\n\n // Append the new line at the end, ensuring newline\n const newContent = fileContent.trimEnd() + \"\\n\" + lineToAdd.trim() + \"\\n\";\n\n // Write updated content back\n writeFileSync(abs, newContent, \"utf8\");\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged new line in ${this.rel(abs)}: ${lineToAdd}`);\n return { staged: true, overwritten: false, skipped: false };\n }\n\n\n //Removes all import declarations from a file whose module specifier matches the given predicate.\n //Returns the set of identifier names that were imported by the removed declarations.\n removeImports(\n filePath: string,\n filter: (moduleSpecifier: string) => boolean\n ): { removedIdentifiers: Set<string>; staged: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs)) {\n this.logger.warn(`removeImport: file not found at ${filePath}, skipping.`);\n return { removedIdentifiers: new Set(), staged: false, skipped: true };\n }\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n const importsToRemove = sourceFile.getImportDeclarations().filter(decl => {\n const spec = decl.getModuleSpecifierValue().replace(/\\\\/g, \"/\");\n return filter(spec);\n });\n\n if (importsToRemove.length === 0) {\n return { removedIdentifiers: new Set(), staged: false, skipped: true };\n }\n\n const removedIdentifiers = new Set<string>();\n for (const decl of importsToRemove) {\n for (const named of decl.getNamedImports()) {\n removedIdentifiers.add(named.getAliasNode()?.getText() ?? named.getName());\n }\n const defaultImport = decl.getDefaultImport();\n if (defaultImport) removedIdentifiers.add(defaultImport.getText());\n decl.remove();\n }\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged removal of ${importsToRemove.length} import(s) in: ${this.rel(abs)}`);\n return { removedIdentifiers, staged: true, skipped: false };\n }\n\n //Removes the given identifier names from all @Module decorator array properties\n removeModuleMembers(\n filePath: string,\n names: Set<string> | string[]\n ): { staged: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs)) {\n this.logger.warn(`removeImportMembers: file not found at ${filePath}, skipping.`);\n return { staged: false, skipped: true };\n }\n\n const identifiers = names instanceof Set ? names : new Set(names);\n if (identifiers.size === 0) return { staged: false, skipped: true };\n\n const existing = this.project.getSourceFile(abs);\n const sourceFile = existing\n ? existing\n : this.project.createSourceFile(abs, readFileSync(abs, \"utf8\"), { overwrite: true });\n\n const nestModuleClass = sourceFile.getClasses().find(cls =>\n cls.getDecorators().some(dec => dec.getName() === \"Module\")\n );\n if (!nestModuleClass) {\n this.logger.warn(`removeImportMembers: no @Module() class found in ${filePath}`);\n return { staged: false, skipped: true };\n }\n\n const moduleDec = nestModuleClass.getDecorators().find(dec => dec.getName() === \"Module\");\n const arg0 = moduleDec?.getCallExpression()?.getArguments()[0];\n if (!arg0 || !Node.isObjectLiteralExpression(arg0)) return { staged: false, skipped: true };\n\n const meta = arg0 as ObjectLiteralExpression;\n for (const propName of [\"imports\", \"providers\", \"controllers\", \"exports\"] as const) {\n const prop = meta.getProperty(propName);\n if (!prop || !Node.isPropertyAssignment(prop)) continue;\n const init = prop.getInitializer();\n if (!init || !Node.isArrayLiteralExpression(init)) continue;\n const arr = init as ArrayLiteralExpression;\n const elements = arr.getElements();\n for (let i = elements.length - 1; i >= 0; i--) {\n const elemText = elements[i].getText().trim();\n // Match direct identifiers (e.g. TestService) or call expressions that reference them (e.g. TypeOrmModule.forFeature([Test])).\n const shouldRemove = identifiers.has(elemText) ||\n [...identifiers].some(id => new RegExp(`\\\\b${id}\\\\b`).test(elemText));\n if (shouldRemove) {\n arr.removeElement(i);\n }\n }\n }\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged removal of [${[...identifiers].join(\", \")}] from @Module arrays in: ${this.rel(abs)}`);\n return { staged: true, skipped: false };\n }\n\n\n addImport(\n filePath: string,\n importLine: string\n ): { staged: boolean; overwritten: boolean; skipped: boolean } {\n const abs = this.resolveRepoPath(filePath);\n if (!existsSync(abs))\n throw new Error(`addImport: File not found at ${filePath}`);\n\n let fileContent = readFileSync(abs, \"utf8\");\n\n // If import already exists — skip\n if (fileContent.includes(importLine.trim())) {\n this.logger.log(`Skipped adding import (already exists): ${importLine}`);\n return { staged: false, overwritten: false, skipped: true };\n }\n\n // Find last import statement (so we can insert after all imports)\n const importRegex = /^import .+ from .+;$/gm;\n let lastImportMatch: RegExpExecArray | null;\n let lastImportIndex = -1;\n\n while ((lastImportMatch = importRegex.exec(fileContent)) !== null) {\n lastImportIndex = lastImportMatch.index + lastImportMatch[0].length;\n }\n\n // Insert after last import (or at top if none exist)\n let newContent: string;\n if (lastImportIndex !== -1) {\n newContent =\n fileContent.slice(0, lastImportIndex) +\n \"\\n\" +\n importLine.trim() +\n \"\\n\" +\n fileContent.slice(lastImportIndex);\n } else {\n // No imports found — insert at top\n newContent = importLine.trim() + \"\\n\\n\" + fileContent;\n }\n\n writeFileSync(abs, newContent, \"utf8\");\n\n this.dirtySourceFiles.add(abs);\n this.logger.log(`Staged import in ${this.rel(abs)}: ${importLine}`);\n return { staged: true, overwritten: false, skipped: false };\n }\n\n\n\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA6UhF,qBA8ba,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAKvC"}
1
+ {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0VhF,qBAoca,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAKvC"}
@@ -123,6 +123,10 @@ const msg91_sms_publisher_service_1 = require("./jobs/msg91-sms-publisher.servic
123
123
  const msg91_sms_subscriber_service_1 = require("./jobs/msg91-sms-subscriber.service");
124
124
  const smtp_email_publisher_service_1 = require("./jobs/smtp-email-publisher.service");
125
125
  const smtp_email_subscriber_service_1 = require("./jobs/smtp-email-subscriber.service");
126
+ const chatter_queue_publisher_service_1 = require("./jobs/chatter-queue-publisher.service");
127
+ const chatter_queue_subscriber_service_1 = require("./jobs/chatter-queue-subscriber.service");
128
+ const chatter_queue_publisher_database_service_1 = require("./jobs/database/chatter-queue-publisher-database.service");
129
+ const chatter_queue_subscriber_database_service_1 = require("./jobs/database/chatter-queue-subscriber-database.service");
126
130
  const test_queue_publisher_service_1 = require("./jobs/test-queue-publisher.service");
127
131
  const test_queue_subscriber_service_1 = require("./jobs/test-queue-subscriber.service");
128
132
  const user_registration_listener_1 = require("./listeners/user-registration.listener");
@@ -159,6 +163,7 @@ const chatter_message_controller_1 = require("./controllers/chatter-message.cont
159
163
  const dashboard_question_sql_dataset_config_controller_1 = require("./controllers/dashboard-question-sql-dataset-config.controller");
160
164
  const dashboard_question_controller_1 = require("./controllers/dashboard-question.controller");
161
165
  const dashboard_variable_controller_1 = require("./controllers/dashboard-variable.controller");
166
+ const dashboard_layout_controller_1 = require("./controllers/dashboard-layout.controller");
162
167
  const dashboard_controller_1 = require("./controllers/dashboard.controller");
163
168
  const export_template_controller_1 = require("./controllers/export-template.controller");
164
169
  const export_transaction_controller_1 = require("./controllers/export-transaction.controller");
@@ -182,6 +187,7 @@ const chatter_message_entity_1 = require("./entities/chatter-message.entity");
182
187
  const dashboard_question_sql_dataset_config_entity_1 = require("./entities/dashboard-question-sql-dataset-config.entity");
183
188
  const dashboard_question_entity_1 = require("./entities/dashboard-question.entity");
184
189
  const dashboard_variable_entity_1 = require("./entities/dashboard-variable.entity");
190
+ const dashboard_layout_entity_1 = require("./entities/dashboard-layout.entity");
185
191
  const dashboard_entity_1 = require("./entities/dashboard.entity");
186
192
  const export_template_entity_1 = require("./entities/export-template.entity");
187
193
  const export_transaction_entity_1 = require("./entities/export-transaction.entity");
@@ -243,6 +249,7 @@ const dashboard_question_sql_dataset_config_repository_1 = require("./repository
243
249
  const dashboard_question_repository_1 = require("./repository/dashboard-question.repository");
244
250
  const dashboard_variable_repository_1 = require("./repository/dashboard-variable.repository");
245
251
  const dashboard_repository_1 = require("./repository/dashboard.repository");
252
+ const dashboard_layout_repository_1 = require("./repository/dashboard-layout.repository");
246
253
  const email_template_repository_1 = require("./repository/email-template.repository");
247
254
  const export_template_repository_1 = require("./repository/export-template.repository");
248
255
  const export_transaction_repository_1 = require("./repository/export-transaction.repository");
@@ -285,6 +292,7 @@ const dashboard_variable_sql_dynamic_provider_service_1 = require("./services/da
285
292
  const dashboard_variable_test_dynamic_provider_service_1 = require("./services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service");
286
293
  const dashboard_variable_service_1 = require("./services/dashboard-variable.service");
287
294
  const dashboard_service_1 = require("./services/dashboard.service");
295
+ const dashboard_layout_service_1 = require("./services/dashboard-layout.service");
288
296
  const excel_service_1 = require("./services/excel.service");
289
297
  const export_template_service_1 = require("./services/export-template.service");
290
298
  const export_transaction_service_1 = require("./services/export-transaction.service");
@@ -372,6 +380,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
372
380
  dashboard_question_entity_1.DashboardQuestion,
373
381
  dashboard_question_sql_dataset_config_entity_1.DashboardQuestionSqlDatasetConfig,
374
382
  dashboard_variable_entity_1.DashboardVariable,
383
+ dashboard_layout_entity_1.DashboardLayout,
375
384
  email_attachment_entity_1.EmailAttachment,
376
385
  email_template_entity_1.EmailTemplate,
377
386
  export_template_entity_1.ExportTemplate,
@@ -436,6 +445,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
436
445
  dashboard_question_controller_1.DashboardQuestionController,
437
446
  dashboard_question_sql_dataset_config_controller_1.DashboardQuestionSqlDatasetConfigController,
438
447
  dashboard_variable_controller_1.DashboardVariableController,
448
+ dashboard_layout_controller_1.DashboardLayoutController,
439
449
  email_template_controller_1.EmailTemplateController,
440
450
  export_template_controller_1.ExportTemplateController,
441
451
  export_transaction_controller_1.ExportTransactionController,
@@ -602,6 +612,10 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
602
612
  user_registration_listener_1.UserRegistrationListener,
603
613
  test_queue_publisher_service_1.TestQueuePublisher,
604
614
  test_queue_subscriber_service_1.TestQueueSubscriber,
615
+ chatter_queue_publisher_service_1.ChatterQueuePublisherRabbitmq,
616
+ chatter_queue_subscriber_service_1.ChatterQueueSubscriberRabbitmq,
617
+ chatter_queue_publisher_database_service_1.ChatterQueuePublisherDatabase,
618
+ chatter_queue_subscriber_database_service_1.ChatterQueueSubscriberDatabase,
605
619
  test_queue_publisher_database_service_1.TestQueuePublisherDatabase,
606
620
  test_queue_subscriber_database_service_1.TestQueueSubscriberDatabase,
607
621
  generate_code_publisher_database_service_1.GenerateCodePublisherDatabase,
@@ -653,6 +667,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
653
667
  user_activity_history_service_1.UserActivityHistoryService,
654
668
  dashboard_service_1.DashboardService,
655
669
  dashboard_variable_service_1.DashboardVariableService,
670
+ dashboard_layout_service_1.DashboardLayoutService,
656
671
  dashboard_question_service_1.DashboardQuestionService,
657
672
  dashboard_variable_sql_dynamic_provider_service_1.DashboardVariableSQLDynamicProvider,
658
673
  dashboard_variable_test_dynamic_provider_service_1.DasbhoardVariableTestDynamicProvider,
@@ -688,6 +703,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
688
703
  dashboard_question_sql_dataset_config_repository_1.DashboardQuestionSqlDatasetConfigRepository,
689
704
  dashboard_question_repository_1.DashboardQuestionRepository,
690
705
  dashboard_variable_repository_1.DashboardVariableRepository,
706
+ dashboard_layout_repository_1.DashboardLayoutRepository,
691
707
  email_template_repository_1.EmailTemplateRepository,
692
708
  export_template_repository_1.ExportTemplateRepository,
693
709
  export_transaction_repository_1.ExportTransactionRepository,