@solidxai/core 0.1.6-beta.2 → 0.1.6-beta.21

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 (303) hide show
  1. package/dist/controllers/dashboard-layout.controller.d.ts +47 -0
  2. package/dist/controllers/dashboard-layout.controller.d.ts.map +1 -0
  3. package/dist/controllers/dashboard-layout.controller.js +204 -0
  4. package/dist/controllers/dashboard-layout.controller.js.map +1 -0
  5. package/dist/controllers/scheduled-job.controller.d.ts +1 -0
  6. package/dist/controllers/scheduled-job.controller.d.ts.map +1 -1
  7. package/dist/controllers/scheduled-job.controller.js +12 -0
  8. package/dist/controllers/scheduled-job.controller.js.map +1 -1
  9. package/dist/dtos/create-dashboard-layout.dto.d.ts +8 -0
  10. package/dist/dtos/create-dashboard-layout.dto.d.ts.map +1 -0
  11. package/dist/dtos/create-dashboard-layout.dto.js +53 -0
  12. package/dist/dtos/create-dashboard-layout.dto.js.map +1 -0
  13. package/dist/dtos/create-dashboard-variable.dto.d.ts +1 -0
  14. package/dist/dtos/create-dashboard-variable.dto.d.ts.map +1 -1
  15. package/dist/dtos/create-dashboard-variable.dto.js +7 -1
  16. package/dist/dtos/create-dashboard-variable.dto.js.map +1 -1
  17. package/dist/dtos/update-dashboard-layout.dto.d.ts +8 -0
  18. package/dist/dtos/update-dashboard-layout.dto.d.ts.map +1 -0
  19. package/dist/dtos/update-dashboard-layout.dto.js +53 -0
  20. package/dist/dtos/update-dashboard-layout.dto.js.map +1 -0
  21. package/dist/dtos/update-dashboard-variable.dto.d.ts +1 -0
  22. package/dist/dtos/update-dashboard-variable.dto.d.ts.map +1 -1
  23. package/dist/dtos/update-dashboard-variable.dto.js +7 -1
  24. package/dist/dtos/update-dashboard-variable.dto.js.map +1 -1
  25. package/dist/entities/action-metadata.entity.d.ts.map +1 -1
  26. package/dist/entities/action-metadata.entity.js.map +1 -1
  27. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  28. package/dist/entities/ai-interaction.entity.js +5 -4
  29. package/dist/entities/ai-interaction.entity.js.map +1 -1
  30. package/dist/entities/chatter-message-details.entity.d.ts +1 -0
  31. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  32. package/dist/entities/chatter-message-details.entity.js +9 -4
  33. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  34. package/dist/entities/chatter-message.entity.d.ts.map +1 -1
  35. package/dist/entities/chatter-message.entity.js +4 -3
  36. package/dist/entities/chatter-message.entity.js.map +1 -1
  37. package/dist/entities/common.entity.js +1 -1
  38. package/dist/entities/common.entity.js.map +1 -1
  39. package/dist/entities/dashboard-layout.entity.d.ts +9 -0
  40. package/dist/entities/dashboard-layout.entity.d.ts.map +1 -0
  41. package/dist/entities/dashboard-layout.entity.js +41 -0
  42. package/dist/entities/dashboard-layout.entity.js.map +1 -0
  43. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -1
  44. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +5 -4
  45. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  46. package/dist/entities/dashboard-question.entity.d.ts.map +1 -1
  47. package/dist/entities/dashboard-question.entity.js +5 -4
  48. package/dist/entities/dashboard-question.entity.js.map +1 -1
  49. package/dist/entities/dashboard-variable.entity.d.ts +1 -0
  50. package/dist/entities/dashboard-variable.entity.d.ts.map +1 -1
  51. package/dist/entities/dashboard-variable.entity.js +10 -4
  52. package/dist/entities/dashboard-variable.entity.js.map +1 -1
  53. package/dist/entities/dashboard.entity.d.ts +2 -0
  54. package/dist/entities/dashboard.entity.d.ts.map +1 -1
  55. package/dist/entities/dashboard.entity.js +9 -3
  56. package/dist/entities/dashboard.entity.js.map +1 -1
  57. package/dist/entities/email-attachment.entity.d.ts.map +1 -1
  58. package/dist/entities/email-attachment.entity.js +2 -1
  59. package/dist/entities/email-attachment.entity.js.map +1 -1
  60. package/dist/entities/email-template.entity.js +1 -1
  61. package/dist/entities/email-template.entity.js.map +1 -1
  62. package/dist/entities/export-transaction.entity.d.ts.map +1 -1
  63. package/dist/entities/export-transaction.entity.js +2 -1
  64. package/dist/entities/export-transaction.entity.js.map +1 -1
  65. package/dist/entities/field-metadata.entity.js +2 -2
  66. package/dist/entities/field-metadata.entity.js.map +1 -1
  67. package/dist/entities/import-transaction-error-log.entity.d.ts.map +1 -1
  68. package/dist/entities/import-transaction-error-log.entity.js +3 -2
  69. package/dist/entities/import-transaction-error-log.entity.js.map +1 -1
  70. package/dist/entities/import-transaction.entity.d.ts.map +1 -1
  71. package/dist/entities/import-transaction.entity.js +2 -1
  72. package/dist/entities/import-transaction.entity.js.map +1 -1
  73. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  74. package/dist/entities/legacy-common.entity.js +1 -1
  75. package/dist/entities/legacy-common.entity.js.map +1 -1
  76. package/dist/entities/mq-message.entity.d.ts.map +1 -1
  77. package/dist/entities/mq-message.entity.js +5 -3
  78. package/dist/entities/mq-message.entity.js.map +1 -1
  79. package/dist/entities/saved-filters.entity.d.ts.map +1 -1
  80. package/dist/entities/saved-filters.entity.js +3 -2
  81. package/dist/entities/saved-filters.entity.js.map +1 -1
  82. package/dist/entities/security-rule.entity.d.ts.map +1 -1
  83. package/dist/entities/security-rule.entity.js +2 -1
  84. package/dist/entities/security-rule.entity.js.map +1 -1
  85. package/dist/entities/sms-template.entity.js +1 -1
  86. package/dist/entities/sms-template.entity.js.map +1 -1
  87. package/dist/entities/user-view-metadata.entity.d.ts.map +1 -1
  88. package/dist/entities/user-view-metadata.entity.js +2 -1
  89. package/dist/entities/user-view-metadata.entity.js.map +1 -1
  90. package/dist/entities/user.entity.d.ts.map +1 -1
  91. package/dist/entities/user.entity.js +2 -0
  92. package/dist/entities/user.entity.js.map +1 -1
  93. package/dist/entities/view-metadata.entity.d.ts.map +1 -1
  94. package/dist/entities/view-metadata.entity.js.map +1 -1
  95. package/dist/helpers/bootstrap.helper.d.ts +14 -0
  96. package/dist/helpers/bootstrap.helper.d.ts.map +1 -0
  97. package/dist/helpers/bootstrap.helper.js +132 -0
  98. package/dist/helpers/bootstrap.helper.js.map +1 -0
  99. package/dist/helpers/cache.helper.d.ts +2 -0
  100. package/dist/helpers/cache.helper.d.ts.map +1 -0
  101. package/dist/helpers/cache.helper.js +8 -0
  102. package/dist/helpers/cache.helper.js.map +1 -0
  103. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  104. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  105. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +8 -9
  106. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  107. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts +2 -2
  108. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.d.ts.map +1 -1
  109. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js +8 -5
  110. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  111. package/dist/helpers/solid-registry.d.ts.map +1 -1
  112. package/dist/helpers/solid-registry.js.map +1 -1
  113. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  114. package/dist/helpers/typeorm-db-helper.js +21 -0
  115. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  116. package/dist/index.d.ts +3 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +3 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/interfaces.d.ts +5 -1
  121. package/dist/interfaces.d.ts.map +1 -1
  122. package/dist/interfaces.js.map +1 -1
  123. package/dist/jobs/computed-field-evaluation-queue-options.d.ts +1 -0
  124. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -1
  125. package/dist/jobs/computed-field-evaluation-queue-options.js +1 -0
  126. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -1
  127. package/dist/repository/dashboard-layout.repository.d.ts +12 -0
  128. package/dist/repository/dashboard-layout.repository.d.ts.map +1 -0
  129. package/dist/repository/dashboard-layout.repository.js +34 -0
  130. package/dist/repository/dashboard-layout.repository.js.map +1 -0
  131. package/dist/seeders/module-metadata-seeder.service.js +4 -4
  132. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  133. package/dist/seeders/seed-data/solid-core-metadata.json +445 -35
  134. package/dist/services/authentication.service.d.ts.map +1 -1
  135. package/dist/services/authentication.service.js +44 -21
  136. package/dist/services/authentication.service.js.map +1 -1
  137. package/dist/services/chatter-message.service.d.ts +0 -1
  138. package/dist/services/chatter-message.service.d.ts.map +1 -1
  139. package/dist/services/chatter-message.service.js +22 -19
  140. package/dist/services/chatter-message.service.js.map +1 -1
  141. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +7 -3
  142. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -1
  143. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +61 -22
  144. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -1
  145. package/dist/services/crud.service.js +1 -1
  146. package/dist/services/crud.service.js.map +1 -1
  147. package/dist/services/dashboard-layout.service.d.ts +20 -0
  148. package/dist/services/dashboard-layout.service.d.ts.map +1 -0
  149. package/dist/services/dashboard-layout.service.js +120 -0
  150. package/dist/services/dashboard-layout.service.js.map +1 -0
  151. package/dist/services/dashboard-question.service.d.ts +4 -0
  152. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  153. package/dist/services/dashboard-question.service.js +22 -8
  154. package/dist/services/dashboard-question.service.js.map +1 -1
  155. package/dist/services/dashboard.service.d.ts +2 -0
  156. package/dist/services/dashboard.service.d.ts.map +1 -1
  157. package/dist/services/dashboard.service.js +4 -0
  158. package/dist/services/dashboard.service.js.map +1 -1
  159. package/dist/services/model-metadata.service.d.ts +6 -1
  160. package/dist/services/model-metadata.service.d.ts.map +1 -1
  161. package/dist/services/model-metadata.service.js +151 -8
  162. package/dist/services/model-metadata.service.js.map +1 -1
  163. package/dist/services/permission-metadata.service.d.ts +5 -1
  164. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  165. package/dist/services/permission-metadata.service.js +66 -20
  166. package/dist/services/permission-metadata.service.js.map +1 -1
  167. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts +2 -4
  168. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts.map +1 -1
  169. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js +2 -1
  170. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js.map +1 -1
  171. package/dist/services/question-data-providers/interfaces.d.ts +1 -0
  172. package/dist/services/question-data-providers/interfaces.d.ts.map +1 -0
  173. package/dist/services/question-data-providers/interfaces.js +1 -0
  174. package/dist/services/question-data-providers/interfaces.js.map +1 -0
  175. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts +2 -5
  176. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts.map +1 -1
  177. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js +2 -1
  178. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js.map +1 -1
  179. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts +2 -5
  180. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts.map +1 -1
  181. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js +2 -1
  182. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js.map +1 -1
  183. package/dist/services/queues/database-subscriber.service.d.ts +4 -2
  184. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  185. package/dist/services/queues/database-subscriber.service.js +15 -2
  186. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  187. package/dist/services/queues/publisher-factory.service.d.ts.map +1 -1
  188. package/dist/services/queues/publisher-factory.service.js +4 -6
  189. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  190. package/dist/services/queues/rabbitmq-subscriber.service.d.ts +8 -3
  191. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  192. package/dist/services/queues/rabbitmq-subscriber.service.js +78 -6
  193. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  194. package/dist/services/scheduled-job.service.d.ts +6 -1
  195. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  196. package/dist/services/scheduled-job.service.js +26 -2
  197. package/dist/services/scheduled-job.service.js.map +1 -1
  198. package/dist/services/scheduled-jobs/scheduler.interface.d.ts +2 -0
  199. package/dist/services/scheduled-jobs/scheduler.interface.d.ts.map +1 -1
  200. package/dist/services/scheduled-jobs/scheduler.interface.js.map +1 -1
  201. package/dist/services/scheduled-jobs/scheduler.service.d.ts +6 -2
  202. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  203. package/dist/services/scheduled-jobs/scheduler.service.js +75 -17
  204. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  205. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts.map +1 -1
  206. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.js +4 -1
  207. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.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 +8 -0
  214. package/dist/solid-core.module.js.map +1 -1
  215. package/dist/subscribers/computed-entity-field.subscriber.js +3 -1
  216. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  217. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +4 -4
  218. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
  219. package/dist/transformers/typeorm/local-date-time-transformer.js +25 -28
  220. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
  221. package/dist-tests/api/authenticate.spec.js +119 -0
  222. package/dist-tests/api/authenticate.spec.js.map +1 -0
  223. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  224. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  225. package/dist-tests/api/ping.spec.js +21 -0
  226. package/dist-tests/api/ping.spec.js.map +1 -0
  227. package/dist-tests/helpers/auth.js +41 -0
  228. package/dist-tests/helpers/auth.js.map +1 -0
  229. package/dist-tests/helpers/env.js +11 -0
  230. package/dist-tests/helpers/env.js.map +1 -0
  231. package/package.json +3 -1
  232. package/sql/default/mariadb/proc_CleanupModelMetadata.sql +153 -0
  233. package/sql/default/mariadb/proc_CleanupModuleMetadata.sql +56 -0
  234. package/sql/default/mysql/proc_CleanupModelMetadata.sql +153 -0
  235. package/sql/default/mysql/proc_CleanupModuleMetadata.sql +56 -0
  236. package/src/controllers/dashboard-layout.controller.ts +106 -0
  237. package/src/controllers/scheduled-job.controller.ts +6 -0
  238. package/src/dtos/create-dashboard-layout.dto.ts +31 -0
  239. package/src/dtos/create-dashboard-variable.dto.ts +4 -0
  240. package/src/dtos/update-dashboard-layout.dto.ts +30 -0
  241. package/src/dtos/update-dashboard-variable.dto.ts +5 -1
  242. package/src/entities/action-metadata.entity.ts +3 -2
  243. package/src/entities/ai-interaction.entity.ts +5 -4
  244. package/src/entities/chatter-message-details.entity.ts +7 -3
  245. package/src/entities/chatter-message.entity.ts +4 -3
  246. package/src/entities/common.entity.ts +2 -2
  247. package/src/entities/dashboard-layout.entity.ts +18 -0
  248. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +5 -4
  249. package/src/entities/dashboard-question.entity.ts +5 -4
  250. package/src/entities/dashboard-variable.entity.ts +9 -4
  251. package/src/entities/dashboard.entity.ts +7 -2
  252. package/src/entities/email-attachment.entity.ts +2 -1
  253. package/src/entities/email-template.entity.ts +1 -1
  254. package/src/entities/export-transaction.entity.ts +2 -1
  255. package/src/entities/field-metadata.entity.ts +2 -2
  256. package/src/entities/import-transaction-error-log.entity.ts +3 -2
  257. package/src/entities/import-transaction.entity.ts +2 -1
  258. package/src/entities/legacy-common.entity.ts +3 -4
  259. package/src/entities/mq-message.entity.ts +5 -3
  260. package/src/entities/saved-filters.entity.ts +3 -2
  261. package/src/entities/security-rule.entity.ts +2 -1
  262. package/src/entities/sms-template.entity.ts +1 -1
  263. package/src/entities/user-view-metadata.entity.ts +2 -1
  264. package/src/entities/user.entity.ts +37 -2
  265. package/src/entities/view-metadata.entity.ts +3 -0
  266. package/src/helpers/bootstrap.helper.ts +222 -0
  267. package/src/helpers/cache.helper.ts +5 -0
  268. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +9 -9
  269. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +9 -6
  270. package/src/helpers/solid-registry.ts +1 -5
  271. package/src/helpers/typeorm-db-helper.ts +26 -0
  272. package/src/index.ts +3 -0
  273. package/src/interfaces.ts +9 -1
  274. package/src/jobs/computed-field-evaluation-queue-options.ts +1 -0
  275. package/src/repository/dashboard-layout.repository.ts +17 -0
  276. package/src/seeders/module-metadata-seeder.service.ts +5 -5
  277. package/src/seeders/seed-data/solid-core-metadata.json +446 -36
  278. package/src/services/authentication.service.ts +46 -24
  279. package/src/services/chatter-message.service.ts +21 -21
  280. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +79 -40
  281. package/src/services/crud.service.ts +1 -1
  282. package/src/services/dashboard-layout.service.ts +111 -0
  283. package/src/services/dashboard-question.service.ts +23 -4
  284. package/src/services/dashboard.service.ts +7 -0
  285. package/src/services/model-metadata.service.ts +173 -50
  286. package/src/services/permission-metadata.service.ts +73 -20
  287. package/src/services/question-data-providers/chartjs-sql-data-provider.service.ts +3 -7
  288. package/src/services/question-data-providers/interfaces.ts +0 -0
  289. package/src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts +4 -8
  290. package/src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts +4 -8
  291. package/src/services/queues/database-subscriber.service.ts +19 -2
  292. package/src/services/queues/publisher-factory.service.ts +8 -6
  293. package/src/services/queues/rabbitmq-subscriber.service.ts +123 -6
  294. package/src/services/scheduled-job.service.ts +31 -2
  295. package/src/services/scheduled-jobs/scheduler.interface.ts +4 -1
  296. package/src/services/scheduled-jobs/scheduler.service.ts +82 -20
  297. package/src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts +4 -1
  298. package/src/services/solid-ts-morph.service.ts +98 -0
  299. package/src/solid-core.module.ts +13 -0
  300. package/src/subscribers/computed-entity-field.subscriber.ts +3 -3
  301. package/src/transformers/typeorm/local-date-time-transformer.ts +41 -33
  302. package/.claude/settings.local.json +0 -15
  303. package/src/services/1.js +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { IsNull, LessThanOrEqual } from 'typeorm';\n\nimport { Cron, CronExpression } from '@nestjs/schedule';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';\nimport { ISchedulerService } from './scheduler.interface';\nimport { CronExpressionParser } from 'cron-parser';\n\n@Injectable()\nexport class SchedulerServiceImpl implements ISchedulerService {\n private readonly logger = new Logger(SchedulerServiceImpl.name);\n private readonly runningJobs = new Set<string>();\n\n constructor(\n // @InjectRepository(ScheduledJob)\n // private readonly scheduledJobRepo: Repository<ScheduledJob>,\n private readonly scheduledJobRepo: ScheduledJobRepository,\n private readonly solidRegistry: SolidRegistry,\n ) { }\n\n @Cron(CronExpression.EVERY_MINUTE)\n async runScheduledJobs(): Promise<void> {\n const solidSchedulerEnabled = process.env.SOLID_SCHEDULER_ENABLED || \"true\";\n if (solidSchedulerEnabled.toLowerCase() !== \"true\") {\n // this.logger.debug('Solid scheduler is disabled via environment variable');\n return;\n }\n const solidCliRunning = process.env.SOLID_CLI_RUNNING || \"false\";\n if (solidCliRunning === \"true\") {\n return;\n }\n\n const now = new Date();\n\n // this.logger.log(`[${now.getTime()}]: scheduler service started run...`);\n const dueJobs = await this.scheduledJobRepo.find({\n where: [\n {\n isActive: true,\n nextRunAt: LessThanOrEqual(now),\n },\n // Newly created jobs are also picked for examination \n {\n isActive: true,\n nextRunAt: IsNull(),\n },\n ],\n });\n\n // this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);\n\n for (const job of dueJobs) {\n const jobKey = String(job.id ?? job.scheduleName ?? job.job);\n\n if (this.runningJobs.has(jobKey)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job} because a run is already in progress`);\n continue;\n }\n\n if (!this.shouldRunNow(job, now)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job}`);\n continue;\n }\n\n const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);\n if (!handler) {\n this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);\n continue;\n }\n\n this.runningJobs.add(jobKey);\n this.logger.log(`[${now.getTime()}]: scheduler service attempting to run job ${job.job}`);\n try {\n // this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);\n await handler.execute(job);\n // this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);\n\n job.isActive = true;\n const finishedAt = new Date();\n job.lastRunAt = finishedAt;\n job.nextRunAt = this.computeNextRunAt(job, finishedAt);\n this.logger.log(`[${now.getTime()}]: scheduler service coomputed next run for ${job.job} as ${job.nextRunAt}`);\n\n await this.scheduledJobRepo.save(job);\n this.logger.log(`[${now.getTime()}]: scheduler service finished running job: ${job.job}`);\n } catch (err) {\n this.logger.error(`[${now.getTime()}]: scheduler service failed to run job ${job.job}`, err.stack);\n } finally {\n this.runningJobs.delete(jobKey);\n }\n }\n }\n\n private shouldRunNow(job: ScheduledJob, now: Date): boolean {\n const today = now.toISOString().split('T')[0]; // yyyy-mm-dd\n const timeNow = now.toTimeString().slice(0, 5); // hh:mm\n\n // 1. Check startDate / endDate\n if (job.startDate && new Date(today) < new Date(job.startDate)) return false;\n if (job.endDate && new Date(today) > new Date(job.endDate)) return false;\n\n // 2. Check startTime / endTime\n if (job.startTime) {\n const jobStart = job.startTime.toTimeString().slice(0, 5);\n if (timeNow < jobStart) return false;\n }\n if (job.endTime) {\n const jobEnd = job.endTime.toTimeString().slice(0, 5);\n if (timeNow > jobEnd) return false;\n }\n\n // 3. Check custom frequency\n if (job.frequency.toLowerCase() === 'custom') {\n // Custom cron expressions handle their own scheduling logic\n // Just check if nextRunAt is due, which was already checked in the query\n return true;\n }\n\n // 3. Check dayOfWeek (for weekly)\n if (job.frequency.toLowerCase() === 'weekly' && job.dayOfWeek) {\n const todayName = now.toLocaleString('en-US', { weekday: 'long' }); // e.g., \"Monday\"\n // const days = job.dayOfWeek.split(',').map(d => d.trim());\n const days = JSON.parse(job.dayOfWeek) as string[];\n if (!days.includes(todayName)) return false;\n }\n\n // 4. Check dayOfMonth (for monthly)\n if (job.frequency.toLowerCase() === 'monthly' && job.dayOfMonth) {\n const dom = now.getDate();\n if (dom !== job.dayOfMonth) return false;\n }\n\n return true;\n }\n\n private computeNextRunForCustomCron(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n if (!job.cronExpression) {\n this.logger.error(`Custom frequency requires cronExpression for job ${job.scheduleName}`);\n // Fallback to daily if cron expression is missing\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n\n try {\n const interval = CronExpressionParser.parse(job.cronExpression, {\n currentDate: from,\n tz: 'UTC'\n });\n const nextRun = interval.next().toDate();\n\n // Validate minimum 1 minute interval\n if (nextRun.getTime() - from.getTime() < 60000) {\n throw new Error('Cron expression interval must be at least 1 minute');\n }\n \n this.logger.log(`Custom cron '${job.cronExpression}' next run: ${nextRun}`);\n return nextRun;\n } catch (error) {\n this.logger.error(`Invalid cron expression for job ${job.scheduleName}: ${job.cronExpression}`, error);\n // Fallback to daily if cron parsing fails\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n\n private computeNextRunAt(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n switch (job.frequency.toLowerCase()) {\n // case 'once':\n // return null; // don't reschedule\n case 'every minute':\n return new Date(base.getTime() + 1 * 60 * 1000);\n case 'hourly':\n return new Date(base.getTime() + 60 * 60 * 1000);\n case 'daily':\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n case 'weekly':\n return new Date(base.getTime() + 7 * 24 * 60 * 60 * 1000);\n case 'monthly':\n const next = new Date(base);\n next.setMonth(base.getMonth() + 1);\n return next;\n case 'custom':\n return this.computeNextRunForCustomCron(job, from);\n default:\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { IsNull, LessThanOrEqual } from 'typeorm';\n\nimport { Cron, CronExpression } from '@nestjs/schedule';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';\nimport { ISchedulerService } from './scheduler.interface';\nimport { CronExpressionParser } from 'cron-parser';\n\n@Injectable()\nexport class SchedulerServiceImpl implements ISchedulerService {\n private readonly logger = new Logger(SchedulerServiceImpl.name);\n private readonly runningJobs = new Set<string>();\n\n constructor(\n // @InjectRepository(ScheduledJob)\n // private readonly scheduledJobRepo: Repository<ScheduledJob>,\n private readonly scheduledJobRepo: ScheduledJobRepository,\n private readonly solidRegistry: SolidRegistry,\n ) { }\n\n @Cron(CronExpression.EVERY_MINUTE)\n async runScheduledJobs(): Promise<void> {\n const solidSchedulerEnabled = process.env.SOLID_SCHEDULER_ENABLED || \"true\";\n if (solidSchedulerEnabled.toLowerCase() !== \"true\") {\n this.logger.debug('Solid scheduler is disabled via environment variable');\n return;\n }\n const solidCliRunning = process.env.SOLID_CLI_RUNNING || \"false\";\n if (solidCliRunning === \"true\") {\n return;\n }\n const jobsRegexToEnable = (process.env.SOLID_SCHEDULER_JOBS_REGEX_TO_ENABLE || '').trim();\n let jobsRegex: RegExp | null = null;\n if (jobsRegexToEnable && jobsRegexToEnable !== \"all\") {\n try {\n jobsRegex = new RegExp(jobsRegexToEnable);\n } catch (error) {\n this.logger.error(`Invalid SOLID_SCHEDULER_JOBS_REGEX_TO_ENABLE regex \"${jobsRegexToEnable}\". Scheduler loop will skip this run.`);\n return;\n }\n }\n\n const now = new Date();\n\n // this.logger.log(`[${now.getTime()}]: scheduler service started run...`);\n const dueJobs = await this.scheduledJobRepo.find({\n where: [\n {\n isActive: true,\n nextRunAt: LessThanOrEqual(now),\n },\n // Newly created jobs are also picked for examination \n {\n isActive: true,\n nextRunAt: IsNull(),\n },\n ],\n });\n\n // this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);\n\n for (const job of dueJobs) {\n const jobKey = String(job.id ?? job.scheduleName ?? job.job);\n const jobName = String(job.job ?? '');\n\n if (jobsRegex && !jobsRegex.test(jobName)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${jobName} because it does not match SOLID_SCHEDULER_JOBS_REGEX_TO_ENABLE=${jobsRegexToEnable}`);\n continue;\n }\n\n if (this.runningJobs.has(jobKey)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job} because a run is already in progress`);\n continue;\n }\n\n if (!this.shouldRunNow(job, now)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job}`);\n continue;\n }\n\n const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);\n if (!handler) {\n this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);\n continue;\n }\n\n this.runningJobs.add(jobKey);\n this.logger.log(`[${now.getTime()}]: scheduler service attempting to run job ${job.job}`);\n try {\n // this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);\n await handler.execute(job);\n // this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);\n\n job.isActive = true;\n const finishedAt = new Date();\n job.lastRunAt = finishedAt;\n job.nextRunAt = this.computeNextRunAt(job, finishedAt);\n this.logger.log(`[${now.getTime()}]: scheduler service coomputed next run for ${job.job} as ${job.nextRunAt}`);\n\n await this.scheduledJobRepo.save(job);\n this.logger.log(`[${now.getTime()}]: scheduler service finished running job: ${job.job}`);\n } catch (err) {\n this.logger.error(`[${now.getTime()}]: scheduler service failed to run job ${job.job}`, err.stack);\n } finally {\n this.runningJobs.delete(jobKey);\n }\n }\n }\n\n private shouldRunNow(job: ScheduledJob, now: Date): boolean {\n const today = new Date(now);\n today.setHours(0, 0, 0, 0);\n const timeNow = this.toHHMM(now); // hh:mm\n\n // 1. Check startDate / endDate\n const startDate = this.toDateOnly(job.startDate as unknown as Date | string | null);\n const endDate = this.toDateOnly(job.endDate as unknown as Date | string | null);\n if (startDate && today < startDate) return false;\n if (endDate && today > endDate) return false;\n\n // 2. Check startTime / endTime\n const jobStart = this.toHHMM(job.startTime as unknown as Date | string | null);\n const jobEnd = this.toHHMM(job.endTime as unknown as Date | string | null);\n if (jobStart && timeNow < jobStart) return false;\n if (jobEnd && timeNow > jobEnd) return false;\n\n // 3. Check custom frequency\n if (job.frequency.toLowerCase() === 'custom') {\n // Custom cron expressions handle their own scheduling logic\n // Just check if nextRunAt is due, which was already checked in the query\n return true;\n }\n\n // 3. Check dayOfWeek (for weekly)\n if (job.frequency.toLowerCase() === 'weekly' && job.dayOfWeek) {\n const todayName = now.toLocaleString('en-US', { weekday: 'long' }); // e.g., \"Monday\"\n const days = this.parseDayOfWeek(job.dayOfWeek);\n if (!days.includes(todayName)) return false;\n }\n\n // 4. Check dayOfMonth (for monthly)\n if (job.frequency.toLowerCase() === 'monthly' && job.dayOfMonth) {\n const dom = now.getDate();\n if (dom !== job.dayOfMonth) return false;\n }\n\n return true;\n }\n\n private parseDayOfWeek(dayOfWeek: string): string[] {\n try {\n const parsed = JSON.parse(dayOfWeek);\n return Array.isArray(parsed) ? parsed : [];\n } catch (error) {\n this.logger.warn(`Invalid dayOfWeek JSON '${dayOfWeek}'`, error as any);\n return [];\n }\n }\n\n private toDateOnly(value: Date | string | null | undefined): Date | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n const d = new Date(value);\n d.setHours(0, 0, 0, 0);\n return d;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return null;\n\n parsed.setHours(0, 0, 0, 0);\n return parsed;\n }\n\n private toHHMM(value: Date | string | null | undefined): string | null {\n if (!value) return null;\n\n if (value instanceof Date) {\n return value.toTimeString().slice(0, 5);\n }\n\n if (typeof value === 'string') {\n const match = value.match(/^(\\d{2}):(\\d{2})/);\n if (match) return `${match[1]}:${match[2]}`;\n\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toTimeString().slice(0, 5);\n }\n }\n\n return null;\n }\n\n public computeNextRunForCustomCron(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n if (!job.cronExpression) {\n this.logger.error(`Custom frequency requires cronExpression for job ${job.scheduleName}`);\n // Fallback to daily if cron expression is missing\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n\n try {\n const interval = CronExpressionParser.parse(job.cronExpression, {\n currentDate: from,\n tz: 'UTC'\n });\n const nextRun = interval.next().toDate();\n const runAfterNext = interval.next().toDate();\n\n // Validate minimum 1 minute cadence between consecutive runs.\n // Comparing nextRun to \"from\" is incorrect near minute boundaries.\n if (runAfterNext.getTime() - nextRun.getTime() < 60000) {\n throw new Error('Cron expression interval must be at least 1 minute');\n }\n \n this.logger.log(`Custom cron '${job.cronExpression}' next run: ${nextRun}`);\n return nextRun;\n } catch (error) {\n this.logger.error(`Invalid cron expression for job ${job.scheduleName}: ${job.cronExpression}. Reason: ${(error as Error).message}`);\n // Fallback to daily if cron parsing fails\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n\n public computeNextRunAt(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n switch (job.frequency.toLowerCase()) {\n // case 'once':\n // return null; // don't reschedule\n case 'every minute':\n return new Date(base.getTime() + 1 * 60 * 1000);\n case 'hourly':\n return new Date(base.getTime() + 60 * 60 * 1000);\n case 'daily':\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n case 'weekly':\n return new Date(base.getTime() + 7 * 24 * 60 * 60 * 1000);\n case 'monthly':\n const next = new Date(base);\n next.setMonth(base.getMonth() + 1);\n return next;\n case 'custom':\n return this.computeNextRunForCustomCron(job, from);\n default:\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAuE,kBAAkB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAIhL,qBAEa,iDAAkD,YAAW,kBAAkB,CAAC,yBAAyB,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAIjD,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,CAAC;IASpG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC;CAO7G"}
1
+ {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAuE,kBAAkB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAKhL,qBAEa,iDAAkD,YAAW,kBAAkB,CAAC,yBAAyB,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAIjD,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,CAAC;IASpG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC;CAS7G"}
@@ -13,6 +13,7 @@ exports.ListOfDashboardQuestionProvidersSelectionProvider = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const selection_provider_decorator_1 = require("../../decorators/selection-provider.decorator");
15
15
  const solid_registry_1 = require("../../helpers/solid-registry");
16
+ const dashboard_question_service_1 = require("../dashboard-question.service");
16
17
  let ListOfDashboardQuestionProvidersSelectionProvider = class ListOfDashboardQuestionProvidersSelectionProvider {
17
18
  constructor(solidRegistry) {
18
19
  this.solidRegistry = solidRegistry;
@@ -32,7 +33,9 @@ let ListOfDashboardQuestionProvidersSelectionProvider = class ListOfDashboardQue
32
33
  }
33
34
  async values(query, ctxt) {
34
35
  const dashboardSelectionProviders = this.solidRegistry.getDashboardQuestionDataProviders();
35
- return dashboardSelectionProviders.map(i => {
36
+ return dashboardSelectionProviders
37
+ .filter(provider => !dashboard_question_service_1.INBUILT_SQL_DATA_PROVIDERS.includes(provider.name()))
38
+ .map(i => {
36
39
  return { label: i.name, value: i.name };
37
40
  });
38
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.js","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,gGAAgF;AAChF,iEAA2D;AAOpD,IAAM,iDAAiD,GAAvD,MAAM,iDAAiD;IAE1D,YACqB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAEjD,CAAC;IAED,IAAI;QACA,OAAO,mGAAmG,CAAC;IAC/G,CAAC;IAED,IAAI;QACA,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,IAA+B;QAC5D,MAAM,0BAA0B,GAAyD,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,WAAW,CAAC,CAAC;QAClK,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAA+B;QACvD,MAAM,2BAA2B,GAAG,IAAI,CAAC,aAAa,CAAC,iCAAiC,EAAE,CAAA;QAE1F,OAAO,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA/BY,8GAAiD;4DAAjD,iDAAiD;IAF7D,IAAA,gDAAiB,GAAE;IACnB,IAAA,mBAAU,GAAE;qCAI2B,8BAAa;GAHxC,iDAAiD,CA+B7D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SelectionProvider } from \"src/decorators/selection-provider.decorator\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IDashboardQuestionDataProvider, IDashboardVariableSelectionProvider, ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from \"../../interfaces\";\nimport { SQL_DYNAMIC_PROVIDER_NAME } from \"../dashboard.service\";\n\n\n@SelectionProvider()\n@Injectable()\nexport class ListOfDashboardQuestionProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {\n\n constructor(\n private readonly solidRegistry: SolidRegistry,\n ) {\n }\n\n help(): string {\n return \"# Allows one to dynamically fetch all the dashboard providers that are registered in the system. \";\n }\n\n name(): string {\n return 'ListOfDashboardQuestionProvidersSelectionProvider';\n }\n\n async value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any> {\n const dashboardSelectionProvider: IDashboardQuestionDataProvider<any, any> | undefined = this.solidRegistry.getDashboardQuestionDataProviderInstance(optionValue);\n if (!dashboardSelectionProvider) {\n return null;\n }\n\n return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };\n }\n\n async values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {\n const dashboardSelectionProviders = this.solidRegistry.getDashboardQuestionDataProviders()\n //Exclude the SQL dynamic provider from the list, (since although it is a dashboard selection provider, it is not a valid option for the user to select)\n return dashboardSelectionProviders.map(i => {\n return { label: i.name, value: i.name };\n });\n }\n}"]}
1
+ {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.js","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,gGAAgF;AAChF,iEAA2D;AAG3D,8EAAyM;AAKlM,IAAM,iDAAiD,GAAvD,MAAM,iDAAiD;IAE1D,YACqB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAEjD,CAAC;IAED,IAAI;QACA,OAAO,mGAAmG,CAAC;IAC/G,CAAC;IAED,IAAI;QACA,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,IAA+B;QAC5D,MAAM,0BAA0B,GAAyD,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,WAAW,CAAC,CAAC;QAClK,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAA+B;QACvD,MAAM,2BAA2B,GAAG,IAAI,CAAC,aAAa,CAAC,iCAAiC,EAAE,CAAA;QAE1F,OAAO,2BAA2B;aACjC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,uDAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;aACzE,GAAG,CAAC,CAAC,CAAC,EAAE;YACL,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAjCY,8GAAiD;4DAAjD,iDAAiD;IAF7D,IAAA,gDAAiB,GAAE;IACnB,IAAA,mBAAU,GAAE;qCAI2B,8BAAa;GAHxC,iDAAiD,CAiC7D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SelectionProvider } from \"src/decorators/selection-provider.decorator\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IDashboardQuestionDataProvider, IDashboardVariableSelectionProvider, ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from \"../../interfaces\";\nimport { SQL_DYNAMIC_PROVIDER_NAME } from \"../dashboard.service\";\nimport { CHARTJS_SQL_DATA_PROVIDER_NAME, INBUILT_SQL_DATA_PROVIDERS, PRIME_REACT_DATATABLE_SQL_DATA_PROVIDER_NAME, PRIME_REACT_METER_GROUP_SQL_DATA_PROVIDER_NAME } from \"../dashboard-question.service\";\n\n\n@SelectionProvider()\n@Injectable()\nexport class ListOfDashboardQuestionProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {\n\n constructor(\n private readonly solidRegistry: SolidRegistry,\n ) {\n }\n\n help(): string {\n return \"# Allows one to dynamically fetch all the dashboard providers that are registered in the system. \";\n }\n\n name(): string {\n return 'ListOfDashboardQuestionProvidersSelectionProvider';\n }\n\n async value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any> {\n const dashboardSelectionProvider: IDashboardQuestionDataProvider<any, any> | undefined = this.solidRegistry.getDashboardQuestionDataProviderInstance(optionValue);\n if (!dashboardSelectionProvider) {\n return null;\n }\n\n return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };\n }\n\n async values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {\n const dashboardSelectionProviders = this.solidRegistry.getDashboardQuestionDataProviders()\n //Exclude the SQL dynamic provider from the list, (since although it is a dashboard selection provider, it is not a valid option for the user to select)\n return dashboardSelectionProviders\n .filter(provider => !INBUILT_SQL_DATA_PROVIDERS.includes(provider.name())) \n .map(i => {\n return { label: i.name, value: i.name };\n });\n }\n}"]}
@@ -33,6 +33,15 @@ export declare class SolidTsMorphService {
33
33
  overwritten: boolean;
34
34
  skipped: boolean;
35
35
  };
36
+ removeImports(filePath: string, filter: (moduleSpecifier: string) => boolean): {
37
+ removedIdentifiers: Set<string>;
38
+ staged: boolean;
39
+ skipped: boolean;
40
+ };
41
+ removeModuleMembers(filePath: string, names: Set<string> | string[]): {
42
+ staged: boolean;
43
+ skipped: boolean;
44
+ };
36
45
  addImport(filePath: string, importLine: string): {
37
46
  staged: boolean;
38
47
  overwritten: boolean;
@@ -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":";;;;;;;;;;;;;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;IAED,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;AArWY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAqW/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 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":"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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\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;AAsVhF,qBAkca,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAKvC"}
@@ -159,6 +159,7 @@ const chatter_message_controller_1 = require("./controllers/chatter-message.cont
159
159
  const dashboard_question_sql_dataset_config_controller_1 = require("./controllers/dashboard-question-sql-dataset-config.controller");
160
160
  const dashboard_question_controller_1 = require("./controllers/dashboard-question.controller");
161
161
  const dashboard_variable_controller_1 = require("./controllers/dashboard-variable.controller");
162
+ const dashboard_layout_controller_1 = require("./controllers/dashboard-layout.controller");
162
163
  const dashboard_controller_1 = require("./controllers/dashboard.controller");
163
164
  const export_template_controller_1 = require("./controllers/export-template.controller");
164
165
  const export_transaction_controller_1 = require("./controllers/export-transaction.controller");
@@ -182,6 +183,7 @@ const chatter_message_entity_1 = require("./entities/chatter-message.entity");
182
183
  const dashboard_question_sql_dataset_config_entity_1 = require("./entities/dashboard-question-sql-dataset-config.entity");
183
184
  const dashboard_question_entity_1 = require("./entities/dashboard-question.entity");
184
185
  const dashboard_variable_entity_1 = require("./entities/dashboard-variable.entity");
186
+ const dashboard_layout_entity_1 = require("./entities/dashboard-layout.entity");
185
187
  const dashboard_entity_1 = require("./entities/dashboard.entity");
186
188
  const export_template_entity_1 = require("./entities/export-template.entity");
187
189
  const export_transaction_entity_1 = require("./entities/export-transaction.entity");
@@ -243,6 +245,7 @@ const dashboard_question_sql_dataset_config_repository_1 = require("./repository
243
245
  const dashboard_question_repository_1 = require("./repository/dashboard-question.repository");
244
246
  const dashboard_variable_repository_1 = require("./repository/dashboard-variable.repository");
245
247
  const dashboard_repository_1 = require("./repository/dashboard.repository");
248
+ const dashboard_layout_repository_1 = require("./repository/dashboard-layout.repository");
246
249
  const email_template_repository_1 = require("./repository/email-template.repository");
247
250
  const export_template_repository_1 = require("./repository/export-template.repository");
248
251
  const export_transaction_repository_1 = require("./repository/export-transaction.repository");
@@ -285,6 +288,7 @@ const dashboard_variable_sql_dynamic_provider_service_1 = require("./services/da
285
288
  const dashboard_variable_test_dynamic_provider_service_1 = require("./services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service");
286
289
  const dashboard_variable_service_1 = require("./services/dashboard-variable.service");
287
290
  const dashboard_service_1 = require("./services/dashboard.service");
291
+ const dashboard_layout_service_1 = require("./services/dashboard-layout.service");
288
292
  const excel_service_1 = require("./services/excel.service");
289
293
  const export_template_service_1 = require("./services/export-template.service");
290
294
  const export_transaction_service_1 = require("./services/export-transaction.service");
@@ -372,6 +376,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
372
376
  dashboard_question_entity_1.DashboardQuestion,
373
377
  dashboard_question_sql_dataset_config_entity_1.DashboardQuestionSqlDatasetConfig,
374
378
  dashboard_variable_entity_1.DashboardVariable,
379
+ dashboard_layout_entity_1.DashboardLayout,
375
380
  email_attachment_entity_1.EmailAttachment,
376
381
  email_template_entity_1.EmailTemplate,
377
382
  export_template_entity_1.ExportTemplate,
@@ -436,6 +441,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
436
441
  dashboard_question_controller_1.DashboardQuestionController,
437
442
  dashboard_question_sql_dataset_config_controller_1.DashboardQuestionSqlDatasetConfigController,
438
443
  dashboard_variable_controller_1.DashboardVariableController,
444
+ dashboard_layout_controller_1.DashboardLayoutController,
439
445
  email_template_controller_1.EmailTemplateController,
440
446
  export_template_controller_1.ExportTemplateController,
441
447
  export_transaction_controller_1.ExportTransactionController,
@@ -653,6 +659,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
653
659
  user_activity_history_service_1.UserActivityHistoryService,
654
660
  dashboard_service_1.DashboardService,
655
661
  dashboard_variable_service_1.DashboardVariableService,
662
+ dashboard_layout_service_1.DashboardLayoutService,
656
663
  dashboard_question_service_1.DashboardQuestionService,
657
664
  dashboard_variable_sql_dynamic_provider_service_1.DashboardVariableSQLDynamicProvider,
658
665
  dashboard_variable_test_dynamic_provider_service_1.DasbhoardVariableTestDynamicProvider,
@@ -688,6 +695,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
688
695
  dashboard_question_sql_dataset_config_repository_1.DashboardQuestionSqlDatasetConfigRepository,
689
696
  dashboard_question_repository_1.DashboardQuestionRepository,
690
697
  dashboard_variable_repository_1.DashboardVariableRepository,
698
+ dashboard_layout_repository_1.DashboardLayoutRepository,
691
699
  email_template_repository_1.EmailTemplateRepository,
692
700
  export_template_repository_1.ExportTemplateRepository,
693
701
  export_transaction_repository_1.ExportTransactionRepository,