@adaptabletools/adaptable-mcp 0.1.0-canary.0 → 0.1.0-canary.2

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 (348) hide show
  1. package/README.md +58 -61
  2. package/data/changes/21-22.json +542 -0
  3. package/data/changes/22-23.json +639 -0
  4. package/data/changes/23-24.json +1874 -0
  5. package/data/manifest.snapshot.json +202 -0
  6. package/data/templates/angular/src/app/adaptableOptions.ts +40 -0
  7. package/data/templates/angular/src/app/agGridModules.ts +7 -0
  8. package/data/templates/angular/src/app/app.component.ts +66 -0
  9. package/data/templates/angular/src/app/app.module.ts +14 -0
  10. package/data/templates/angular/src/app/columnDefs.ts +121 -0
  11. package/data/templates/angular/src/app/gridOptions.ts +32 -0
  12. package/data/templates/angular/src/app/onAdaptableReady.ts +11 -0
  13. package/data/templates/angular/src/app/rowData.ts +851 -0
  14. package/data/templates/angular/src/app/styles.css +50 -0
  15. package/data/templates/angular/src/index.html +17 -0
  16. package/data/templates/angular/src/main.ts +18 -0
  17. package/data/templates/angular/src/polyfills.ts +1 -0
  18. package/data/templates/angular/tsconfig.json +16 -0
  19. package/data/templates/manifest.json +406 -0
  20. package/data/templates/react/src/App.tsx +71 -0
  21. package/data/templates/react/src/adaptableOptions.ts +40 -0
  22. package/data/templates/react/src/agGridModules.ts +7 -0
  23. package/data/templates/react/src/columnDefs.ts +121 -0
  24. package/data/templates/react/src/gridOptions.ts +32 -0
  25. package/data/templates/react/src/index.tsx +8 -0
  26. package/data/templates/react/src/onAdaptableReady.ts +11 -0
  27. package/data/templates/react/src/rowData.ts +851 -0
  28. package/data/templates/react/src/styles.css +50 -0
  29. package/data/templates/react/tsconfig.json +9 -0
  30. package/data/templates/vanilla/index.html +18 -0
  31. package/data/templates/vanilla/src/adaptableOptions.ts +40 -0
  32. package/data/templates/vanilla/src/agGridModules.ts +7 -0
  33. package/data/templates/vanilla/src/columnDefs.ts +121 -0
  34. package/data/templates/vanilla/src/gridOptions.ts +32 -0
  35. package/data/templates/vanilla/src/index.ts +41 -0
  36. package/data/templates/vanilla/src/onAdaptableReady.ts +11 -0
  37. package/data/templates/vanilla/src/rowData.ts +851 -0
  38. package/data/templates/vanilla/src/styles.css +50 -0
  39. package/data/templates/vanilla/tsconfig.json +14 -0
  40. package/data/templates/vue/.babelrc +3 -0
  41. package/data/templates/vue/public/index.html +19 -0
  42. package/data/templates/vue/src/App.vue +35 -0
  43. package/data/templates/vue/src/adaptableOptions.ts +40 -0
  44. package/data/templates/vue/src/agGridModules.ts +7 -0
  45. package/data/templates/vue/src/columnDefs.ts +121 -0
  46. package/data/templates/vue/src/gridOptions.ts +32 -0
  47. package/data/templates/vue/src/main.ts +6 -0
  48. package/data/templates/vue/src/onAdaptableReady.ts +11 -0
  49. package/data/templates/vue/src/rowData.ts +851 -0
  50. package/data/templates/vue/src/shims-vue.d.ts +6 -0
  51. package/data/templates/vue/src/styles.css +50 -0
  52. package/data/templates/vue/tsconfig.json +30 -0
  53. package/dist/bin.js +23 -0
  54. package/dist/bin.js.map +1 -0
  55. package/dist/cli/build-commands.js +200 -0
  56. package/dist/cli/build-commands.js.map +1 -0
  57. package/dist/cli/index.js +94 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/render.js +57 -0
  60. package/dist/cli/render.js.map +1 -0
  61. package/dist/core/anonymise/anonymise.js +315 -0
  62. package/dist/core/anonymise/anonymise.js.map +1 -0
  63. package/dist/core/anonymise/capabilities.js +94 -0
  64. package/dist/core/anonymise/capabilities.js.map +1 -0
  65. package/dist/core/aql/capabilities.js +339 -0
  66. package/dist/core/aql/capabilities.js.map +1 -0
  67. package/dist/core/aql/check.js +204 -0
  68. package/dist/core/aql/check.js.map +1 -0
  69. package/dist/core/aql/engine.js +92 -0
  70. package/dist/core/aql/engine.js.map +1 -0
  71. package/dist/core/aql/functions.js +108 -0
  72. package/dist/core/aql/functions.js.map +1 -0
  73. package/dist/core/aql/migrate.js +62 -0
  74. package/dist/core/aql/migrate.js.map +1 -0
  75. package/dist/core/capabilities.js +105 -0
  76. package/dist/core/capabilities.js.map +1 -0
  77. package/dist/core/changes/capabilities.js +92 -0
  78. package/dist/core/changes/capabilities.js.map +1 -0
  79. package/dist/core/changes/changes.js +101 -0
  80. package/dist/core/changes/changes.js.map +1 -0
  81. package/dist/core/changes/grep.js +183 -0
  82. package/dist/core/changes/grep.js.map +1 -0
  83. package/dist/core/changes/records.js +172 -0
  84. package/dist/core/changes/records.js.map +1 -0
  85. package/dist/core/changes/render-md.js +101 -0
  86. package/dist/core/changes/render-md.js.map +1 -0
  87. package/dist/core/changes/with-docs.js +86 -0
  88. package/dist/core/changes/with-docs.js.map +1 -0
  89. package/dist/core/compat/capabilities.js +127 -0
  90. package/dist/core/compat/capabilities.js.map +1 -0
  91. package/dist/core/compat/manifest.js +203 -0
  92. package/dist/core/compat/manifest.js.map +1 -0
  93. package/dist/core/constants.js +38 -0
  94. package/dist/core/constants.js.map +1 -0
  95. package/dist/core/context/capabilities.js +106 -0
  96. package/dist/core/context/capabilities.js.map +1 -0
  97. package/dist/core/context/detect.js +370 -0
  98. package/dist/core/context/detect.js.map +1 -0
  99. package/dist/core/context/projects.js +159 -0
  100. package/dist/core/context/projects.js.map +1 -0
  101. package/dist/core/context/resolve.js +85 -0
  102. package/dist/core/context/resolve.js.map +1 -0
  103. package/dist/core/convert/capabilities.js +86 -0
  104. package/dist/core/convert/capabilities.js.map +1 -0
  105. package/dist/core/convert/coldefs.js +313 -0
  106. package/dist/core/convert/coldefs.js.map +1 -0
  107. package/dist/core/docs/areas.js +22 -0
  108. package/dist/core/docs/areas.js.map +1 -0
  109. package/dist/core/docs/cache.js +133 -0
  110. package/dist/core/docs/cache.js.map +1 -0
  111. package/dist/core/docs/capabilities.js +377 -0
  112. package/dist/core/docs/capabilities.js.map +1 -0
  113. package/dist/core/docs/corpus.js.map +1 -0
  114. package/dist/core/docs/demos.js +105 -0
  115. package/dist/core/docs/demos.js.map +1 -0
  116. package/dist/core/docs/get-page.js +182 -0
  117. package/dist/core/docs/get-page.js.map +1 -0
  118. package/dist/core/docs/hosts.js +74 -0
  119. package/dist/core/docs/hosts.js.map +1 -0
  120. package/dist/core/docs/search.js.map +1 -0
  121. package/dist/core/envelope.js +79 -0
  122. package/dist/core/envelope.js.map +1 -0
  123. package/dist/core/extract/imports.js +163 -0
  124. package/dist/core/extract/imports.js.map +1 -0
  125. package/dist/core/extract/input.js +140 -0
  126. package/dist/core/extract/input.js.map +1 -0
  127. package/dist/core/extract/line-map.js +90 -0
  128. package/dist/core/extract/line-map.js.map +1 -0
  129. package/dist/core/extract/ts-literal.js +963 -0
  130. package/dist/core/extract/ts-literal.js.map +1 -0
  131. package/dist/core/index.js +13 -0
  132. package/dist/core/index.js.map +1 -0
  133. package/dist/core/migrate/capabilities.js +143 -0
  134. package/dist/core/migrate/capabilities.js.map +1 -0
  135. package/dist/core/migrate/leftovers.js +119 -0
  136. package/dist/core/migrate/leftovers.js.map +1 -0
  137. package/dist/core/migrate/state.js +295 -0
  138. package/dist/core/migrate/state.js.map +1 -0
  139. package/dist/core/packages/cache.js +139 -0
  140. package/dist/core/packages/cache.js.map +1 -0
  141. package/dist/core/packages/capabilities.js +95 -0
  142. package/dist/core/packages/capabilities.js.map +1 -0
  143. package/dist/{adaptable/types.js → core/packages/entry-types.js} +1 -1
  144. package/dist/core/packages/entry-types.js.map +1 -0
  145. package/dist/core/packages/exec.js +37 -0
  146. package/dist/core/packages/exec.js.map +1 -0
  147. package/dist/core/packages/load-entry.js +123 -0
  148. package/dist/core/packages/load-entry.js.map +1 -0
  149. package/dist/core/packages/prepare.js +122 -0
  150. package/dist/core/packages/prepare.js.map +1 -0
  151. package/dist/core/packages/registry.js +75 -0
  152. package/dist/core/packages/registry.js.map +1 -0
  153. package/dist/core/packages/resolve.js +94 -0
  154. package/dist/core/packages/resolve.js.map +1 -0
  155. package/dist/core/packages/versions.js +71 -0
  156. package/dist/core/packages/versions.js.map +1 -0
  157. package/dist/core/ping.js +22 -0
  158. package/dist/core/ping.js.map +1 -0
  159. package/dist/core/register.js +18 -0
  160. package/dist/core/register.js.map +1 -0
  161. package/dist/core/scaffold/capabilities.js +434 -0
  162. package/dist/core/scaffold/capabilities.js.map +1 -0
  163. package/dist/core/scaffold/generate.js +409 -0
  164. package/dist/core/scaffold/generate.js.map +1 -0
  165. package/dist/core/scaffold/infer.js +441 -0
  166. package/dist/core/scaffold/infer.js.map +1 -0
  167. package/dist/core/scaffold/overlay.js +290 -0
  168. package/dist/core/scaffold/overlay.js.map +1 -0
  169. package/dist/core/scaffold/readers/csv.js +146 -0
  170. package/dist/core/scaffold/readers/csv.js.map +1 -0
  171. package/dist/core/scaffold/readers/dataset.js +53 -0
  172. package/dist/core/scaffold/readers/dataset.js.map +1 -0
  173. package/dist/core/scaffold/readers/index.js +62 -0
  174. package/dist/core/scaffold/readers/index.js.map +1 -0
  175. package/dist/core/scaffold/readers/json.js +101 -0
  176. package/dist/core/scaffold/readers/json.js.map +1 -0
  177. package/dist/core/scaffold/readers/xlsx.js +81 -0
  178. package/dist/core/scaffold/readers/xlsx.js.map +1 -0
  179. package/dist/core/scaffold/suggestions.js +57 -0
  180. package/dist/core/scaffold/suggestions.js.map +1 -0
  181. package/dist/core/scaffold/templates.js +59 -0
  182. package/dist/core/scaffold/templates.js.map +1 -0
  183. package/dist/core/setup/audit.js +91 -0
  184. package/dist/core/setup/audit.js.map +1 -0
  185. package/dist/core/setup/capabilities.js +80 -0
  186. package/dist/core/setup/capabilities.js.map +1 -0
  187. package/dist/core/setup/context.js +118 -0
  188. package/dist/core/setup/context.js.map +1 -0
  189. package/dist/core/setup/rules/cell-data-type.js +40 -0
  190. package/dist/core/setup/rules/cell-data-type.js.map +1 -0
  191. package/dist/core/setup/rules/coldef-ownership.js +67 -0
  192. package/dist/core/setup/rules/coldef-ownership.js.map +1 -0
  193. package/dist/core/setup/rules/css-import.js +34 -0
  194. package/dist/core/setup/rules/css-import.js.map +1 -0
  195. package/dist/core/setup/rules/direct-grid.js +42 -0
  196. package/dist/core/setup/rules/direct-grid.js.map +1 -0
  197. package/dist/core/setup/rules/index.js +53 -0
  198. package/dist/core/setup/rules/index.js.map +1 -0
  199. package/dist/core/setup/rules/licence-literal.js +23 -0
  200. package/dist/core/setup/rules/licence-literal.js.map +1 -0
  201. package/dist/core/setup/rules/modules.js +86 -0
  202. package/dist/core/setup/rules/modules.js.map +1 -0
  203. package/dist/core/setup/rules/react-stable-refs.js +20 -0
  204. package/dist/core/setup/rules/react-stable-refs.js.map +1 -0
  205. package/dist/core/setup/rules/ready-hook.js +33 -0
  206. package/dist/core/setup/rules/ready-hook.js.map +1 -0
  207. package/dist/core/setup/rules/required-options.js +43 -0
  208. package/dist/core/setup/rules/required-options.js.map +1 -0
  209. package/dist/core/setup/rules/rule.js +10 -0
  210. package/dist/core/setup/rules/rule.js.map +1 -0
  211. package/dist/core/setup/rules/version-skew.js +65 -0
  212. package/dist/core/setup/rules/version-skew.js.map +1 -0
  213. package/dist/core/state/capabilities.js +78 -0
  214. package/dist/core/state/capabilities.js.map +1 -0
  215. package/dist/core/state/check.js +216 -0
  216. package/dist/core/state/check.js.map +1 -0
  217. package/dist/core/state/columns.js +130 -0
  218. package/dist/core/state/columns.js.map +1 -0
  219. package/dist/core/state/did-you-mean.js +83 -0
  220. package/dist/core/state/did-you-mean.js.map +1 -0
  221. package/dist/core/state/expressions.js +170 -0
  222. package/dist/core/state/expressions.js.map +1 -0
  223. package/dist/core/state/known-names.js +96 -0
  224. package/dist/core/state/known-names.js.map +1 -0
  225. package/dist/core/state/rules/aql-legacy-shape.js +42 -0
  226. package/dist/core/state/rules/aql-legacy-shape.js.map +1 -0
  227. package/dist/core/state/rules/aql-missing.js +21 -0
  228. package/dist/core/state/rules/aql-missing.js.map +1 -0
  229. package/dist/core/state/rules/aql-syntax.js +77 -0
  230. package/dist/core/state/rules/aql-syntax.js.map +1 -0
  231. package/dist/core/state/rules/calculated-settings.js +23 -0
  232. package/dist/core/state/rules/calculated-settings.js.map +1 -0
  233. package/dist/core/state/rules/column-id-exists.js +29 -0
  234. package/dist/core/state/rules/column-id-exists.js.map +1 -0
  235. package/dist/core/state/rules/dashboard-module-names.js +31 -0
  236. package/dist/core/state/rules/dashboard-module-names.js.map +1 -0
  237. package/dist/core/state/rules/dashboard-toolbar-names.js +48 -0
  238. package/dist/core/state/rules/dashboard-toolbar-names.js.map +1 -0
  239. package/dist/core/state/rules/format-column-pivot-display-format.js +43 -0
  240. package/dist/core/state/rules/format-column-pivot-display-format.js.map +1 -0
  241. package/dist/core/state/rules/helpers.js +39 -0
  242. package/dist/core/state/rules/helpers.js.map +1 -0
  243. package/dist/core/state/rules/index.js +80 -0
  244. package/dist/core/state/rules/index.js.map +1 -0
  245. package/dist/core/state/rules/layout-column-refs.js +60 -0
  246. package/dist/core/state/rules/layout-column-refs.js.map +1 -0
  247. package/dist/core/state/rules/layout-current-exists.js +27 -0
  248. package/dist/core/state/rules/layout-current-exists.js.map +1 -0
  249. package/dist/core/state/rules/layout-non-empty.js +32 -0
  250. package/dist/core/state/rules/layout-non-empty.js.map +1 -0
  251. package/dist/core/state/rules/rule.js +2 -0
  252. package/dist/core/state/rules/rule.js.map +1 -0
  253. package/dist/core/state/rules/scope-column-refs.js +32 -0
  254. package/dist/core/state/rules/scope-column-refs.js.map +1 -0
  255. package/dist/core/state/rules/scope-shape.js +61 -0
  256. package/dist/core/state/rules/scope-shape.js.map +1 -0
  257. package/dist/core/state/rules/state-unique-name.js +40 -0
  258. package/dist/core/state/rules/state-unique-name.js.map +1 -0
  259. package/dist/core/state/rules/state-unknown-section.js +30 -0
  260. package/dist/core/state/rules/state-unknown-section.js.map +1 -0
  261. package/dist/core/state/rules/type-discriminator.js +70 -0
  262. package/dist/core/state/rules/type-discriminator.js.map +1 -0
  263. package/dist/core/state/type-check.js +408 -0
  264. package/dist/core/state/type-check.js.map +1 -0
  265. package/dist/mcp/index.js +109 -0
  266. package/dist/mcp/index.js.map +1 -0
  267. package/dist/mcp/server.js +110 -0
  268. package/dist/mcp/server.js.map +1 -0
  269. package/dist/skills/adaptable-debug/SKILL.md +145 -0
  270. package/dist/skills/adaptable-debug/VERSION.md +1 -0
  271. package/dist/skills/adaptable-debug/references/_shared/agents-snippet.md +3 -0
  272. package/dist/skills/adaptable-debug/references/_shared/capabilities.md +35 -0
  273. package/dist/skills/adaptable-debug/references/_shared/conversation.md +20 -0
  274. package/dist/skills/adaptable-debug/references/_shared/docs-protocol.md +36 -0
  275. package/dist/skills/adaptable-debug/references/_shared/grounding.md +54 -0
  276. package/dist/skills/adaptable-debug/references/_shared/guards.md +20 -0
  277. package/dist/skills/adaptable-debug/references/_shared/validation-loop.md +42 -0
  278. package/dist/skills/adaptable-debug/references/devtools-api.md +36 -0
  279. package/dist/skills/adaptable-debug/references/feedback-template.md +36 -0
  280. package/dist/skills/adaptable-debug/references/symptoms.md +37 -0
  281. package/dist/skills/adaptable-debug/references/ticket-template.md +50 -0
  282. package/dist/skills/adaptable-dev/SKILL.md +97 -0
  283. package/dist/skills/adaptable-dev/VERSION.md +1 -0
  284. package/dist/skills/adaptable-dev/references/_shared/agents-snippet.md +3 -0
  285. package/dist/skills/adaptable-dev/references/_shared/capabilities.md +35 -0
  286. package/dist/skills/adaptable-dev/references/_shared/conversation.md +20 -0
  287. package/dist/skills/adaptable-dev/references/_shared/docs-protocol.md +36 -0
  288. package/dist/skills/adaptable-dev/references/_shared/grounding.md +54 -0
  289. package/dist/skills/adaptable-dev/references/_shared/guards.md +20 -0
  290. package/dist/skills/adaptable-dev/references/_shared/validation-loop.md +42 -0
  291. package/dist/skills/adaptable-dev/references/recommendations.md +93 -0
  292. package/dist/skills/adaptable-setup/SKILL.md +158 -0
  293. package/dist/skills/adaptable-setup/VERSION.md +1 -0
  294. package/dist/skills/adaptable-setup/references/_shared/agents-snippet.md +3 -0
  295. package/dist/skills/adaptable-setup/references/_shared/capabilities.md +35 -0
  296. package/dist/skills/adaptable-setup/references/_shared/conversation.md +20 -0
  297. package/dist/skills/adaptable-setup/references/_shared/docs-protocol.md +36 -0
  298. package/dist/skills/adaptable-setup/references/_shared/grounding.md +54 -0
  299. package/dist/skills/adaptable-setup/references/_shared/guards.md +20 -0
  300. package/dist/skills/adaptable-setup/references/_shared/validation-loop.md +42 -0
  301. package/dist/skills/adaptable-setup/references/paths.md +45 -0
  302. package/dist/skills/adaptable-upgrade/SKILL.md +269 -0
  303. package/dist/skills/adaptable-upgrade/VERSION.md +1 -0
  304. package/dist/skills/adaptable-upgrade/references/_shared/agents-snippet.md +3 -0
  305. package/dist/skills/adaptable-upgrade/references/_shared/capabilities.md +35 -0
  306. package/dist/skills/adaptable-upgrade/references/_shared/conversation.md +20 -0
  307. package/dist/skills/adaptable-upgrade/references/_shared/docs-protocol.md +36 -0
  308. package/dist/skills/adaptable-upgrade/references/_shared/grounding.md +54 -0
  309. package/dist/skills/adaptable-upgrade/references/_shared/guards.md +20 -0
  310. package/dist/skills/adaptable-upgrade/references/_shared/validation-loop.md +42 -0
  311. package/dist/skills/adaptable-upgrade/references/apply-order.md +171 -0
  312. package/dist/skills/adaptable-upgrade/references/plan-preamble.md +151 -0
  313. package/dist/skills/adaptable-upgrade/scripts/adaptable.mjs +24 -0
  314. package/package.json +34 -13
  315. package/dist/adaptable/loadEntry.js +0 -94
  316. package/dist/adaptable/loadEntry.js.map +0 -1
  317. package/dist/adaptable/types.js.map +0 -1
  318. package/dist/cache.js +0 -11
  319. package/dist/cache.js.map +0 -1
  320. package/dist/checks/stateRules.js +0 -389
  321. package/dist/checks/stateRules.js.map +0 -1
  322. package/dist/checks/stateTypes.js +0 -142
  323. package/dist/checks/stateTypes.js.map +0 -1
  324. package/dist/context.js +0 -39
  325. package/dist/context.js.map +0 -1
  326. package/dist/docs/corpus.js.map +0 -1
  327. package/dist/docs/search.js.map +0 -1
  328. package/dist/docs/source.js +0 -151
  329. package/dist/docs/source.js.map +0 -1
  330. package/dist/environment.js +0 -181
  331. package/dist/environment.js.map +0 -1
  332. package/dist/index.js +0 -7
  333. package/dist/index.js.map +0 -1
  334. package/dist/prompts.js +0 -84
  335. package/dist/prompts.js.map +0 -1
  336. package/dist/resources.js +0 -59
  337. package/dist/resources.js.map +0 -1
  338. package/dist/server.js +0 -23
  339. package/dist/server.js.map +0 -1
  340. package/dist/tools/checks.js +0 -250
  341. package/dist/tools/checks.js.map +0 -1
  342. package/dist/tools/docs.js +0 -173
  343. package/dist/tools/docs.js.map +0 -1
  344. package/dist/tools/environment.js +0 -52
  345. package/dist/tools/environment.js.map +0 -1
  346. package/skills/adaptable-dev/SKILL.md +0 -42
  347. /package/dist/{docs → core/docs}/corpus.js +0 -0
  348. /package/dist/{docs → core/docs}/search.js +0 -0
@@ -0,0 +1,48 @@
1
+ import { asArray, isObj } from '../expressions.js';
2
+ import { closest, strings } from './helpers.js';
3
+ import { defineRule } from './rule.js';
4
+ /**
5
+ * `Dashboard.Tabs[].Toolbars` and `Dashboard.PinnedToolbars` name built-in toolbars
6
+ * of the checked major or custom toolbars from `dashboardOptions.customToolbars`.
7
+ * The type is `AdaptableDashboardToolbars | string[]`, so the compiler cannot catch a typo.
8
+ */
9
+ export default defineRule({
10
+ id: 'dashboard/toolbar-names',
11
+ docs: 'ui-dashboard-tabs-toolbars',
12
+ check({ state, options, names }) {
13
+ const dashboard = isObj(state.Dashboard) ? state.Dashboard : undefined;
14
+ if (!dashboard) {
15
+ return [];
16
+ }
17
+ const dashboardOptions = options && isObj(options.dashboardOptions) ? options.dashboardOptions : undefined;
18
+ const custom = asArray(dashboardOptions?.customToolbars)
19
+ .map((toolbar) => (isObj(toolbar) && typeof toolbar.name === 'string' ? toolbar.name : undefined))
20
+ .filter((name) => !!name);
21
+ const known = [...names.dashboardToolbars, ...custom];
22
+ const issues = [];
23
+ const check = (list, path) => {
24
+ strings(list).forEach((name, i) => {
25
+ if (known.includes(name)) {
26
+ return;
27
+ }
28
+ const suggestion = closest(name, known);
29
+ issues.push({
30
+ path: `${path}[${i}]`,
31
+ severity: options ? 'error' : 'warning',
32
+ message: options
33
+ ? `"${name}" is neither a built-in toolbar nor a custom toolbar in \`dashboardOptions.customToolbars\`.`
34
+ : `"${name}" is not a built-in toolbar; if it is a custom toolbar it must be defined in \`dashboardOptions.customToolbars\` (the Adaptable Options were not visible to this check).`,
35
+ fix: suggestion ? `Did you mean "${suggestion}"?` : `Built-in toolbars: ${names.dashboardToolbars.join(', ')}.`,
36
+ });
37
+ });
38
+ };
39
+ asArray(dashboard.Tabs).forEach((tab, i) => {
40
+ if (isObj(tab)) {
41
+ check(tab.Toolbars, `Dashboard.Tabs[${i}].Toolbars`);
42
+ }
43
+ });
44
+ check(dashboard.PinnedToolbars, 'Dashboard.PinnedToolbars');
45
+ return issues;
46
+ },
47
+ });
48
+ //# sourceMappingURL=dashboard-toolbar-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-toolbar-names.js","sourceRoot":"","sources":["../../../../src/core/state/rules/dashboard-toolbar-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD;;;;GAIG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,4BAA4B;IAClC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,gBAAgB,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3G,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;aACrD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACjG,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,iBAAiB,EAAE,GAAG,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,IAAY,EAAQ,EAAE;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzB,OAAO;gBACT,CAAC;gBACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG;oBACrB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBACvC,OAAO,EAAE,OAAO;wBACd,CAAC,CAAC,IAAI,IAAI,8FAA8F;wBACxG,CAAC,CAAC,IAAI,IAAI,0KAA0K;oBACtL,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,UAAU,IAAI,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;iBAChH,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { asArray, eachInSection, isObj } from '../expressions.js';
2
+ import { defineRule } from './rule.js';
3
+ /**
4
+ * A Format Column's DisplayFormat is matched against the generated pivot result column
5
+ * (`pivot_<pivotColumn>_<value>_<columnId>`), so a ColumnIds scope on the aggregation column
6
+ * never reaches it; only Style and Rule are inherited from the base column.
7
+ */
8
+ export default defineRule({
9
+ id: 'format-column/pivot-display-format',
10
+ docs: 'handbook-column-formatting-display-format',
11
+ check({ state }) {
12
+ const pivotAggregated = new Map();
13
+ for (const layout of asArray(isObj(state.Layout) ? state.Layout.Layouts : undefined)) {
14
+ if (isObj(layout) && layout.PivotColumns !== undefined) {
15
+ for (const item of asArray(layout.PivotAggregationColumns)) {
16
+ if (isObj(item) && typeof item.ColumnId === 'string' && !pivotAggregated.has(item.ColumnId)) {
17
+ pivotAggregated.set(item.ColumnId, String(layout.Name));
18
+ }
19
+ }
20
+ }
21
+ }
22
+ if (!pivotAggregated.size) {
23
+ return [];
24
+ }
25
+ const issues = [];
26
+ eachInSection(state, 'FormatColumn', 'FormatColumns', (formatColumn, path) => {
27
+ if (formatColumn.DisplayFormat === undefined || !isObj(formatColumn.Scope)) {
28
+ return;
29
+ }
30
+ const hit = asArray(formatColumn.Scope.ColumnIds).find((id) => typeof id === 'string' && pivotAggregated.has(id));
31
+ if (hit) {
32
+ issues.push({
33
+ path: `${path}.Scope`,
34
+ severity: 'warning',
35
+ message: `DisplayFormat scoped to "${hit}" does not format its pivot result columns in Layout "${pivotAggregated.get(hit)}" (only Style and Rule are inherited).`,
36
+ fix: "Scope the DisplayFormat with DataTypes (e.g. ['number']) or ColumnTypes (AG Grid `colDef.type`, copied onto pivot result columns), or list the generated pivot result column ids.",
37
+ });
38
+ }
39
+ });
40
+ return issues;
41
+ },
42
+ });
43
+ //# sourceMappingURL=format-column-pivot-display-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-column-pivot-display-format.js","sourceRoot":"","sources":["../../../../src/core/state/rules/format-column-pivot-display-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD;;;;GAIG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,oCAAoC;IACxC,IAAI,EAAE,2CAA2C;IACjD,KAAK,CAAC,EAAE,KAAK,EAAE;QACb,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAClD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACvD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBAC3D,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5F,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE;YAC3E,IAAI,YAAY,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3E,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChI,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,GAAG,IAAI,QAAQ;oBACrB,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,4BAA4B,GAAG,yDAAyD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,wCAAwC;oBACjK,GAAG,EAAE,mLAAmL;iBACzL,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { levenshtein } from '../did-you-mean.js';
2
+ import { asArray, isObj } from '../expressions.js';
3
+ /** Every object inside an array property of a State section: `(section, list, item, path, index)` */
4
+ export function eachListItem(state, fn, options = {}) {
5
+ for (const [section, value] of Object.entries(state)) {
6
+ if (!isObj(value) || options.exclude?.includes(section) || (options.sections && !options.sections.includes(section))) {
7
+ continue;
8
+ }
9
+ for (const [list, items] of Object.entries(value)) {
10
+ if (!Array.isArray(items)) {
11
+ continue;
12
+ }
13
+ items.forEach((item, index) => {
14
+ if (isObj(item)) {
15
+ fn(section, list, item, `${section}.${list}[${index}]`, index);
16
+ }
17
+ });
18
+ }
19
+ }
20
+ }
21
+ export const strings = (value) => asArray(value).filter((v) => typeof v === 'string');
22
+ /** The closest known name (distance ≤ 2, or a case-only difference), for did-you-mean */
23
+ export function closest(name, known) {
24
+ const lower = name.toLowerCase();
25
+ const cased = known.find((k) => k !== name && k.toLowerCase() === lower);
26
+ if (cased) {
27
+ return cased;
28
+ }
29
+ let best;
30
+ for (const candidate of known) {
31
+ const distance = levenshtein(lower, candidate.toLowerCase());
32
+ if (distance <= 2 && (!best || distance < best.distance)) {
33
+ best = { name: candidate, distance };
34
+ }
35
+ }
36
+ return best?.name;
37
+ }
38
+ export const quote = (names) => names.map((n) => `"${n}"`).join(', ');
39
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/core/state/rules/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAY,MAAM,mBAAmB,CAAC;AAE7D,qGAAqG;AACrG,MAAM,UAAU,YAAY,CAC1B,KAAU,EACV,EAAmF,EACnF,UAAyE,EAAE;IAE3E,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACrH,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChB,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAY,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAEtH,yFAAyF;AACzF,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,KAAwB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAoD,CAAC;IACzD,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7D,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAwB,EAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ import aqlLegacyShape from './aql-legacy-shape.js';
2
+ import aqlMissing from './aql-missing.js';
3
+ import aqlSyntax from './aql-syntax.js';
4
+ import calculatedSettings from './calculated-settings.js';
5
+ import columnIdExists from './column-id-exists.js';
6
+ import dashboardModuleNames from './dashboard-module-names.js';
7
+ import dashboardToolbarNames from './dashboard-toolbar-names.js';
8
+ import formatColumnPivotDisplayFormat from './format-column-pivot-display-format.js';
9
+ import layoutColumnRefs from './layout-column-refs.js';
10
+ import layoutCurrentExists from './layout-current-exists.js';
11
+ import layoutNonEmpty from './layout-non-empty.js';
12
+ import scopeColumnRefs from './scope-column-refs.js';
13
+ import scopeShape from './scope-shape.js';
14
+ import stateUniqueName from './state-unique-name.js';
15
+ import stateUnknownSection from './state-unknown-section.js';
16
+ import typeDiscriminator from './type-discriminator.js';
17
+ export const ALL_RULES = [
18
+ stateUnknownSection,
19
+ stateUniqueName,
20
+ layoutNonEmpty,
21
+ layoutCurrentExists,
22
+ typeDiscriminator,
23
+ layoutColumnRefs,
24
+ scopeShape,
25
+ scopeColumnRefs,
26
+ columnIdExists,
27
+ dashboardToolbarNames,
28
+ dashboardModuleNames,
29
+ calculatedSettings,
30
+ aqlLegacyShape,
31
+ aqlMissing,
32
+ aqlSyntax,
33
+ formatColumnPivotDisplayFormat,
34
+ ];
35
+ export const RULE_IDS = ALL_RULES.map((rule) => rule.id);
36
+ /** Runs every applicable rule; positions come from the extractor's line map when present */
37
+ export function runRules(ctx, lineMap) {
38
+ const issues = [];
39
+ const applied = [];
40
+ const skipped = [];
41
+ for (const rule of ALL_RULES) {
42
+ if (rule.appliesTo && !rule.appliesTo(ctx)) {
43
+ skipped.push(rule.id);
44
+ continue;
45
+ }
46
+ applied.push(rule.id);
47
+ for (const found of rule.check(ctx)) {
48
+ const issue = { code: rule.id, severity: found.severity, path: found.path, message: found.message, docs: rule.docs };
49
+ if (found.fix) {
50
+ issue.fix = found.fix;
51
+ }
52
+ const entry = lineMap?.[found.path];
53
+ const position = (found.at === 'key' ? entry?.key : undefined) ?? entry?.value ?? nearestPosition(lineMap, found.path);
54
+ if (position) {
55
+ issue.file = position.file;
56
+ issue.line = position.line;
57
+ issue.column = position.column;
58
+ }
59
+ issues.push(issue);
60
+ }
61
+ }
62
+ return { issues, applied, skipped };
63
+ }
64
+ /** A rule may point at a path the value does not have (a missing property): fall back to the nearest ancestor */
65
+ function nearestPosition(lineMap, path) {
66
+ if (!lineMap) {
67
+ return undefined;
68
+ }
69
+ let current = path;
70
+ while (current) {
71
+ const entry = lineMap[current];
72
+ if (entry) {
73
+ return entry.value;
74
+ }
75
+ const cut = Math.max(current.lastIndexOf('.'), current.lastIndexOf('['));
76
+ current = cut > 0 ? current.slice(0, cut) : '';
77
+ }
78
+ return lineMap['']?.value;
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/state/rules/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { caseMatch, knownColumn } from '../columns.js';
2
+ import { asArray, isObj } from '../expressions.js';
3
+ import { defineRule } from './rule.js';
4
+ function layoutColumnRefs(layout) {
5
+ const refs = [];
6
+ for (const key of ['TableColumns', 'PivotColumns', 'RowGroupedColumns', 'PivotGroupedColumns']) {
7
+ for (const id of asArray(layout[key])) {
8
+ if (typeof id === 'string') {
9
+ refs.push({ key, columnId: id });
10
+ }
11
+ }
12
+ }
13
+ for (const key of ['ColumnSorts', 'ColumnFilters', 'TableAggregationColumns', 'PivotAggregationColumns']) {
14
+ for (const item of asArray(layout[key])) {
15
+ if (isObj(item) && typeof item.ColumnId === 'string') {
16
+ refs.push({ key, columnId: item.ColumnId });
17
+ }
18
+ }
19
+ }
20
+ for (const key of ['ColumnSizing', 'ColumnPinning', 'ColumnVisibility', 'ColumnHeaders']) {
21
+ if (isObj(layout[key])) {
22
+ for (const id of Object.keys(layout[key])) {
23
+ refs.push({ key, columnId: id });
24
+ }
25
+ }
26
+ }
27
+ return refs;
28
+ }
29
+ /** Every column a Layout names exists in the effective column universe */
30
+ export default defineRule({
31
+ id: 'layout/column-refs',
32
+ docs: 'handbook-layouts',
33
+ appliesTo: ({ columns }) => !!columns,
34
+ check({ state, columns }) {
35
+ const issues = [];
36
+ asArray(isObj(state.Layout) ? state.Layout.Layouts : undefined).forEach((layout, i) => {
37
+ if (!isObj(layout)) {
38
+ return;
39
+ }
40
+ const reported = new Set();
41
+ for (const { key, columnId } of layoutColumnRefs(layout)) {
42
+ if (knownColumn(columns, columnId) || reported.has(columnId)) {
43
+ continue;
44
+ }
45
+ reported.add(columnId);
46
+ const cased = caseMatch(columns, columnId);
47
+ issues.push({
48
+ path: `Layout.Layouts[${i}].${key}`,
49
+ severity: 'error',
50
+ message: `Column "${columnId}" is not in the grid's columns (${columns.source}).`,
51
+ fix: cased
52
+ ? `Use "${cased}" — column ids are case-sensitive.`
53
+ : 'Use a column id from columnDefs (`colId`, else `field`), a Calculated / FreeText Column id, or an Action Column id; add the column if it should exist.',
54
+ });
55
+ }
56
+ });
57
+ return issues;
58
+ },
59
+ });
60
+ //# sourceMappingURL=layout-column-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-column-refs.js","sourceRoot":"","sources":["../../../../src/core/state/rules/layout-column-refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { asArray, isObj } from '../expressions.js';
2
+ import { quote } from './helpers.js';
3
+ import { defineRule } from './rule.js';
4
+ /** `Layout.CurrentLayout` names one of the Layouts */
5
+ export default defineRule({
6
+ id: 'layout/current-exists',
7
+ docs: 'handbook-layouts',
8
+ check({ state }) {
9
+ const layoutState = isObj(state.Layout) ? state.Layout : undefined;
10
+ const current = layoutState?.CurrentLayout;
11
+ const names = asArray(layoutState?.Layouts)
12
+ .map((layout) => (isObj(layout) && typeof layout.Name === 'string' ? layout.Name : undefined))
13
+ .filter((name) => !!name);
14
+ if (typeof current !== 'string' || !names.length || names.includes(current)) {
15
+ return [];
16
+ }
17
+ return [
18
+ {
19
+ path: 'Layout.CurrentLayout',
20
+ severity: 'error',
21
+ message: `CurrentLayout "${current}" does not match any Layout Name (${quote(names)}).`,
22
+ fix: `Set \`CurrentLayout\` to one of ${quote(names)}, or rename that Layout to "${current}".`,
23
+ },
24
+ ];
25
+ },
26
+ });
27
+ //# sourceMappingURL=layout-current-exists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-current-exists.js","sourceRoot":"","sources":["../../../../src/core/state/rules/layout-current-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,sDAAsD;AACtD,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,uBAAuB;IAC3B,IAAI,EAAE,kBAAkB;IACxB,KAAK,CAAC,EAAE,KAAK,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,MAAM,OAAO,GAAG,WAAW,EAAE,aAAa,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;aACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aAC7F,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,kBAAkB,OAAO,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI;gBACvF,GAAG,EAAE,mCAAmC,KAAK,CAAC,KAAK,CAAC,+BAA+B,OAAO,IAAI;aAC/F;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { asArray, isObj } from '../expressions.js';
2
+ import { defineRule } from './rule.js';
3
+ /**
4
+ * Initial State must include a Layout unless `layoutOptions.autoCreateLayout` creates
5
+ * one: an error when the Options literal is visible and does not set it, a warning
6
+ * naming the option when no Options literal is visible (plan §8.4).
7
+ */
8
+ export default defineRule({
9
+ id: 'layout/non-empty',
10
+ docs: 'handbook-layouts',
11
+ check({ state, options }) {
12
+ const layouts = asArray(isObj(state.Layout) ? state.Layout.Layouts : undefined);
13
+ if (layouts.length) {
14
+ return [];
15
+ }
16
+ const layoutOptions = options && isObj(options.layoutOptions) ? options.layoutOptions : undefined;
17
+ if (options && layoutOptions?.autoCreateLayout) {
18
+ return [];
19
+ }
20
+ return [
21
+ {
22
+ path: 'Layout.Layouts',
23
+ severity: options ? 'error' : 'warning',
24
+ message: options
25
+ ? 'No Layouts, and `layoutOptions.autoCreateLayout` is not set in the Adaptable Options: the grid would start without a Layout.'
26
+ : 'No Layouts: Initial State must include at least one Layout unless `layoutOptions.autoCreateLayout` is set (the Adaptable Options were not visible to this check).',
27
+ fix: 'Add `Layout: { Layouts: [{ Name: "Default", TableColumns: [/* column ids */] }] }`, or set `layoutOptions: { autoCreateLayout: true }` in the Adaptable Options.',
28
+ },
29
+ ];
30
+ },
31
+ });
32
+ //# sourceMappingURL=layout-non-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-non-empty.js","sourceRoot":"","sources":["../../../../src/core/state/rules/layout-non-empty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;;GAIG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;IACxB,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,aAAa,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,IAAI,OAAO,IAAI,aAAa,EAAE,gBAAgB,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACvC,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC,8HAA8H;oBAChI,CAAC,CAAC,mKAAmK;gBACvK,GAAG,EAAE,kKAAkK;aACxK;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const defineRule = (rule) => rule;
2
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../../src/core/state/rules/rule.ts"],"names":[],"mappings":"AAsDA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAQ,EAAE,CAAC,IAAI,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { caseMatch, knownColumn } from '../columns.js';
2
+ import { isObj } from '../expressions.js';
3
+ import { eachListItem, strings } from './helpers.js';
4
+ import { defineRule } from './rule.js';
5
+ /** Every `Scope.ColumnIds` entry exists in the effective column universe, with the exact fix for a case mismatch */
6
+ export default defineRule({
7
+ id: 'scope/column-refs',
8
+ docs: 'dev-guide-columns-scope',
9
+ appliesTo: ({ columns }) => !!columns,
10
+ check({ state, columns }) {
11
+ const issues = [];
12
+ eachListItem(state, (_section, _list, item, path) => {
13
+ if (!isObj(item.Scope)) {
14
+ return;
15
+ }
16
+ strings(item.Scope.ColumnIds).forEach((columnId, i) => {
17
+ if (knownColumn(columns, columnId)) {
18
+ return;
19
+ }
20
+ const cased = caseMatch(columns, columnId);
21
+ issues.push({
22
+ path: `${path}.Scope.ColumnIds[${i}]`,
23
+ severity: 'error',
24
+ message: `Column "${columnId}" is not in the grid's columns (${columns.source}).`,
25
+ fix: cased ? `Use "${cased}" — column ids are case-sensitive.` : 'Use a column id from columnDefs (`colId`, else `field`) or a column the State defines.',
26
+ });
27
+ });
28
+ });
29
+ return issues;
30
+ },
31
+ });
32
+ //# sourceMappingURL=scope-column-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-column-refs.js","sourceRoot":"","sources":["../../../../src/core/state/rules/scope-column-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD,oHAAoH;AACpH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,yBAAyB;IAC/B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;IACrC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;QACtB,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBACpD,IAAI,WAAW,CAAC,OAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,GAAG,IAAI,oBAAoB,CAAC,GAAG;oBACrC,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,WAAW,QAAQ,mCAAmC,OAAQ,CAAC,MAAM,IAAI;oBAClF,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,oCAAoC,CAAC,CAAC,CAAC,wFAAwF;iBAC1J,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { isObj } from '../expressions.js';
2
+ import { eachListItem, quote } from './helpers.js';
3
+ import { defineRule } from './rule.js';
4
+ const SCOPE_KEYS = ['All', 'ColumnIds', 'DataTypes', 'ColumnTypes'];
5
+ /** A `Scope` is exactly one of `{ All: true }`, `{ ColumnIds }`, `{ DataTypes }`, `{ ColumnTypes }`, with a non-empty list */
6
+ export default defineRule({
7
+ id: 'scope/shape',
8
+ docs: 'dev-guide-columns-scope',
9
+ check({ state }) {
10
+ const issues = [];
11
+ eachListItem(state, (_section, _list, item, path) => {
12
+ if (!isObj(item.Scope)) {
13
+ return;
14
+ }
15
+ const scope = item.Scope;
16
+ const scopePath = `${path}.Scope`;
17
+ // a mis-cased key (`columnIds`) is the common slip: report it at the key with the exact fix
18
+ let miscased = false;
19
+ for (const key of Object.keys(scope)) {
20
+ const proper = SCOPE_KEYS.find((k) => k !== key && k.toLowerCase() === key.toLowerCase());
21
+ if (proper) {
22
+ miscased = true;
23
+ issues.push({
24
+ path: `${scopePath}.${key}`,
25
+ severity: 'error',
26
+ at: 'key',
27
+ message: `Scope key \`${key}\` is not recognised; Scope keys are case-sensitive.`,
28
+ fix: `Rename \`${key}\` to \`${proper}\`.`,
29
+ });
30
+ }
31
+ }
32
+ if (miscased) {
33
+ return;
34
+ }
35
+ const present = SCOPE_KEYS.filter((key) => scope[key] !== undefined);
36
+ if (present.length !== 1) {
37
+ issues.push({
38
+ path: scopePath,
39
+ severity: 'error',
40
+ message: present.length
41
+ ? `Scope has ${quote(present)}; it must be exactly one of ${quote(SCOPE_KEYS)}.`
42
+ : `Scope is empty; it must be one of \`{ All: true }\`, \`{ ColumnIds: [...] }\`, \`{ DataTypes: [...] }\` or \`{ ColumnTypes: [...] }\`.`,
43
+ });
44
+ return;
45
+ }
46
+ const [key] = present;
47
+ if (key === 'All' && scope.All !== true) {
48
+ issues.push({ path: `${scopePath}.All`, severity: 'error', message: '`Scope.All` must be `true`.' });
49
+ }
50
+ else if (key !== 'All' && (!Array.isArray(scope[key]) || !scope[key].length)) {
51
+ issues.push({
52
+ path: `${scopePath}.${key}`,
53
+ severity: 'error',
54
+ message: `\`Scope.${key}\` must be a non-empty array${key === 'DataTypes' ? " of 'text' | 'number' | 'boolean' | 'date' | 'textArray' | 'numberArray'" : ''}.`,
55
+ });
56
+ }
57
+ });
58
+ return issues;
59
+ },
60
+ });
61
+ //# sourceMappingURL=scope-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-shape.js","sourceRoot":"","sources":["../../../../src/core/state/rules/scope-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { eachListItem } from './helpers.js';
2
+ import { defineRule } from './rule.js';
3
+ /** Lists whose `Name` is an identifier (referenced elsewhere, or the key the UI selects by) */
4
+ const NAMED_LISTS = new Set(['Layout.Layouts', 'NamedQuery.NamedQueries', 'Export.Reports', 'Dashboard.Tabs', 'Theme.UserThemes']);
5
+ /** Lists whose `ColumnId` defines a column */
6
+ const COLUMN_LISTS = new Set(['CalculatedColumn.CalculatedColumns', 'FreeTextColumn.FreeTextColumns']);
7
+ /** Identifying names are unique within their list: Layouts, Named Queries, Reports, Dashboard Tabs, Themes; Calculated / FreeText Column ids */
8
+ export default defineRule({
9
+ id: 'state/unique-name',
10
+ docs: 'dev-guide-adaptable-state-initial-state',
11
+ check({ state }) {
12
+ const issues = [];
13
+ const seen = new Map();
14
+ eachListItem(state, (section, list, item, path, index) => {
15
+ const id = `${section}.${list}`;
16
+ const key = COLUMN_LISTS.has(id) ? 'ColumnId' : NAMED_LISTS.has(id) ? 'Name' : undefined;
17
+ if (!key) {
18
+ return;
19
+ }
20
+ const value = item[key];
21
+ if (typeof value !== 'string' || !value) {
22
+ return;
23
+ }
24
+ const seenKey = `${id}:${value}`;
25
+ const first = seen.get(seenKey);
26
+ if (first !== undefined) {
27
+ issues.push({
28
+ path: `${path}.${key}`,
29
+ severity: 'error',
30
+ message: `Duplicate ${key} "${value}" (also ${section}.${list}[${first}]); ${key}s must be unique within ${list}.`,
31
+ });
32
+ }
33
+ else {
34
+ seen.set(seenKey, index);
35
+ }
36
+ });
37
+ return issues;
38
+ },
39
+ });
40
+ //# sourceMappingURL=state-unique-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-unique-name.js","sourceRoot":"","sources":["../../../../src/core/state/rules/state-unique-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD,+FAA+F;AAC/F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AACnI,8CAA8C;AAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,oCAAoC,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAEvG,gJAAgJ;AAChJ,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,yCAAyC;IAC/C,KAAK,CAAC,EAAE,KAAK,EAAE;QACb,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACvD,MAAM,EAAE,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACzF,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;oBACtB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,aAAa,GAAG,KAAK,KAAK,WAAW,OAAO,IAAI,IAAI,IAAI,KAAK,OAAO,GAAG,2BAA2B,IAAI,GAAG;iBACnH,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { defineRule } from './rule.js';
2
+ /**
3
+ * Root keys that are not State sections of the checked major; `PredefinedConfig` is the
4
+ * common pre-24 mistake. A persisted State is judged against `AdaptablePersistentState`,
5
+ * which has sections the runtime alone writes (`TeamSharing`).
6
+ */
7
+ export default defineRule({
8
+ id: 'state/unknown-section',
9
+ docs: 'dev-guide-adaptable-state-initial-state',
10
+ check({ state, kind, names }) {
11
+ const known = new Set(kind === 'persistent' ? names.persistentStateKeys : names.initialStateKeys);
12
+ return Object.keys(state)
13
+ .filter((key) => !known.has(key))
14
+ .map((key) => key === 'PredefinedConfig'
15
+ ? {
16
+ path: key,
17
+ severity: 'error',
18
+ at: 'key',
19
+ message: '`PredefinedConfig` is not part of Adaptable State: put its contents directly in `initialState`.',
20
+ fix: 'Move the sections inside `PredefinedConfig` up one level and remove the wrapper.',
21
+ }
22
+ : {
23
+ path: key,
24
+ severity: 'warning',
25
+ at: 'key',
26
+ message: `\`${key}\` is not ${kind === 'persistent' ? 'a persisted' : 'an Initial'} State section; AdapTable ignores it. It may be an Adaptable Option.`,
27
+ });
28
+ },
29
+ });
30
+ //# sourceMappingURL=state-unknown-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-unknown-section.js","sourceRoot":"","sources":["../../../../src/core/state/rules/state-unknown-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;;GAIG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,uBAAuB;IAC3B,IAAI,EAAE,yCAAyC;IAC/C,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAClG,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACtB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACX,GAAG,KAAK,kBAAkB;YACxB,CAAC,CAAC;gBACE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,OAAgB;gBAC1B,EAAE,EAAE,KAAc;gBAClB,OAAO,EAAE,iGAAiG;gBAC1G,GAAG,EAAE,kFAAkF;aACxF;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,SAAkB;gBAC5B,EAAE,EAAE,KAAc;gBAClB,OAAO,EAAE,KAAK,GAAG,aAAa,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,sEAAsE;aACzJ,CACN,CAAC;IACN,CAAC;CACF,CAAC,CAAC"}