@owox/backend 0.35.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.d.ts +1 -1
  2. package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.js +2 -2
  3. package/dist/src/common/markdown/markdown-parser.service.d.ts +2 -0
  4. package/dist/src/common/markdown/markdown-parser.service.js +15 -8
  5. package/dist/src/common/validators/max-byte-length.validator.d.ts +2 -0
  6. package/dist/src/common/validators/max-byte-length.validator.js +29 -0
  7. package/dist/src/config/env-validation.config.d.ts +12 -0
  8. package/dist/src/config/env-validation.config.js +7 -0
  9. package/dist/src/data-marts/ai-insights/agent/types.d.ts +6 -6
  10. package/dist/src/data-marts/calculated-fields/calculated-field-validator.service.js +22 -30
  11. package/dist/src/data-marts/calculated-fields/calculated-field.utils.d.ts +1 -0
  12. package/dist/src/data-marts/calculated-fields/calculated-field.utils.js +21 -0
  13. package/dist/src/data-marts/calculated-fields/formula-analyzer.d.ts +1 -0
  14. package/dist/src/data-marts/calculated-fields/formula-analyzer.js +2 -0
  15. package/dist/src/data-marts/calculated-fields/formula-violations.d.ts +7 -0
  16. package/dist/src/data-marts/calculated-fields/formula-violations.js +82 -1
  17. package/dist/src/data-marts/calculated-fields/join-grain.d.ts +32 -0
  18. package/dist/src/data-marts/calculated-fields/join-grain.js +107 -0
  19. package/dist/src/data-marts/calculated-fields/set-quantifier.d.ts +8 -0
  20. package/dist/src/data-marts/calculated-fields/set-quantifier.js +12 -0
  21. package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.d.ts +66 -0
  22. package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.js +13 -1
  23. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.d.ts +3 -0
  24. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.js +1 -0
  25. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.d.ts +3 -0
  26. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.js +1 -0
  27. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.d.ts +12 -0
  28. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.js +4 -0
  29. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.d.ts +3 -0
  30. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.js +1 -0
  31. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.d.ts +16 -0
  32. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.js +16 -0
  33. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.d.ts +3 -0
  34. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.js +1 -0
  35. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.d.ts +3 -0
  36. package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.js +1 -0
  37. package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.d.ts +10 -0
  38. package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.js +138 -0
  39. package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.d.ts +1 -3
  40. package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.js +30 -34
  41. package/dist/src/data-marts/connector-types/connector-message/services/connector-output-capture.service.js +10 -12
  42. package/dist/src/data-marts/connector-types/connector-message/services/connector-state.service.js +3 -1
  43. package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.d.ts +1 -0
  44. package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.js +1 -0
  45. package/dist/src/data-marts/controllers/connector-definition.controller.d.ts +30 -0
  46. package/dist/src/data-marts/controllers/connector-definition.controller.js +252 -0
  47. package/dist/src/data-marts/controllers/data-mart-preview.controller.d.ts +10 -0
  48. package/dist/src/data-marts/controllers/data-mart-preview.controller.js +58 -0
  49. package/dist/src/data-marts/controllers/data-mart.controller.d.ts +5 -1
  50. package/dist/src/data-marts/controllers/data-mart.controller.js +25 -4
  51. package/dist/src/data-marts/controllers/insight-template.controller.js +4 -4
  52. package/dist/src/data-marts/controllers/insight.controller.js +5 -5
  53. package/dist/src/data-marts/controllers/project-data-mart-runs.controller.js +1 -1
  54. package/dist/src/data-marts/controllers/spec/connector-definition.api.d.ts +12 -0
  55. package/dist/src/data-marts/controllers/spec/connector-definition.api.js +179 -0
  56. package/dist/src/data-marts/controllers/spec/data-mart.api.d.ts +1 -0
  57. package/dist/src/data-marts/controllers/spec/data-mart.api.js +5 -0
  58. package/dist/src/data-marts/controllers/spec/report-openapi.d.ts +18 -0
  59. package/dist/src/data-marts/controllers/spec/report-openapi.js +3 -0
  60. package/dist/src/data-marts/data-marts.module.js +20 -2
  61. package/dist/src/data-marts/data-storage-types/blending/metric-sleeve.planner.js +3 -12
  62. package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.d.ts +1 -0
  63. package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.js +16 -0
  64. package/dist/src/data-marts/dto/domain/blendable-schema.dto.d.ts +10 -0
  65. package/dist/src/data-marts/dto/domain/blendable-schema.dto.js +71 -1
  66. package/dist/src/data-marts/dto/domain/create-data-mart.command.d.ts +3 -1
  67. package/dist/src/data-marts/dto/domain/create-data-mart.command.js +3 -1
  68. package/dist/src/data-marts/dto/domain/create-report.command.d.ts +3 -1
  69. package/dist/src/data-marts/dto/domain/create-report.command.js +3 -1
  70. package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.d.ts +3 -1
  71. package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.js +3 -1
  72. package/dist/src/data-marts/dto/domain/data-mart.dto.d.ts +4 -1
  73. package/dist/src/data-marts/dto/domain/data-mart.dto.js +5 -1
  74. package/dist/src/data-marts/dto/domain/model-canvas.dto.d.ts +4 -0
  75. package/dist/src/data-marts/dto/domain/report-like-read-plan.d.ts +2 -0
  76. package/dist/src/data-marts/dto/domain/report.dto.d.ts +3 -1
  77. package/dist/src/data-marts/dto/domain/report.dto.js +3 -1
  78. package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.d.ts +9 -0
  79. package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.js +19 -0
  80. package/dist/src/data-marts/dto/domain/update-report.command.d.ts +3 -1
  81. package/dist/src/data-marts/dto/domain/update-report.command.js +3 -1
  82. package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.d.ts +2 -0
  83. package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.js +13 -0
  84. package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.d.ts +2 -0
  85. package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.js +10 -0
  86. package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.d.ts +46 -0
  87. package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.js +216 -0
  88. package/dist/src/data-marts/dto/presentation/custom-connector.dto.d.ts +27 -0
  89. package/dist/src/data-marts/dto/presentation/custom-connector.dto.js +159 -0
  90. package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.d.ts +2 -0
  91. package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.js +10 -0
  92. package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.d.ts +2 -0
  93. package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.js +10 -0
  94. package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.d.ts +4 -0
  95. package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.js +20 -0
  96. package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.d.ts +7 -0
  97. package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.js +56 -0
  98. package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.d.ts +12 -0
  99. package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.js +64 -0
  100. package/dist/src/data-marts/dto/presentation/report-response-api.dto.d.ts +2 -0
  101. package/dist/src/data-marts/dto/presentation/report-response-api.dto.js +6 -0
  102. package/dist/src/data-marts/dto/presentation/run-data-mart-request-api.dto.js +67 -0
  103. package/dist/src/data-marts/dto/presentation/update-data-mart-description-api.dto.js +3 -0
  104. package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.d.ts +4 -0
  105. package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.js +30 -0
  106. package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.d.ts +2 -0
  107. package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.js +10 -0
  108. package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.d.ts +15 -0
  109. package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.js +29 -0
  110. package/dist/src/data-marts/dto/schemas/data-mart-run/data-mart-run.schema.d.ts +9 -0
  111. package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.d.ts +15 -0
  112. package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.js +1 -0
  113. package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/data-mart-definition.schema.d.ts +7 -0
  114. package/dist/src/data-marts/dto/schemas/data-quality/data-quality-run.schema.d.ts +20 -0
  115. package/dist/src/data-marts/entities/connector-definition-version.entity.d.ts +16 -0
  116. package/dist/src/data-marts/entities/connector-definition-version.entity.js +78 -0
  117. package/dist/src/data-marts/entities/connector-definition.entity.d.ts +14 -0
  118. package/dist/src/data-marts/entities/connector-definition.entity.js +82 -0
  119. package/dist/src/data-marts/entities/data-mart.entity.d.ts +2 -0
  120. package/dist/src/data-marts/entities/data-mart.entity.js +5 -0
  121. package/dist/src/data-marts/entities/report.entity.d.ts +2 -0
  122. package/dist/src/data-marts/entities/report.entity.js +11 -0
  123. package/dist/src/data-marts/enums/data-mart-icon.enum.d.ts +75 -0
  124. package/dist/src/data-marts/enums/data-mart-icon.enum.js +80 -0
  125. package/dist/src/data-marts/errors/connector-credential-boundary.error.d.ts +3 -0
  126. package/dist/src/data-marts/errors/connector-credential-boundary.error.js +14 -0
  127. package/dist/src/data-marts/facades/mcp-data-marts.facade.d.ts +2 -0
  128. package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.d.ts +7 -1
  129. package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.js +70 -5
  130. package/dist/src/data-marts/mappers/connector-definition.mapper.d.ts +14 -0
  131. package/dist/src/data-marts/mappers/connector-definition.mapper.js +57 -0
  132. package/dist/src/data-marts/mappers/data-mart.mapper.d.ts +9 -6
  133. package/dist/src/data-marts/mappers/data-mart.mapper.js +44 -19
  134. package/dist/src/data-marts/mappers/insight-template.mapper.d.ts +1 -1
  135. package/dist/src/data-marts/mappers/insight-template.mapper.js +2 -2
  136. package/dist/src/data-marts/mappers/insight.mapper.d.ts +1 -1
  137. package/dist/src/data-marts/mappers/insight.mapper.js +2 -2
  138. package/dist/src/data-marts/mappers/model-canvas.mapper.d.ts +10 -2
  139. package/dist/src/data-marts/mappers/model-canvas.mapper.js +9 -3
  140. package/dist/src/data-marts/mappers/report.mapper.js +4 -3
  141. package/dist/src/data-marts/services/auto-collapse.resolver.d.ts +1 -1
  142. package/dist/src/data-marts/services/auto-collapse.resolver.js +4 -0
  143. package/dist/src/data-marts/services/blendable-schema.service.d.ts +2 -0
  144. package/dist/src/data-marts/services/blendable-schema.service.js +59 -0
  145. package/dist/src/data-marts/services/connector/connector-credential-injector.service.d.ts +1 -1
  146. package/dist/src/data-marts/services/connector/connector-credential-injector.service.js +15 -1
  147. package/dist/src/data-marts/services/connector/connector-definition.service.d.ts +59 -0
  148. package/dist/src/data-marts/services/connector/connector-definition.service.js +491 -0
  149. package/dist/src/data-marts/services/connector/connector-executor.service.d.ts +9 -1
  150. package/dist/src/data-marts/services/connector/connector-executor.service.js +173 -63
  151. package/dist/src/data-marts/services/connector/connector-fields-preview.service.js +1 -1
  152. package/dist/src/data-marts/services/connector/connector-message.utils.js +2 -2
  153. package/dist/src/data-marts/services/connector/connector-preview-credentials.service.js +1 -1
  154. package/dist/src/data-marts/services/connector/connector-preview-support.d.ts +1 -1
  155. package/dist/src/data-marts/services/connector/connector-preview-support.js +14 -21
  156. package/dist/src/data-marts/services/connector/connector-process-spawner.service.d.ts +11 -2
  157. package/dist/src/data-marts/services/connector/connector-process-spawner.service.js +88 -60
  158. package/dist/src/data-marts/services/connector/connector-secret.service.d.ts +6 -3
  159. package/dist/src/data-marts/services/connector/connector-secret.service.js +77 -12
  160. package/dist/src/data-marts/services/connector/connector-source-config.service.js +1 -1
  161. package/dist/src/data-marts/services/connector/connector-source-credentials.service.d.ts +6 -2
  162. package/dist/src/data-marts/services/connector/connector-source-credentials.service.js +18 -16
  163. package/dist/src/data-marts/services/connector/connector-specification.mapper.d.ts +47 -0
  164. package/dist/src/data-marts/services/connector/connector-specification.mapper.js +46 -0
  165. package/dist/src/data-marts/services/connector/connector-test.service.d.ts +43 -0
  166. package/dist/src/data-marts/services/connector/connector-test.service.js +343 -0
  167. package/dist/src/data-marts/services/connector/connector.service.d.ts +8 -2
  168. package/dist/src/data-marts/services/connector/connector.service.js +65 -54
  169. package/dist/src/data-marts/services/connector/declarative-manifest-schemas.d.ts +4 -0
  170. package/dist/src/data-marts/services/connector/declarative-manifest-schemas.js +48 -0
  171. package/dist/src/data-marts/services/connector/run-log-flusher.d.ts +21 -0
  172. package/dist/src/data-marts/services/connector/run-log-flusher.js +67 -0
  173. package/dist/src/data-marts/services/data-mart.service.js +2 -0
  174. package/dist/src/data-marts/services/report-sql-composer.service.js +15 -1
  175. package/dist/src/data-marts/services/report.service.d.ts +1 -0
  176. package/dist/src/data-marts/services/report.service.js +13 -0
  177. package/dist/src/data-marts/services/scheduled-trigger.service.d.ts +1 -0
  178. package/dist/src/data-marts/services/scheduled-trigger.service.js +13 -0
  179. package/dist/src/data-marts/use-cases/create-data-mart.service.js +1 -0
  180. package/dist/src/data-marts/use-cases/create-report.service.js +2 -0
  181. package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.d.ts +5 -1
  182. package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.js +16 -3
  183. package/dist/src/data-marts/use-cases/list-project-scheduled-triggers.service.js +1 -1
  184. package/dist/src/data-marts/use-cases/preview-data-mart.service.d.ts +59 -0
  185. package/dist/src/data-marts/use-cases/preview-data-mart.service.js +293 -0
  186. package/dist/src/data-marts/use-cases/stream-http-data.service.js +1 -0
  187. package/dist/src/data-marts/use-cases/update-data-mart-definition.service.d.ts +1 -1
  188. package/dist/src/data-marts/use-cases/update-data-mart-definition.service.js +8 -6
  189. package/dist/src/data-marts/use-cases/update-data-mart-icon.service.d.ts +12 -0
  190. package/dist/src/data-marts/use-cases/update-data-mart-icon.service.js +46 -0
  191. package/dist/src/data-marts/use-cases/update-data-mart-schema.service.js +14 -1
  192. package/dist/src/data-marts/use-cases/update-report.service.js +9 -1
  193. package/dist/src/ee/ee.module.js +5 -8
  194. package/dist/src/ee/mcp/auth/mcp-auth-context.d.ts +0 -4
  195. package/dist/src/ee/mcp/auth/mcp-auth.middleware.d.ts +26 -0
  196. package/dist/src/ee/mcp/auth/mcp-auth.middleware.js +184 -0
  197. package/dist/src/ee/mcp/http-headers.util.d.ts +2 -0
  198. package/dist/src/ee/mcp/http-headers.util.js +8 -0
  199. package/dist/src/ee/mcp/observability/mcp-bus-wiring.js +4 -4
  200. package/dist/src/ee/mcp/observability/mcp-call-instrumentation.d.ts +2 -4
  201. package/dist/src/ee/mcp/observability/mcp-call-instrumentation.js +6 -6
  202. package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.d.ts +1 -1
  203. package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.js +5 -5
  204. package/dist/src/ee/mcp/tools/add-destination.tool.d.ts +20 -14
  205. package/dist/src/ee/mcp/tools/add-destination.tool.js +10 -10
  206. package/dist/src/ee/mcp/tools/add-report.tool.d.ts +88 -228
  207. package/dist/src/ee/mcp/tools/add-report.tool.js +28 -28
  208. package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.d.ts +2 -12
  209. package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.js +13 -13
  210. package/dist/src/ee/mcp/tools/data-mart-catalog.tool.d.ts +15 -81
  211. package/dist/src/ee/mcp/tools/data-mart-catalog.tool.js +11 -11
  212. package/dist/src/ee/mcp/tools/data-mart-details.tool.d.ts +19 -111
  213. package/dist/src/ee/mcp/tools/data-mart-details.tool.js +64 -48
  214. package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.d.ts +2 -6
  215. package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.js +7 -7
  216. package/dist/src/ee/mcp/tools/delete-report.tool.d.ts +2 -6
  217. package/dist/src/ee/mcp/tools/delete-report.tool.js +4 -4
  218. package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.d.ts +30 -195
  219. package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.js +22 -22
  220. package/dist/src/ee/mcp/tools/get-report-output-schema.tool.d.ts +3 -21
  221. package/dist/src/ee/mcp/tools/get-report-output-schema.tool.js +10 -10
  222. package/dist/src/ee/mcp/tools/get-report-run-status.tool.d.ts +15 -11
  223. package/dist/src/ee/mcp/tools/get-report-run-status.tool.js +14 -14
  224. package/dist/src/ee/mcp/tools/list-destinations.tool.d.ts +12 -20
  225. package/dist/src/ee/mcp/tools/list-destinations.tool.js +10 -10
  226. package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.d.ts +5 -61
  227. package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.js +14 -14
  228. package/dist/src/ee/mcp/tools/mcp-getting-started.util.d.ts +4 -52
  229. package/dist/src/ee/mcp/tools/mcp-getting-started.util.js +13 -13
  230. package/dist/src/ee/mcp/tools/mcp-tool.definition.d.ts +2 -2
  231. package/dist/src/ee/mcp/tools/project-context.tool.d.ts +3 -17
  232. package/dist/src/ee/mcp/tools/project-context.tool.js +10 -10
  233. package/dist/src/ee/mcp/tools/query-data-mart.input.d.ts +111 -152
  234. package/dist/src/ee/mcp/tools/query-data-mart.input.js +39 -39
  235. package/dist/src/ee/mcp/tools/query-data-mart.tool.d.ts +60 -130
  236. package/dist/src/ee/mcp/tools/query-data-mart.tool.js +35 -35
  237. package/dist/src/ee/mcp/tools/report-output-controls-output.d.ts +17 -60
  238. package/dist/src/ee/mcp/tools/report-output-controls-output.js +20 -20
  239. package/dist/src/ee/mcp/tools/report-run-outcome.d.ts +6 -42
  240. package/dist/src/ee/mcp/tools/report-run-outcome.js +20 -20
  241. package/dist/src/ee/mcp/tools/run-report.tool.d.ts +2 -6
  242. package/dist/src/ee/mcp/tools/run-report.tool.js +5 -5
  243. package/dist/src/ee/mcp/tools/search-data-marts.tool.d.ts +7 -79
  244. package/dist/src/ee/mcp/tools/search-data-marts.tool.js +11 -11
  245. package/dist/src/ee/mcp/tools/search-reports.tool.d.ts +15 -61
  246. package/dist/src/ee/mcp/tools/search-reports.tool.js +15 -15
  247. package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.d.ts +7 -79
  248. package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.js +15 -15
  249. package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.d.ts +2 -12
  250. package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.js +13 -13
  251. package/dist/src/ee/mcp/tools/update-report.tool.d.ts +105 -414
  252. package/dist/src/ee/mcp/tools/update-report.tool.js +20 -20
  253. package/dist/src/ee/mcp/transport/mcp-http-entry.service.d.ts +30 -0
  254. package/dist/src/ee/mcp/transport/mcp-http-entry.service.js +193 -0
  255. package/dist/src/idp/guards/idp.guard.js +2 -8
  256. package/dist/src/idp/oauth/controllers/oauth-authorization.controller.d.ts +4 -0
  257. package/dist/src/idp/oauth/controllers/oauth-authorization.controller.js +77 -1
  258. package/dist/src/idp/oauth/controllers/oauth-metadata.controller.d.ts +2 -1
  259. package/dist/src/idp/oauth/controllers/oauth-metadata.controller.js +5 -8
  260. package/dist/src/idp/oauth/controllers/oauth-token.controller.js +14 -1
  261. package/dist/src/idp/oauth/oauth-request.validator.d.ts +8 -0
  262. package/dist/src/idp/oauth/oauth-request.validator.js +27 -0
  263. package/dist/src/idp/utils/is-authentication-error.d.ts +1 -0
  264. package/dist/src/idp/utils/is-authentication-error.js +9 -0
  265. package/dist/src/idp/utils/role-hierarchy.d.ts +3 -0
  266. package/dist/src/idp/utils/role-hierarchy.js +14 -0
  267. package/dist/src/index.d.ts +1 -0
  268. package/dist/src/index.js +3 -1
  269. package/dist/src/migrations/1788048000000-create-connector-definition-tables.d.ts +6 -0
  270. package/dist/src/migrations/1788048000000-create-connector-definition-tables.js +116 -0
  271. package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.d.ts +8 -0
  272. package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.js +30 -0
  273. package/dist/src/migrations/1790247861000-add-icon-to-data-mart.d.ts +8 -0
  274. package/dist/src/migrations/1790247861000-add-icon-to-data-mart.js +31 -0
  275. package/package.json +10 -6
  276. package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.d.ts +0 -14
  277. package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.js +0 -84
  278. package/dist/src/ee/mcp/auth/mcp-auth.guard.d.ts +0 -14
  279. package/dist/src/ee/mcp/auth/mcp-auth.guard.js +0 -99
  280. package/dist/src/ee/mcp/controllers/mcp-transport.controller.d.ts +0 -17
  281. package/dist/src/ee/mcp/controllers/mcp-transport.controller.js +0 -134
  282. package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.d.ts +0 -16
  283. package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.js +0 -133
@@ -1,4 +1,4 @@
1
1
  import { BusinessViolationException } from './business-violation.exception';
2
2
  export declare class ConcurrencyLimitExceededException extends BusinessViolationException {
3
- constructor(message: string, errorDetails?: Record<string, unknown>);
3
+ constructor(message: string, errorDetails?: Record<string, unknown>, code?: string);
4
4
  }
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConcurrencyLimitExceededException = void 0;
4
4
  const business_violation_exception_1 = require("./business-violation.exception");
5
5
  class ConcurrencyLimitExceededException extends business_violation_exception_1.BusinessViolationException {
6
- constructor(message, errorDetails) {
7
- super(message, errorDetails);
6
+ constructor(message, errorDetails, code) {
7
+ super(message, errorDetails, code);
8
8
  }
9
9
  }
10
10
  exports.ConcurrencyLimitExceededException = ConcurrencyLimitExceededException;
@@ -5,5 +5,7 @@ export declare enum COLOR_THEME {
5
5
  }
6
6
  export declare class MarkdownParser {
7
7
  parseToHtml(markdown: string, theme?: COLOR_THEME): Promise<string>;
8
+ parseToFragment(markdown: string): Promise<string>;
9
+ private runPipeline;
8
10
  private getColorThemeCss;
9
11
  }
@@ -84,6 +84,20 @@ var COLOR_THEME;
84
84
  })(COLOR_THEME || (exports.COLOR_THEME = COLOR_THEME = {}));
85
85
  let MarkdownParser = class MarkdownParser {
86
86
  async parseToHtml(markdown, theme = COLOR_THEME.DYNAMIC) {
87
+ const html = await this.runPipeline(markdown);
88
+ const content = `<div class="markdown-body">${html}</div>`;
89
+ return juice_1.default.inlineContent(content, this.getColorThemeCss(theme), {
90
+ preserveMediaQueries: true,
91
+ applyAttributesTableElements: true,
92
+ applyWidthAttributes: true,
93
+ applyHeightAttributes: true,
94
+ resolveCSSVariables: true,
95
+ });
96
+ }
97
+ async parseToFragment(markdown) {
98
+ return this.runPipeline(markdown);
99
+ }
100
+ async runPipeline(markdown) {
87
101
  const html = await (0, remark_1.remark)()
88
102
  .use(remark_parse_1.default)
89
103
  .use(remark_gfm_1.default)
@@ -93,14 +107,7 @@ let MarkdownParser = class MarkdownParser {
93
107
  .use(rehype_normalize_table_truncation_notice_plugin_1.rehypeNormalizeTableTruncationNoticeRows)
94
108
  .use(rehype_stringify_1.default)
95
109
  .process(markdown);
96
- const content = `<div class="markdown-body">${String(html)}</div>`;
97
- return juice_1.default.inlineContent(content, this.getColorThemeCss(theme), {
98
- preserveMediaQueries: true,
99
- applyAttributesTableElements: true,
100
- applyWidthAttributes: true,
101
- applyHeightAttributes: true,
102
- resolveCSSVariables: true,
103
- });
110
+ return String(html);
104
111
  }
105
112
  getColorThemeCss(theme) {
106
113
  let cssVariables;
@@ -0,0 +1,2 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ export declare function MaxByteLength(maxSizeBytes: number, validationOptions?: ValidationOptions): (object: object, propertyName: string) => void;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaxByteLength = MaxByteLength;
4
+ const class_validator_1 = require("class-validator");
5
+ function MaxByteLength(maxSizeBytes, validationOptions) {
6
+ return function (object, propertyName) {
7
+ (0, class_validator_1.registerDecorator)({
8
+ name: 'maxByteLength',
9
+ target: object.constructor,
10
+ propertyName: propertyName,
11
+ options: validationOptions,
12
+ constraints: [maxSizeBytes],
13
+ validator: {
14
+ validate(value, args) {
15
+ if (typeof value !== 'string') {
16
+ return true;
17
+ }
18
+ const [maxSize] = args.constraints;
19
+ return Buffer.byteLength(value, 'utf8') <= maxSize;
20
+ },
21
+ defaultMessage(args) {
22
+ const [maxSize] = args.constraints;
23
+ return `${args.property} must be shorter than or equal to ${maxSize} bytes`;
24
+ },
25
+ },
26
+ });
27
+ };
28
+ }
29
+ //# sourceMappingURL=max-byte-length.validator.js.map
@@ -7,6 +7,10 @@ declare const configSchema: z.ZodObject<{
7
7
  HEADERS_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
8
8
  MAX_CONNECTOR_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
9
9
  MAX_REPORT_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
10
+ CONNECTOR_SHORT_LINK_DOMAINS: z.ZodOptional<z.ZodString>;
11
+ MAX_CONNECTOR_TESTS_PER_PROJECT: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
12
+ MAX_CONNECTOR_TESTS_TOTAL: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
13
+ CONNECTOR_RUN_LOG_FLUSH_INTERVAL_MS: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
10
14
  PLUGIN_HOST_SYNC_MIN_INTERVAL_SEC: z.ZodOptional<z.ZodNumber>;
11
15
  PLUGIN_HOST_REMOTE_PROBE_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
12
16
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
@@ -17,6 +21,10 @@ declare const configSchema: z.ZodObject<{
17
21
  HEADERS_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
18
22
  MAX_CONNECTOR_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
19
23
  MAX_REPORT_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
24
+ CONNECTOR_SHORT_LINK_DOMAINS: z.ZodOptional<z.ZodString>;
25
+ MAX_CONNECTOR_TESTS_PER_PROJECT: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
26
+ MAX_CONNECTOR_TESTS_TOTAL: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
27
+ CONNECTOR_RUN_LOG_FLUSH_INTERVAL_MS: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
20
28
  PLUGIN_HOST_SYNC_MIN_INTERVAL_SEC: z.ZodOptional<z.ZodNumber>;
21
29
  PLUGIN_HOST_REMOTE_PROBE_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
22
30
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
@@ -27,6 +35,10 @@ declare const configSchema: z.ZodObject<{
27
35
  HEADERS_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
28
36
  MAX_CONNECTOR_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
29
37
  MAX_REPORT_RUNS_PER_PROJECT: z.ZodDefault<z.ZodNumber>;
38
+ CONNECTOR_SHORT_LINK_DOMAINS: z.ZodOptional<z.ZodString>;
39
+ MAX_CONNECTOR_TESTS_PER_PROJECT: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
40
+ MAX_CONNECTOR_TESTS_TOTAL: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
41
+ CONNECTOR_RUN_LOG_FLUSH_INTERVAL_MS: z.ZodEffects<z.ZodDefault<z.ZodNumber>, number, unknown>;
30
42
  PLUGIN_HOST_SYNC_MIN_INTERVAL_SEC: z.ZodOptional<z.ZodNumber>;
31
43
  PLUGIN_HOST_REMOTE_PROBE_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
32
44
  }, z.ZodTypeAny, "passthrough">>;
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateConfig = validateConfig;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("./constants");
6
+ function blankAsUnset(schema) {
7
+ return zod_1.z.preprocess(value => (typeof value === 'string' && value.trim() === '' ? undefined : value), schema);
8
+ }
6
9
  const configSchema = zod_1.z
7
10
  .object({
8
11
  SCHEDULER_EXECUTION_ENABLED: zod_1.z
@@ -17,6 +20,10 @@ const configSchema = zod_1.z
17
20
  HEADERS_TIMEOUT_MS: zod_1.z.coerce.number().default(constants_1.DEFAULT_HEADERS_TIMEOUT_MS),
18
21
  MAX_CONNECTOR_RUNS_PER_PROJECT: zod_1.z.coerce.number().int().min(1).max(1000).default(3),
19
22
  MAX_REPORT_RUNS_PER_PROJECT: zod_1.z.coerce.number().int().min(1).max(1000).default(1000),
23
+ CONNECTOR_SHORT_LINK_DOMAINS: zod_1.z.string().trim().optional(),
24
+ MAX_CONNECTOR_TESTS_PER_PROJECT: blankAsUnset(zod_1.z.coerce.number().int().min(1).max(1000).default(3)),
25
+ MAX_CONNECTOR_TESTS_TOTAL: blankAsUnset(zod_1.z.coerce.number().int().min(1).max(1000).default(10)),
26
+ CONNECTOR_RUN_LOG_FLUSH_INTERVAL_MS: blankAsUnset(zod_1.z.coerce.number().int().min(0).max(3_600_000).default(2_000)),
20
27
  PLUGIN_HOST_SYNC_MIN_INTERVAL_SEC: zod_1.z.coerce.number().int().min(0).max(86_400).optional(),
21
28
  PLUGIN_HOST_REMOTE_PROBE_TIMEOUT_MS: zod_1.z.coerce
22
29
  .number()
@@ -453,6 +453,7 @@ export declare const QueryPlanSchema: z.ZodObject<{
453
453
  }>>>;
454
454
  }, "strip", z.ZodTypeAny, {
455
455
  dimensions: string[];
456
+ metrics: string[];
456
457
  tables: {
457
458
  fullyQualifiedName: string;
458
459
  role?: string | null | undefined;
@@ -463,7 +464,6 @@ export declare const QueryPlanSchema: z.ZodObject<{
463
464
  alias: string;
464
465
  sourceColumn: string;
465
466
  }[];
466
- metrics: string[];
467
467
  metricSpecs: {
468
468
  name: string;
469
469
  required: boolean;
@@ -529,6 +529,7 @@ export declare const QueryPlanSchema: z.ZodObject<{
529
529
  required?: boolean | undefined;
530
530
  }[];
531
531
  dimensions?: string[] | undefined;
532
+ metrics?: string[] | undefined;
532
533
  tables?: {
533
534
  fullyQualifiedName: string;
534
535
  role?: string | null | undefined;
@@ -540,7 +541,6 @@ export declare const QueryPlanSchema: z.ZodObject<{
540
541
  sourceColumn: string;
541
542
  required?: boolean | undefined;
542
543
  }[] | undefined;
543
- metrics?: string[] | undefined;
544
544
  dateField?: string | null | undefined;
545
545
  dateFilterDescription?: string | null | undefined;
546
546
  whereConditions?: string[] | undefined;
@@ -739,6 +739,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
739
739
  }>>>;
740
740
  }, "strip", z.ZodTypeAny, {
741
741
  dimensions: string[];
742
+ metrics: string[];
742
743
  tables: {
743
744
  fullyQualifiedName: string;
744
745
  role?: string | null | undefined;
@@ -749,7 +750,6 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
749
750
  alias: string;
750
751
  sourceColumn: string;
751
752
  }[];
752
- metrics: string[];
753
753
  metricSpecs: {
754
754
  name: string;
755
755
  required: boolean;
@@ -815,6 +815,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
815
815
  required?: boolean | undefined;
816
816
  }[];
817
817
  dimensions?: string[] | undefined;
818
+ metrics?: string[] | undefined;
818
819
  tables?: {
819
820
  fullyQualifiedName: string;
820
821
  role?: string | null | undefined;
@@ -826,7 +827,6 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
826
827
  sourceColumn: string;
827
828
  required?: boolean | undefined;
828
829
  }[] | undefined;
829
- metrics?: string[] | undefined;
830
830
  dateField?: string | null | undefined;
831
831
  dateFilterDescription?: string | null | undefined;
832
832
  whereConditions?: string[] | undefined;
@@ -855,6 +855,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
855
855
  }, "strip", z.ZodTypeAny, {
856
856
  plan: {
857
857
  dimensions: string[];
858
+ metrics: string[];
858
859
  tables: {
859
860
  fullyQualifiedName: string;
860
861
  role?: string | null | undefined;
@@ -865,7 +866,6 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
865
866
  alias: string;
866
867
  sourceColumn: string;
867
868
  }[];
868
- metrics: string[];
869
869
  metricSpecs: {
870
870
  name: string;
871
871
  required: boolean;
@@ -935,6 +935,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
935
935
  required?: boolean | undefined;
936
936
  }[];
937
937
  dimensions?: string[] | undefined;
938
+ metrics?: string[] | undefined;
938
939
  tables?: {
939
940
  fullyQualifiedName: string;
940
941
  role?: string | null | undefined;
@@ -946,7 +947,6 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
946
947
  sourceColumn: string;
947
948
  required?: boolean | undefined;
948
949
  }[] | undefined;
949
- metrics?: string[] | undefined;
950
950
  dateField?: string | null | undefined;
951
951
  dateFilterDescription?: string | null | undefined;
952
952
  whereConditions?: string[] | undefined;
@@ -23,6 +23,7 @@ const formula_analyzer_1 = require("./formula-analyzer");
23
23
  const formula_level_1 = require("./formula-level");
24
24
  const formula_function_dialect_1 = require("./formula-function-dialect");
25
25
  const formula_violations_1 = require("./formula-violations");
26
+ const join_grain_1 = require("./join-grain");
26
27
  const unique_count_sources_1 = require("../dto/schemas/unique-count-sources");
27
28
  const sql_token_scanner_1 = require("./sql-token-scanner");
28
29
  const formula_reference_1 = require("./formula-reference");
@@ -63,26 +64,6 @@ function dryRunBatches(fields) {
63
64
  return [fields];
64
65
  return [aggregate, rowLevel];
65
66
  }
66
- function formulaDependencyGraph(fields, byName) {
67
- const dependenciesOf = (field) => {
68
- let references;
69
- try {
70
- references = (0, formula_live_reference_1.liveFormulaReferences)(field.calculated.formula);
71
- }
72
- catch {
73
- return [];
74
- }
75
- const named = references
76
- .filter(ref => !ref.path)
77
- .map(ref => ref.field)
78
- .filter(name => {
79
- const found = byName.get(name);
80
- return found !== undefined && (0, calculated_field_utils_1.isCalculatedField)(found);
81
- });
82
- return [...new Set(named)];
83
- };
84
- return new Map(fields.map(field => [field.name, dependenciesOf(field)]));
85
- }
86
67
  function formulaCycleViolations(cycles) {
87
68
  return cycles.flatMap(chain => {
88
69
  const members = [...new Set(chain)];
@@ -114,9 +95,13 @@ let CalculatedFieldValidatorService = class CalculatedFieldValidatorService {
114
95
  const byName = new Map((0, data_mart_schema_utils_1.collectFormulaReferenceableFields)(schema.fields)
115
96
  .filter(d => !(0, calculated_field_utils_1.isCalculatedField)(d.field) || topLevelCalculated.has(d.field))
116
97
  .map(d => [d.name, d.field]));
117
- const joinTreeRead = await this.resolveJoinedReferences(calculated, joinTree);
98
+ const joinTreeRead = await this.resolveJoinedReferences(calculated, joinTree, schema.fields);
118
99
  const joinedIndex = joinTreeRead?.index;
119
- const walk = (0, formula_reference_1.walkFormulaDependencies)(formulaDependencyGraph(calculated, byName));
100
+ const grainSources = (0, join_grain_1.buildJoinGrainSources)(joinTreeRead?.schema.availableSources ?? [], {
101
+ kind: 'editor',
102
+ });
103
+ const dependencies = (0, calculated_field_utils_1.formulaDependencyGraph)(calculated, byName);
104
+ const walk = (0, formula_reference_1.walkFormulaDependencies)(dependencies);
120
105
  const errors = formulaCycleViolations(walk.cycles);
121
106
  const warnings = [];
122
107
  const analysed = [];
@@ -151,13 +136,20 @@ let CalculatedFieldValidatorService = class CalculatedFieldValidatorService {
151
136
  dialect,
152
137
  knownField,
153
138
  });
139
+ const fieldErrors = [
140
+ ...joinedViolations.values(),
141
+ ...[...mainUniqueCountRefs].map(ref => formula_violations_1.FormulaViolations.mainUniqueCountReference(field.name, ref)),
142
+ ...analysis.errors,
143
+ ];
144
+ const grain = (0, join_grain_1.checkJoinGrain)({
145
+ fieldName: field.name,
146
+ aggregateCalls: analysis.aggregateCalls,
147
+ sources: grainSources,
148
+ });
149
+ const fieldWarnings = [...analysis.warnings, ...grain.warnings];
154
150
  analyses.set(field, {
155
- errors: [
156
- ...joinedViolations.values(),
157
- ...[...mainUniqueCountRefs].map(ref => formula_violations_1.FormulaViolations.mainUniqueCountReference(field.name, ref)),
158
- ...analysis.errors,
159
- ],
160
- warnings: analysis.warnings,
151
+ errors: fieldErrors,
152
+ warnings: fieldWarnings,
161
153
  level: analysis.level,
162
154
  });
163
155
  derivedLevels.set(field.name, analysis.level);
@@ -206,12 +198,12 @@ let CalculatedFieldValidatorService = class CalculatedFieldValidatorService {
206
198
  }
207
199
  return { errors, warnings };
208
200
  }
209
- async resolveJoinedReferences(fields, joinTree) {
201
+ async resolveJoinedReferences(fields, joinTree, schemaFields) {
210
202
  if (!joinTree?.accessor.userId)
211
203
  return undefined;
212
204
  if (!fields.some(f => (0, formula_live_reference_1.hasLiveJoinedReference)(f.calculated.formula)))
213
205
  return undefined;
214
- const blendable = await this.blendableSchemaService.computeBlendableSchema(joinTree.dataMartId, joinTree.projectId, joinTree.accessor);
206
+ const blendable = await this.blendableSchemaService.computeBlendableSchema(joinTree.dataMartId, joinTree.projectId, joinTree.accessor, { unsavedMainSchemaFields: schemaFields });
215
207
  return { schema: blendable, index: (0, calculated_field_utils_1.buildJoinedReferenceIndex)(blendable) };
216
208
  }
217
209
  resolveJoinedReference(metricName, path, refField, index, violations) {
@@ -49,3 +49,4 @@ export declare function joinedCalculatedFieldRefusals(blendedFields: readonly {
49
49
  isCalculated?: boolean;
50
50
  sourceDataMartTitle?: string;
51
51
  }[], referencedColumns: Iterable<string>, ownColumnNames: ReadonlySet<string>): JoinedCalculatedFieldRefusal[];
52
+ export declare function formulaDependencyGraph(fields: readonly CalculatedSchemaField[], byName: ReadonlyMap<string, DataMartSchemaField>): ReadonlyMap<string, readonly string[]>;
@@ -17,6 +17,7 @@ exports.brokenReferencesOf = brokenReferencesOf;
17
17
  exports.buildJoinedReferenceIndex = buildJoinedReferenceIndex;
18
18
  exports.brokenJoinedReferencesOf = brokenJoinedReferencesOf;
19
19
  exports.joinedCalculatedFieldRefusals = joinedCalculatedFieldRefusals;
20
+ exports.formulaDependencyGraph = formulaDependencyGraph;
20
21
  const formula_live_reference_1 = require("./formula-live-reference");
21
22
  const formula_level_1 = require("./formula-level");
22
23
  const formula_function_dialect_1 = require("./formula-function-dialect");
@@ -275,4 +276,24 @@ function joinedCalculatedFieldRefusals(blendedFields, referencedColumns, ownColu
275
276
  }
276
277
  return refusals;
277
278
  }
279
+ function formulaDependencyGraph(fields, byName) {
280
+ const dependenciesOf = (field) => {
281
+ let references;
282
+ try {
283
+ references = (0, formula_live_reference_1.liveFormulaReferences)(field.calculated.formula);
284
+ }
285
+ catch {
286
+ return [];
287
+ }
288
+ const named = references
289
+ .filter(ref => !ref.path)
290
+ .map(ref => ref.field)
291
+ .filter(name => {
292
+ const found = byName.get(name);
293
+ return found !== undefined && isCalculatedField(found);
294
+ });
295
+ return [...new Set(named)];
296
+ };
297
+ return new Map(fields.map(field => [field.name, dependenciesOf(field)]));
298
+ }
278
299
  //# sourceMappingURL=calculated-field.utils.js.map
@@ -5,6 +5,7 @@ import { CalculatedFieldLevel } from './formula-level';
5
5
  export interface AggregateCall {
6
6
  name: string;
7
7
  owner: string;
8
+ distinct: boolean;
8
9
  references: FormulaReference[];
9
10
  nameStart: number;
10
11
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.analyzeFormula = analyzeFormula;
4
4
  const formula_reference_1 = require("./formula-reference");
5
+ const set_quantifier_1 = require("./set-quantifier");
5
6
  const sql_token_scanner_1 = require("./sql-token-scanner");
6
7
  const sql_function_calls_1 = require("./sql-function-calls");
7
8
  const formula_violations_1 = require("./formula-violations");
@@ -90,6 +91,7 @@ function analyzeFormula(input) {
90
91
  aggregateCalls.push({
91
92
  name: call.name,
92
93
  owner: inside[0].path,
94
+ distinct: (0, set_quantifier_1.readSetQuantifier)(tokens, call).distinct,
93
95
  references: inside,
94
96
  nameStart: call.nameStart,
95
97
  });
@@ -4,6 +4,9 @@ export interface FormulaViolation {
4
4
  field: string;
5
5
  subject?: string;
6
6
  }
7
+ export declare const UNNAMED_JOINED_SOURCE = "a joined Data Mart";
8
+ export type MultipliedRowsOf = 'this Data Mart' | 'its parent';
9
+ export type UniqueCountOffer = 'none' | 'report' | 'query';
7
10
  export declare const FormulaViolations: {
8
11
  levelMixing: (field: string, column: string) => FormulaViolation;
9
12
  joinedReferenceOutsideAggregate: (field: string, ref: string) => FormulaViolation;
@@ -35,6 +38,10 @@ export declare const FormulaViolations: {
35
38
  tagInStringLiteral: (field: string) => FormulaViolation;
36
39
  syntax: (field: string, detail: string) => FormulaViolation;
37
40
  unguardedDivision: (field: string, denominator?: string) => FormulaViolation;
41
+ joinedMeasureMultiplied: (field: string, ref: string | undefined, source: string, key: readonly string[] | undefined, multipliedBy?: string, rowsOf?: MultipliedRowsOf, uniqueCount?: UniqueCountOffer) => FormulaViolation;
42
+ joinedMeasureGrainUnproven: (field: string, ref: string | undefined, source: string, unprovenMart: string | undefined, collapses?: boolean, uniqueCount?: UniqueCountOffer) => FormulaViolation;
43
+ joinedMeasureCollapsed: (field: string, ref: string | undefined, source: string, collapsedBy?: string, uniqueCount?: UniqueCountOffer) => FormulaViolation;
44
+ joinedRowsExcluded: (field: string, sources: readonly string[]) => FormulaViolation;
38
45
  warehouseRejected: (field: string, detail?: string) => FormulaViolation;
39
46
  warehouseRejectedAsSet: (field: string, detail?: string) => FormulaViolation;
40
47
  otherFieldErrorsTruncated: (field: string, omitted: number) => FormulaViolation;
@@ -1,6 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FormulaViolations = void 0;
3
+ exports.FormulaViolations = exports.UNNAMED_JOINED_SOURCE = void 0;
4
+ exports.UNNAMED_JOINED_SOURCE = 'a joined Data Mart';
5
+ const GENERIC_MART_PHRASES = new Set(['this Data Mart', exports.UNNAMED_JOINED_SOURCE]);
6
+ const martName = (name) => (GENERIC_MART_PHRASES.has(name) ? name : `\`${name}\``);
7
+ const otherMartName = (name, alreadyNamed) => name === exports.UNNAMED_JOINED_SOURCE && alreadyNamed === exports.UNNAMED_JOINED_SOURCE
8
+ ? 'another joined Data Mart'
9
+ : martName(name);
10
+ const withoutBackticks = (name) => name.split('`').join('');
11
+ const listed = (names) => names.length < 2
12
+ ? (names[0] ?? '')
13
+ : `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;
14
+ const countedFrom = (ref, source) => ref === undefined
15
+ ? `A COUNT here reads ${martName(source)}`
16
+ : `\`${ref}\` comes from ${martName(source)}`;
17
+ const joinedOn = (source, key, via) => {
18
+ const through = via === undefined ? undefined : `reached through ${otherMartName(via, source)}`;
19
+ if (key === undefined || key.length === 0) {
20
+ return through === undefined ? 'whose join' : `${through}, whose join`;
21
+ }
22
+ const spelled = `joined on ${key.map(k => `\`${k}\``).join(' + ')}`;
23
+ return `${through === undefined ? spelled : `${through} ${spelled}`}, which`;
24
+ };
25
+ const UNIQUE_COUNT_OFFER_CLAUSE = {
26
+ none: '',
27
+ report: ', or pick its Unique Count measure in a report',
28
+ query: ", or select that Data Mart's Unique Count field instead",
29
+ };
30
+ const distinctAdvice = (uniqueCount) => `Use COUNT(DISTINCT ...) on a column that identifies them${UNIQUE_COUNT_OFFER_CLAUSE[uniqueCount]}.`;
4
31
  exports.FormulaViolations = {
5
32
  levelMixing: (field, column) => ({
6
33
  code: 'FORMULA_LEVEL_MIXING',
@@ -212,6 +239,60 @@ exports.FormulaViolations = {
212
239
  `NULLIF(it, 0), which turns the zero into an empty cell. Advice only: this does not block ` +
213
240
  `the save.`,
214
241
  }),
242
+ joinedMeasureMultiplied: (field, ref, source, key, multipliedBy, rowsOf = 'this Data Mart', uniqueCount = 'none') => ({
243
+ code: 'FORMULA_JOINED_MEASURE_MULTIPLIED',
244
+ field,
245
+ ...(ref === undefined ? {} : { subject: ref }),
246
+ message: `${countedFrom(ref, source)}, ${joinedOn(source, key, multipliedBy)} can match several ` +
247
+ `rows of ${rowsOf} — so COUNT counts matches, not that Data Mart's rows. ` +
248
+ distinctAdvice(uniqueCount),
249
+ }),
250
+ joinedMeasureGrainUnproven: (field, ref, source, unprovenMart, collapses = false, uniqueCount = 'none') => ({
251
+ code: 'FORMULA_JOINED_MEASURE_GRAIN_UNPROVEN',
252
+ field,
253
+ ...(ref === undefined ? {} : { subject: ref }),
254
+ message: (unprovenMart === undefined
255
+ ? `${countedFrom(ref, source)}, and it can't be checked whether the join matches one row ` +
256
+ `or several — if several, COUNT is inflated.`
257
+ : `${countedFrom(ref, source)}, and ${otherMartName(unprovenMart, source)} has no ` +
258
+ `Primary Key, so it can't be checked whether the join matches one row or several — if ` +
259
+ `several, COUNT is inflated. Set a Primary Key to find out.`) +
260
+ (collapses
261
+ ? ` Several rows of ${martName(source)} can also share one join key value, so COUNT can ` +
262
+ `come out lower too. ${distinctAdvice(uniqueCount)}`
263
+ : ''),
264
+ }),
265
+ joinedMeasureCollapsed: (field, ref, source, collapsedBy, uniqueCount = 'none') => ({
266
+ code: 'FORMULA_JOINED_MEASURE_COLLAPSED',
267
+ field,
268
+ ...(ref === undefined ? {} : { subject: ref }),
269
+ message: `${countedFrom(ref, source)}, ` +
270
+ (collapsedBy === undefined ? '' : `reached through ${otherMartName(collapsedBy, source)}, `) +
271
+ `where several rows can share one join key value — so COUNT counts the rows of this Data ` +
272
+ `Mart they match, which can be fewer than that Data Mart's own rows. ` +
273
+ distinctAdvice(uniqueCount),
274
+ }),
275
+ joinedRowsExcluded: (field, sources) => {
276
+ const named = [
277
+ ...new Set(sources.filter(s => s !== exports.UNNAMED_JOINED_SOURCE).map(withoutBackticks)),
278
+ ];
279
+ const unnamed = sources.filter(s => s === exports.UNNAMED_JOINED_SOURCE).length;
280
+ const anonymous = unnamed === 1
281
+ ? named.length === 0
282
+ ? exports.UNNAMED_JOINED_SOURCE
283
+ : 'another joined Data Mart'
284
+ : `${unnamed} ${named.length === 0 ? '' : 'other '}joined Data Marts`;
285
+ const names = unnamed === 0 ? named : [...named, anonymous];
286
+ return {
287
+ code: 'FORMULA_JOINED_ROWS_EXCLUDED',
288
+ field,
289
+ message: named.length + unnamed === 1
290
+ ? `This formula reads ${listed(names)} through a join. Its rows that match nothing ` +
291
+ `here are dropped, so the result may not match that Data Mart's own totals.`
292
+ : `This formula reads ${listed(names)} through joins. Their rows that match nothing ` +
293
+ `here are dropped, so the result may not match those Data Marts' own totals.`,
294
+ };
295
+ },
215
296
  warehouseRejected: (field, detail) => ({
216
297
  code: 'FORMULA_WAREHOUSE_REJECTED',
217
298
  field,
@@ -0,0 +1,32 @@
1
+ import type { AvailableSourceDto, BlendedFieldDto, MainGrainCollapse, MainGrainMultiplication } from '../dto/domain/blendable-schema.dto';
2
+ import { AggregateCall } from './formula-analyzer';
3
+ import { FormulaViolation } from './formula-violations';
4
+ export interface JoinGrainSource {
5
+ multiplication: MainGrainMultiplication;
6
+ keyFields: readonly string[];
7
+ collapse: MainGrainCollapse;
8
+ title: string;
9
+ titleHidden: boolean;
10
+ uniqueCountAvailable: boolean;
11
+ reader: JoinGrainAudience['kind'];
12
+ fieldNames?: ReadonlyMap<string, string>;
13
+ unprovenAt?: string;
14
+ multipliedAt?: string;
15
+ collapsedAt?: string;
16
+ }
17
+ export type JoinGrainAudience = {
18
+ kind: 'editor';
19
+ } | {
20
+ kind: 'agent';
21
+ blendedFields: readonly BlendedFieldDto[];
22
+ };
23
+ export declare function buildJoinGrainSources(sources: readonly AvailableSourceDto[], audience: JoinGrainAudience): Map<string, JoinGrainSource>;
24
+ export interface JoinGrainInput {
25
+ fieldName: string;
26
+ aggregateCalls: readonly AggregateCall[];
27
+ sources: ReadonlyMap<string, JoinGrainSource>;
28
+ }
29
+ export declare function checkJoinGrain(input: JoinGrainInput): {
30
+ warnings: FormulaViolation[];
31
+ };
32
+ export declare function withoutUntouchedJoinAdvisories(warnings: readonly FormulaViolation[], touchedFields: ReadonlySet<string>, primaryKeyChanged: boolean): FormulaViolation[];