@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.
- package/README.md +58 -61
- package/data/changes/21-22.json +542 -0
- package/data/changes/22-23.json +639 -0
- package/data/changes/23-24.json +1874 -0
- package/data/manifest.snapshot.json +202 -0
- package/data/templates/angular/src/app/adaptableOptions.ts +40 -0
- package/data/templates/angular/src/app/agGridModules.ts +7 -0
- package/data/templates/angular/src/app/app.component.ts +66 -0
- package/data/templates/angular/src/app/app.module.ts +14 -0
- package/data/templates/angular/src/app/columnDefs.ts +121 -0
- package/data/templates/angular/src/app/gridOptions.ts +32 -0
- package/data/templates/angular/src/app/onAdaptableReady.ts +11 -0
- package/data/templates/angular/src/app/rowData.ts +851 -0
- package/data/templates/angular/src/app/styles.css +50 -0
- package/data/templates/angular/src/index.html +17 -0
- package/data/templates/angular/src/main.ts +18 -0
- package/data/templates/angular/src/polyfills.ts +1 -0
- package/data/templates/angular/tsconfig.json +16 -0
- package/data/templates/manifest.json +406 -0
- package/data/templates/react/src/App.tsx +71 -0
- package/data/templates/react/src/adaptableOptions.ts +40 -0
- package/data/templates/react/src/agGridModules.ts +7 -0
- package/data/templates/react/src/columnDefs.ts +121 -0
- package/data/templates/react/src/gridOptions.ts +32 -0
- package/data/templates/react/src/index.tsx +8 -0
- package/data/templates/react/src/onAdaptableReady.ts +11 -0
- package/data/templates/react/src/rowData.ts +851 -0
- package/data/templates/react/src/styles.css +50 -0
- package/data/templates/react/tsconfig.json +9 -0
- package/data/templates/vanilla/index.html +18 -0
- package/data/templates/vanilla/src/adaptableOptions.ts +40 -0
- package/data/templates/vanilla/src/agGridModules.ts +7 -0
- package/data/templates/vanilla/src/columnDefs.ts +121 -0
- package/data/templates/vanilla/src/gridOptions.ts +32 -0
- package/data/templates/vanilla/src/index.ts +41 -0
- package/data/templates/vanilla/src/onAdaptableReady.ts +11 -0
- package/data/templates/vanilla/src/rowData.ts +851 -0
- package/data/templates/vanilla/src/styles.css +50 -0
- package/data/templates/vanilla/tsconfig.json +14 -0
- package/data/templates/vue/.babelrc +3 -0
- package/data/templates/vue/public/index.html +19 -0
- package/data/templates/vue/src/App.vue +35 -0
- package/data/templates/vue/src/adaptableOptions.ts +40 -0
- package/data/templates/vue/src/agGridModules.ts +7 -0
- package/data/templates/vue/src/columnDefs.ts +121 -0
- package/data/templates/vue/src/gridOptions.ts +32 -0
- package/data/templates/vue/src/main.ts +6 -0
- package/data/templates/vue/src/onAdaptableReady.ts +11 -0
- package/data/templates/vue/src/rowData.ts +851 -0
- package/data/templates/vue/src/shims-vue.d.ts +6 -0
- package/data/templates/vue/src/styles.css +50 -0
- package/data/templates/vue/tsconfig.json +30 -0
- package/dist/bin.js +23 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/build-commands.js +200 -0
- package/dist/cli/build-commands.js.map +1 -0
- package/dist/cli/index.js +94 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/render.js +57 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/core/anonymise/anonymise.js +315 -0
- package/dist/core/anonymise/anonymise.js.map +1 -0
- package/dist/core/anonymise/capabilities.js +94 -0
- package/dist/core/anonymise/capabilities.js.map +1 -0
- package/dist/core/aql/capabilities.js +339 -0
- package/dist/core/aql/capabilities.js.map +1 -0
- package/dist/core/aql/check.js +204 -0
- package/dist/core/aql/check.js.map +1 -0
- package/dist/core/aql/engine.js +92 -0
- package/dist/core/aql/engine.js.map +1 -0
- package/dist/core/aql/functions.js +108 -0
- package/dist/core/aql/functions.js.map +1 -0
- package/dist/core/aql/migrate.js +62 -0
- package/dist/core/aql/migrate.js.map +1 -0
- package/dist/core/capabilities.js +105 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/changes/capabilities.js +92 -0
- package/dist/core/changes/capabilities.js.map +1 -0
- package/dist/core/changes/changes.js +101 -0
- package/dist/core/changes/changes.js.map +1 -0
- package/dist/core/changes/grep.js +183 -0
- package/dist/core/changes/grep.js.map +1 -0
- package/dist/core/changes/records.js +172 -0
- package/dist/core/changes/records.js.map +1 -0
- package/dist/core/changes/render-md.js +101 -0
- package/dist/core/changes/render-md.js.map +1 -0
- package/dist/core/changes/with-docs.js +86 -0
- package/dist/core/changes/with-docs.js.map +1 -0
- package/dist/core/compat/capabilities.js +127 -0
- package/dist/core/compat/capabilities.js.map +1 -0
- package/dist/core/compat/manifest.js +203 -0
- package/dist/core/compat/manifest.js.map +1 -0
- package/dist/core/constants.js +38 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/context/capabilities.js +106 -0
- package/dist/core/context/capabilities.js.map +1 -0
- package/dist/core/context/detect.js +370 -0
- package/dist/core/context/detect.js.map +1 -0
- package/dist/core/context/projects.js +159 -0
- package/dist/core/context/projects.js.map +1 -0
- package/dist/core/context/resolve.js +85 -0
- package/dist/core/context/resolve.js.map +1 -0
- package/dist/core/convert/capabilities.js +86 -0
- package/dist/core/convert/capabilities.js.map +1 -0
- package/dist/core/convert/coldefs.js +313 -0
- package/dist/core/convert/coldefs.js.map +1 -0
- package/dist/core/docs/areas.js +22 -0
- package/dist/core/docs/areas.js.map +1 -0
- package/dist/core/docs/cache.js +133 -0
- package/dist/core/docs/cache.js.map +1 -0
- package/dist/core/docs/capabilities.js +377 -0
- package/dist/core/docs/capabilities.js.map +1 -0
- package/dist/core/docs/corpus.js.map +1 -0
- package/dist/core/docs/demos.js +105 -0
- package/dist/core/docs/demos.js.map +1 -0
- package/dist/core/docs/get-page.js +182 -0
- package/dist/core/docs/get-page.js.map +1 -0
- package/dist/core/docs/hosts.js +74 -0
- package/dist/core/docs/hosts.js.map +1 -0
- package/dist/core/docs/search.js.map +1 -0
- package/dist/core/envelope.js +79 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/extract/imports.js +163 -0
- package/dist/core/extract/imports.js.map +1 -0
- package/dist/core/extract/input.js +140 -0
- package/dist/core/extract/input.js.map +1 -0
- package/dist/core/extract/line-map.js +90 -0
- package/dist/core/extract/line-map.js.map +1 -0
- package/dist/core/extract/ts-literal.js +963 -0
- package/dist/core/extract/ts-literal.js.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/migrate/capabilities.js +143 -0
- package/dist/core/migrate/capabilities.js.map +1 -0
- package/dist/core/migrate/leftovers.js +119 -0
- package/dist/core/migrate/leftovers.js.map +1 -0
- package/dist/core/migrate/state.js +295 -0
- package/dist/core/migrate/state.js.map +1 -0
- package/dist/core/packages/cache.js +139 -0
- package/dist/core/packages/cache.js.map +1 -0
- package/dist/core/packages/capabilities.js +95 -0
- package/dist/core/packages/capabilities.js.map +1 -0
- package/dist/{adaptable/types.js → core/packages/entry-types.js} +1 -1
- package/dist/core/packages/entry-types.js.map +1 -0
- package/dist/core/packages/exec.js +37 -0
- package/dist/core/packages/exec.js.map +1 -0
- package/dist/core/packages/load-entry.js +123 -0
- package/dist/core/packages/load-entry.js.map +1 -0
- package/dist/core/packages/prepare.js +122 -0
- package/dist/core/packages/prepare.js.map +1 -0
- package/dist/core/packages/registry.js +75 -0
- package/dist/core/packages/registry.js.map +1 -0
- package/dist/core/packages/resolve.js +94 -0
- package/dist/core/packages/resolve.js.map +1 -0
- package/dist/core/packages/versions.js +71 -0
- package/dist/core/packages/versions.js.map +1 -0
- package/dist/core/ping.js +22 -0
- package/dist/core/ping.js.map +1 -0
- package/dist/core/register.js +18 -0
- package/dist/core/register.js.map +1 -0
- package/dist/core/scaffold/capabilities.js +434 -0
- package/dist/core/scaffold/capabilities.js.map +1 -0
- package/dist/core/scaffold/generate.js +409 -0
- package/dist/core/scaffold/generate.js.map +1 -0
- package/dist/core/scaffold/infer.js +441 -0
- package/dist/core/scaffold/infer.js.map +1 -0
- package/dist/core/scaffold/overlay.js +290 -0
- package/dist/core/scaffold/overlay.js.map +1 -0
- package/dist/core/scaffold/readers/csv.js +146 -0
- package/dist/core/scaffold/readers/csv.js.map +1 -0
- package/dist/core/scaffold/readers/dataset.js +53 -0
- package/dist/core/scaffold/readers/dataset.js.map +1 -0
- package/dist/core/scaffold/readers/index.js +62 -0
- package/dist/core/scaffold/readers/index.js.map +1 -0
- package/dist/core/scaffold/readers/json.js +101 -0
- package/dist/core/scaffold/readers/json.js.map +1 -0
- package/dist/core/scaffold/readers/xlsx.js +81 -0
- package/dist/core/scaffold/readers/xlsx.js.map +1 -0
- package/dist/core/scaffold/suggestions.js +57 -0
- package/dist/core/scaffold/suggestions.js.map +1 -0
- package/dist/core/scaffold/templates.js +59 -0
- package/dist/core/scaffold/templates.js.map +1 -0
- package/dist/core/setup/audit.js +91 -0
- package/dist/core/setup/audit.js.map +1 -0
- package/dist/core/setup/capabilities.js +80 -0
- package/dist/core/setup/capabilities.js.map +1 -0
- package/dist/core/setup/context.js +118 -0
- package/dist/core/setup/context.js.map +1 -0
- package/dist/core/setup/rules/cell-data-type.js +40 -0
- package/dist/core/setup/rules/cell-data-type.js.map +1 -0
- package/dist/core/setup/rules/coldef-ownership.js +67 -0
- package/dist/core/setup/rules/coldef-ownership.js.map +1 -0
- package/dist/core/setup/rules/css-import.js +34 -0
- package/dist/core/setup/rules/css-import.js.map +1 -0
- package/dist/core/setup/rules/direct-grid.js +42 -0
- package/dist/core/setup/rules/direct-grid.js.map +1 -0
- package/dist/core/setup/rules/index.js +53 -0
- package/dist/core/setup/rules/index.js.map +1 -0
- package/dist/core/setup/rules/licence-literal.js +23 -0
- package/dist/core/setup/rules/licence-literal.js.map +1 -0
- package/dist/core/setup/rules/modules.js +86 -0
- package/dist/core/setup/rules/modules.js.map +1 -0
- package/dist/core/setup/rules/react-stable-refs.js +20 -0
- package/dist/core/setup/rules/react-stable-refs.js.map +1 -0
- package/dist/core/setup/rules/ready-hook.js +33 -0
- package/dist/core/setup/rules/ready-hook.js.map +1 -0
- package/dist/core/setup/rules/required-options.js +43 -0
- package/dist/core/setup/rules/required-options.js.map +1 -0
- package/dist/core/setup/rules/rule.js +10 -0
- package/dist/core/setup/rules/rule.js.map +1 -0
- package/dist/core/setup/rules/version-skew.js +65 -0
- package/dist/core/setup/rules/version-skew.js.map +1 -0
- package/dist/core/state/capabilities.js +78 -0
- package/dist/core/state/capabilities.js.map +1 -0
- package/dist/core/state/check.js +216 -0
- package/dist/core/state/check.js.map +1 -0
- package/dist/core/state/columns.js +130 -0
- package/dist/core/state/columns.js.map +1 -0
- package/dist/core/state/did-you-mean.js +83 -0
- package/dist/core/state/did-you-mean.js.map +1 -0
- package/dist/core/state/expressions.js +170 -0
- package/dist/core/state/expressions.js.map +1 -0
- package/dist/core/state/known-names.js +96 -0
- package/dist/core/state/known-names.js.map +1 -0
- package/dist/core/state/rules/aql-legacy-shape.js +42 -0
- package/dist/core/state/rules/aql-legacy-shape.js.map +1 -0
- package/dist/core/state/rules/aql-missing.js +21 -0
- package/dist/core/state/rules/aql-missing.js.map +1 -0
- package/dist/core/state/rules/aql-syntax.js +77 -0
- package/dist/core/state/rules/aql-syntax.js.map +1 -0
- package/dist/core/state/rules/calculated-settings.js +23 -0
- package/dist/core/state/rules/calculated-settings.js.map +1 -0
- package/dist/core/state/rules/column-id-exists.js +29 -0
- package/dist/core/state/rules/column-id-exists.js.map +1 -0
- package/dist/core/state/rules/dashboard-module-names.js +31 -0
- package/dist/core/state/rules/dashboard-module-names.js.map +1 -0
- package/dist/core/state/rules/dashboard-toolbar-names.js +48 -0
- package/dist/core/state/rules/dashboard-toolbar-names.js.map +1 -0
- package/dist/core/state/rules/format-column-pivot-display-format.js +43 -0
- package/dist/core/state/rules/format-column-pivot-display-format.js.map +1 -0
- package/dist/core/state/rules/helpers.js +39 -0
- package/dist/core/state/rules/helpers.js.map +1 -0
- package/dist/core/state/rules/index.js +80 -0
- package/dist/core/state/rules/index.js.map +1 -0
- package/dist/core/state/rules/layout-column-refs.js +60 -0
- package/dist/core/state/rules/layout-column-refs.js.map +1 -0
- package/dist/core/state/rules/layout-current-exists.js +27 -0
- package/dist/core/state/rules/layout-current-exists.js.map +1 -0
- package/dist/core/state/rules/layout-non-empty.js +32 -0
- package/dist/core/state/rules/layout-non-empty.js.map +1 -0
- package/dist/core/state/rules/rule.js +2 -0
- package/dist/core/state/rules/rule.js.map +1 -0
- package/dist/core/state/rules/scope-column-refs.js +32 -0
- package/dist/core/state/rules/scope-column-refs.js.map +1 -0
- package/dist/core/state/rules/scope-shape.js +61 -0
- package/dist/core/state/rules/scope-shape.js.map +1 -0
- package/dist/core/state/rules/state-unique-name.js +40 -0
- package/dist/core/state/rules/state-unique-name.js.map +1 -0
- package/dist/core/state/rules/state-unknown-section.js +30 -0
- package/dist/core/state/rules/state-unknown-section.js.map +1 -0
- package/dist/core/state/rules/type-discriminator.js +70 -0
- package/dist/core/state/rules/type-discriminator.js.map +1 -0
- package/dist/core/state/type-check.js +408 -0
- package/dist/core/state/type-check.js.map +1 -0
- package/dist/mcp/index.js +109 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.js +110 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/skills/adaptable-debug/SKILL.md +145 -0
- package/dist/skills/adaptable-debug/VERSION.md +1 -0
- package/dist/skills/adaptable-debug/references/_shared/agents-snippet.md +3 -0
- package/dist/skills/adaptable-debug/references/_shared/capabilities.md +35 -0
- package/dist/skills/adaptable-debug/references/_shared/conversation.md +20 -0
- package/dist/skills/adaptable-debug/references/_shared/docs-protocol.md +36 -0
- package/dist/skills/adaptable-debug/references/_shared/grounding.md +54 -0
- package/dist/skills/adaptable-debug/references/_shared/guards.md +20 -0
- package/dist/skills/adaptable-debug/references/_shared/validation-loop.md +42 -0
- package/dist/skills/adaptable-debug/references/devtools-api.md +36 -0
- package/dist/skills/adaptable-debug/references/feedback-template.md +36 -0
- package/dist/skills/adaptable-debug/references/symptoms.md +37 -0
- package/dist/skills/adaptable-debug/references/ticket-template.md +50 -0
- package/dist/skills/adaptable-dev/SKILL.md +97 -0
- package/dist/skills/adaptable-dev/VERSION.md +1 -0
- package/dist/skills/adaptable-dev/references/_shared/agents-snippet.md +3 -0
- package/dist/skills/adaptable-dev/references/_shared/capabilities.md +35 -0
- package/dist/skills/adaptable-dev/references/_shared/conversation.md +20 -0
- package/dist/skills/adaptable-dev/references/_shared/docs-protocol.md +36 -0
- package/dist/skills/adaptable-dev/references/_shared/grounding.md +54 -0
- package/dist/skills/adaptable-dev/references/_shared/guards.md +20 -0
- package/dist/skills/adaptable-dev/references/_shared/validation-loop.md +42 -0
- package/dist/skills/adaptable-dev/references/recommendations.md +93 -0
- package/dist/skills/adaptable-setup/SKILL.md +158 -0
- package/dist/skills/adaptable-setup/VERSION.md +1 -0
- package/dist/skills/adaptable-setup/references/_shared/agents-snippet.md +3 -0
- package/dist/skills/adaptable-setup/references/_shared/capabilities.md +35 -0
- package/dist/skills/adaptable-setup/references/_shared/conversation.md +20 -0
- package/dist/skills/adaptable-setup/references/_shared/docs-protocol.md +36 -0
- package/dist/skills/adaptable-setup/references/_shared/grounding.md +54 -0
- package/dist/skills/adaptable-setup/references/_shared/guards.md +20 -0
- package/dist/skills/adaptable-setup/references/_shared/validation-loop.md +42 -0
- package/dist/skills/adaptable-setup/references/paths.md +45 -0
- package/dist/skills/adaptable-upgrade/SKILL.md +269 -0
- package/dist/skills/adaptable-upgrade/VERSION.md +1 -0
- package/dist/skills/adaptable-upgrade/references/_shared/agents-snippet.md +3 -0
- package/dist/skills/adaptable-upgrade/references/_shared/capabilities.md +35 -0
- package/dist/skills/adaptable-upgrade/references/_shared/conversation.md +20 -0
- package/dist/skills/adaptable-upgrade/references/_shared/docs-protocol.md +36 -0
- package/dist/skills/adaptable-upgrade/references/_shared/grounding.md +54 -0
- package/dist/skills/adaptable-upgrade/references/_shared/guards.md +20 -0
- package/dist/skills/adaptable-upgrade/references/_shared/validation-loop.md +42 -0
- package/dist/skills/adaptable-upgrade/references/apply-order.md +171 -0
- package/dist/skills/adaptable-upgrade/references/plan-preamble.md +151 -0
- package/dist/skills/adaptable-upgrade/scripts/adaptable.mjs +24 -0
- package/package.json +34 -13
- package/dist/adaptable/loadEntry.js +0 -94
- package/dist/adaptable/loadEntry.js.map +0 -1
- package/dist/adaptable/types.js.map +0 -1
- package/dist/cache.js +0 -11
- package/dist/cache.js.map +0 -1
- package/dist/checks/stateRules.js +0 -389
- package/dist/checks/stateRules.js.map +0 -1
- package/dist/checks/stateTypes.js +0 -142
- package/dist/checks/stateTypes.js.map +0 -1
- package/dist/context.js +0 -39
- package/dist/context.js.map +0 -1
- package/dist/docs/corpus.js.map +0 -1
- package/dist/docs/search.js.map +0 -1
- package/dist/docs/source.js +0 -151
- package/dist/docs/source.js.map +0 -1
- package/dist/environment.js +0 -181
- package/dist/environment.js.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/prompts.js +0 -84
- package/dist/prompts.js.map +0 -1
- package/dist/resources.js +0 -59
- package/dist/resources.js.map +0 -1
- package/dist/server.js +0 -23
- package/dist/server.js.map +0 -1
- package/dist/tools/checks.js +0 -250
- package/dist/tools/checks.js.map +0 -1
- package/dist/tools/docs.js +0 -173
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/environment.js +0 -52
- package/dist/tools/environment.js.map +0 -1
- package/skills/adaptable-dev/SKILL.md +0 -42
- /package/dist/{docs → core/docs}/corpus.js +0 -0
- /package/dist/{docs → core/docs}/search.js +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { asArray, isObj } from '../expressions.js';
|
|
2
|
+
import { defineRule } from './rule.js';
|
|
3
|
+
const TABLE_ONLY_KEYS = ['TableColumns', 'TableAggregationColumns', 'RowGroupedColumns'];
|
|
4
|
+
const PIVOT_ONLY_KEYS = ['PivotColumns', 'PivotAggregationColumns', 'PivotGroupedColumns', 'PivotExpandLevel'];
|
|
5
|
+
const PIVOT_FOR = {
|
|
6
|
+
RowGroupedColumns: 'PivotGroupedColumns',
|
|
7
|
+
TableAggregationColumns: 'PivotAggregationColumns',
|
|
8
|
+
TableColumns: 'PivotColumns',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Discriminated unions the compiler reports poorly: a Layout is a Table Layout
|
|
12
|
+
* (`TableColumns`) or a Pivot Layout (`PivotColumns`), and column sizing takes
|
|
13
|
+
* `Width` or `Flex`.
|
|
14
|
+
*/
|
|
15
|
+
export default defineRule({
|
|
16
|
+
id: 'type/discriminator',
|
|
17
|
+
docs: 'handbook-layouts',
|
|
18
|
+
check({ state }) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
asArray(isObj(state.Layout) ? state.Layout.Layouts : undefined).forEach((layout, i) => {
|
|
21
|
+
const path = `Layout.Layouts[${i}]`;
|
|
22
|
+
if (!isObj(layout)) {
|
|
23
|
+
issues.push({ path, severity: 'error', message: 'Layout must be an object.' });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const isTable = layout.TableColumns !== undefined;
|
|
27
|
+
const isPivot = layout.PivotColumns !== undefined;
|
|
28
|
+
if (isTable && isPivot) {
|
|
29
|
+
issues.push({
|
|
30
|
+
path,
|
|
31
|
+
severity: 'error',
|
|
32
|
+
message: 'A Layout is either a Table Layout (`TableColumns`) or a Pivot Layout (`PivotColumns`), not both.',
|
|
33
|
+
fix: 'Remove `PivotColumns` (and the other Pivot* properties) for a Table Layout, or `TableColumns` for a Pivot Layout.',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (!isTable && !isPivot) {
|
|
37
|
+
issues.push({
|
|
38
|
+
path,
|
|
39
|
+
severity: 'error',
|
|
40
|
+
message: 'Layout needs `TableColumns` (Table Layout) or `PivotColumns` (Pivot Layout; use [] to show only aggregations).',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
for (const key of (isTable ? PIVOT_ONLY_KEYS : TABLE_ONLY_KEYS).filter((k) => layout[k] !== undefined)) {
|
|
45
|
+
issues.push({
|
|
46
|
+
path: `${path}.${key}`,
|
|
47
|
+
severity: 'error',
|
|
48
|
+
at: 'key',
|
|
49
|
+
message: isTable
|
|
50
|
+
? `\`${key}\` belongs to Pivot Layouts; this is a Table Layout.`
|
|
51
|
+
: `\`${key}\` belongs to Table Layouts; in Pivot Layouts use \`${PIVOT_FOR[key]}\`.`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (isObj(layout.ColumnSizing)) {
|
|
56
|
+
for (const [columnId, sizing] of Object.entries(layout.ColumnSizing)) {
|
|
57
|
+
if (isObj(sizing) && sizing.Width !== undefined && sizing.Flex !== undefined) {
|
|
58
|
+
issues.push({
|
|
59
|
+
path: `${path}.ColumnSizing.${columnId}`,
|
|
60
|
+
severity: 'error',
|
|
61
|
+
message: 'Column sizing takes `Width` or `Flex`, not both.',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return issues;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=type-discriminator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-discriminator.js","sourceRoot":"","sources":["../../../../src/core/state/rules/type-discriminator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,yBAAyB,EAAE,mBAAmB,CAAC,CAAC;AACzF,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;AAC/G,MAAM,SAAS,GAA2B;IACxC,iBAAiB,EAAE,qBAAqB;IACxC,uBAAuB,EAAE,yBAAyB;IAClD,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF;;;;GAIG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,kBAAkB;IACxB,KAAK,CAAC,EAAE,KAAK,EAAE;QACb,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpF,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC;YAClD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC;YAClD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,kGAAkG;oBAC3G,GAAG,EAAE,mHAAmH;iBACzH,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,gHAAgH;iBAC1H,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;oBACvG,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;wBACtB,QAAQ,EAAE,OAAO;wBACjB,EAAE,EAAE,KAAK;wBACT,OAAO,EAAE,OAAO;4BACd,CAAC,CAAC,KAAK,GAAG,sDAAsD;4BAChE,CAAC,CAAC,KAAK,GAAG,uDAAuD,SAAS,CAAC,GAAG,CAAC,KAAK;qBACvF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBACrE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC7E,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,GAAG,IAAI,iBAAiB,QAAQ,EAAE;4BACxC,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,kDAAkD;yBAC5D,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shape layer of `check state` and `check setup`'s `options-shape` (plan §8.4
|
|
3
|
+
* layer 1, §8.6): the extracted value is type-checked against `InitialState`,
|
|
4
|
+
* `AdaptablePersistentState` or `AdaptableOptions` from the `types` entry of
|
|
5
|
+
* the package for the *checked* major (plan §7.3 — the types package, resolved
|
|
6
|
+
* by the caller through `packages/resolve.ts`), the way the carried MCP did:
|
|
7
|
+
* a generated check file importing the type, compiled with the TypeScript
|
|
8
|
+
* compiler API, diagnostics mapped back to paths.
|
|
9
|
+
*
|
|
10
|
+
* Positions: the generated file's positions never reach the caller. Each
|
|
11
|
+
* diagnostic is mapped to a path in the same syntax the extractor's line map
|
|
12
|
+
* uses, and the line map (when the value came from a source file) gives the
|
|
13
|
+
* `{ file, line, column }` of that path — the key position for unknown keys,
|
|
14
|
+
* the value position otherwise. Diagnostics at or under an `unverifiable` path
|
|
15
|
+
* are dropped: the extractor stubbed those values as `null`, so the compiler's
|
|
16
|
+
* complaint there is about the stub, not the user's code.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, statSync } from 'node:fs';
|
|
19
|
+
import { createRequire } from 'node:module';
|
|
20
|
+
import { join, resolve } from 'node:path';
|
|
21
|
+
import { childPath } from '../extract/line-map.js';
|
|
22
|
+
import { describeSuggestions, suggestKeys } from './did-you-mean.js';
|
|
23
|
+
const CHECK_FILE = '__adaptable_mcp_shape_check__.ts';
|
|
24
|
+
let typescript;
|
|
25
|
+
const loadTypeScript = () => (typescript ??= import('typescript').then((m) => m.default));
|
|
26
|
+
/** Parsed declaration files, shared across calls and programs (AdapTable's types are large) */
|
|
27
|
+
const sourceFiles = new Map();
|
|
28
|
+
/** Last program per types location, reused as `oldProgram` (helps the long-lived MCP process) */
|
|
29
|
+
const programs = new Map();
|
|
30
|
+
const OPTIONS = {
|
|
31
|
+
strict: true,
|
|
32
|
+
noEmit: true,
|
|
33
|
+
skipLibCheck: true,
|
|
34
|
+
types: [],
|
|
35
|
+
};
|
|
36
|
+
/** `<dir>/types` when `types.d.ts` (package) or `types.ts` (source) exists there */
|
|
37
|
+
function typesModule(location) {
|
|
38
|
+
const file = join(location.dir, 'types');
|
|
39
|
+
const ext = location.kind === 'source' ? '.ts' : '.d.ts';
|
|
40
|
+
return existsSync(file + ext) ? file : undefined;
|
|
41
|
+
}
|
|
42
|
+
function agGridTypesResolve(dir) {
|
|
43
|
+
const require = createRequire(join(resolve(dir), 'package.json'));
|
|
44
|
+
return ['ag-grid-enterprise', 'ag-grid-community'].some((name) => {
|
|
45
|
+
try {
|
|
46
|
+
require.resolve(name);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A program over one generated file plus the types it imports. Declaration files are
|
|
56
|
+
* cached by mtime across calls; the previous program for the same types folder and
|
|
57
|
+
* root file is reused (helps the long-lived MCP process).
|
|
58
|
+
*/
|
|
59
|
+
function createProgramFor(ts, typesDir, rootFile, text) {
|
|
60
|
+
const host = ts.createCompilerHost(OPTIONS, true);
|
|
61
|
+
const getSourceFile = host.getSourceFile.bind(host);
|
|
62
|
+
host.getSourceFile = (fileName, languageVersion, onError) => {
|
|
63
|
+
if (fileName === rootFile) {
|
|
64
|
+
return ts.createSourceFile(fileName, text, languageVersion, true);
|
|
65
|
+
}
|
|
66
|
+
let mtime = 0;
|
|
67
|
+
try {
|
|
68
|
+
mtime = statSync(fileName).mtimeMs;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// missing files are reported by the compiler
|
|
72
|
+
}
|
|
73
|
+
const cached = sourceFiles.get(fileName);
|
|
74
|
+
if (cached && cached.mtime === mtime) {
|
|
75
|
+
return cached.file;
|
|
76
|
+
}
|
|
77
|
+
const file = getSourceFile(fileName, languageVersion, onError);
|
|
78
|
+
if (file) {
|
|
79
|
+
sourceFiles.set(fileName, { mtime, file });
|
|
80
|
+
}
|
|
81
|
+
return file;
|
|
82
|
+
};
|
|
83
|
+
const fileExists = host.fileExists.bind(host);
|
|
84
|
+
host.fileExists = (fileName) => fileName === rootFile || fileExists(fileName);
|
|
85
|
+
const key = `${typesDir}\n${rootFile}`;
|
|
86
|
+
const program = ts.createProgram({
|
|
87
|
+
rootNames: [rootFile],
|
|
88
|
+
options: {
|
|
89
|
+
...OPTIONS,
|
|
90
|
+
target: ts.ScriptTarget.ES2020,
|
|
91
|
+
module: ts.ModuleKind.ESNext,
|
|
92
|
+
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
93
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
94
|
+
},
|
|
95
|
+
host,
|
|
96
|
+
oldProgram: programs.get(key),
|
|
97
|
+
});
|
|
98
|
+
programs.set(key, program);
|
|
99
|
+
return { program, sf: program.getSourceFile(rootFile) };
|
|
100
|
+
}
|
|
101
|
+
const NAMES_FILE = '__adaptable_mcp_names__.ts';
|
|
102
|
+
/**
|
|
103
|
+
* Reads the keys of object types and the members of string-literal unions from the
|
|
104
|
+
* types of the checked major (e.g. `InitialState`, `AdaptableDashboardToolbar`).
|
|
105
|
+
* A name the major does not export is `undefined`; nothing throws.
|
|
106
|
+
*/
|
|
107
|
+
export async function readTypeNames(types, typeNames) {
|
|
108
|
+
const out = {};
|
|
109
|
+
const module = typesModule(types);
|
|
110
|
+
if (!module) {
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
const ts = await loadTypeScript();
|
|
114
|
+
const file = join(types.dir, NAMES_FILE);
|
|
115
|
+
const text = typeNames
|
|
116
|
+
.map((name, i) => `import type { ${name} as T${i} } from ${JSON.stringify(module)};\nexport type N${i} = T${i};`)
|
|
117
|
+
.join('\n');
|
|
118
|
+
const { program, sf } = createProgramFor(ts, types.dir, file, `${text}\n`);
|
|
119
|
+
const checker = program.getTypeChecker();
|
|
120
|
+
sf.statements.filter(ts.isTypeAliasDeclaration).forEach((alias, i) => {
|
|
121
|
+
const type = checker.getTypeAtLocation(alias.name);
|
|
122
|
+
// a name the major does not export resolves to the error type (flagged Any)
|
|
123
|
+
if (type.flags & ts.TypeFlags.Any) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (type.isUnion()) {
|
|
127
|
+
const literals = type.types.filter((t) => t.isStringLiteral()).map((t) => t.value);
|
|
128
|
+
if (literals.length) {
|
|
129
|
+
out[typeNames[i]] = literals;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const properties = checker.getPropertiesOfType(type).map((p) => p.name);
|
|
134
|
+
if (properties.length) {
|
|
135
|
+
out[typeNames[i]] = properties;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
/** Path of the property that contains `pos` in the generated literal (same syntax as the extractor's line map) */
|
|
141
|
+
function pathAt(ts, sf, root, pos) {
|
|
142
|
+
let path = '';
|
|
143
|
+
let node = root;
|
|
144
|
+
for (;;) {
|
|
145
|
+
let next;
|
|
146
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
147
|
+
const prop = node.properties.find((p) => p.getStart(sf) <= pos && pos < p.end);
|
|
148
|
+
if (prop?.name && (ts.isStringLiteral(prop.name) || ts.isIdentifier(prop.name))) {
|
|
149
|
+
path = childPath(path, prop.name.text);
|
|
150
|
+
next = ts.isPropertyAssignment(prop) ? prop.initializer : undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (ts.isArrayLiteralExpression(node)) {
|
|
154
|
+
const index = node.elements.findIndex((e) => e.getStart(sf) <= pos && pos < e.end);
|
|
155
|
+
if (index >= 0) {
|
|
156
|
+
path += `[${index}]`;
|
|
157
|
+
next = node.elements[index];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!next || next.getStart(sf) > pos) {
|
|
161
|
+
return path;
|
|
162
|
+
}
|
|
163
|
+
node = next;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** The generated file quotes every key (`JSON.stringify`), so the compiler names them as `'"Key"'` */
|
|
167
|
+
const unquote = (key) => key.replace(/^"(.*)"$/, '$1');
|
|
168
|
+
function messageOf(ts, diagnostic) {
|
|
169
|
+
const lines = ts
|
|
170
|
+
.flattenDiagnosticMessageText(diagnostic.messageText, '\n')
|
|
171
|
+
.split('\n')
|
|
172
|
+
.map((l) => l.trim())
|
|
173
|
+
.filter(Boolean);
|
|
174
|
+
let message = lines.length > 2 ? `${lines[0]} ${lines[lines.length - 1]}` : lines.join(' ');
|
|
175
|
+
message = message
|
|
176
|
+
.replace(/'"([^"']+)"'/g, "'$1'")
|
|
177
|
+
.replace(/^Property '([^']+)' is missing in type '.*' but required in type '([^']+)'\.$/, "Property '$1' is required in type '$2' but missing.")
|
|
178
|
+
.replace(/^Type '.*' is missing the following properties from type '([^']+)': (.*)$/, "Properties required in type '$1' are missing: $2.");
|
|
179
|
+
return message.length > 400 ? `${message.slice(0, 400)}…` : message;
|
|
180
|
+
}
|
|
181
|
+
/** TS diagnostic codes → shape issue codes */
|
|
182
|
+
const UNKNOWN_KEY_CODES = new Set([2353, 2561, 2322 /* when the message is an excess-property one */]);
|
|
183
|
+
const MISSING_PROPERTY_CODES = new Set([2741, 2739, 2740, 2345]);
|
|
184
|
+
const TYPE_MISMATCH_CODES = new Set([2322, 2820, 2352, 2367]);
|
|
185
|
+
const UNKNOWN_KEY_MESSAGE = /'([^']+)' does not exist in type/;
|
|
186
|
+
function classify(diagnostic, message) {
|
|
187
|
+
const unknownKey = UNKNOWN_KEY_MESSAGE.exec(message);
|
|
188
|
+
if (unknownKey && UNKNOWN_KEY_CODES.has(diagnostic.code)) {
|
|
189
|
+
return { code: 'shape/unknown-key', key: unquote(unknownKey[1]) };
|
|
190
|
+
}
|
|
191
|
+
if (MISSING_PROPERTY_CODES.has(diagnostic.code) || /is required in type '[^']+' but missing|are missing:/.test(message)) {
|
|
192
|
+
return { code: 'shape/missing-property' };
|
|
193
|
+
}
|
|
194
|
+
if (TYPE_MISMATCH_CODES.has(diagnostic.code)) {
|
|
195
|
+
return { code: 'shape/type-mismatch' };
|
|
196
|
+
}
|
|
197
|
+
return { code: 'shape/invalid' };
|
|
198
|
+
}
|
|
199
|
+
/** Property names the contextual type of an object literal accepts (union members merged) */
|
|
200
|
+
function acceptedKeys(ts, checker, literal) {
|
|
201
|
+
const type = checker.getContextualType(literal);
|
|
202
|
+
if (!type) {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
const types = type.isUnion() ? type.types : [type];
|
|
206
|
+
const names = new Set();
|
|
207
|
+
for (const member of types) {
|
|
208
|
+
for (const property of checker.getPropertiesOfType(member)) {
|
|
209
|
+
// `PivotColumns?: never` marks a key as *forbidden* in that union member, not accepted
|
|
210
|
+
const declaration = property.valueDeclaration;
|
|
211
|
+
if (declaration && ts.isPropertySignature(declaration) && declaration.type?.kind === ts.SyntaxKind.NeverKeyword) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
names.add(property.name);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return [...names];
|
|
218
|
+
}
|
|
219
|
+
function isUnder(path, parent) {
|
|
220
|
+
return path === parent || path.startsWith(`${parent}.`) || path.startsWith(`${parent}[`);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* The generated file up to the checked literal. A persisted State is what the runtime
|
|
224
|
+
* stored: each section object carries the metadata `addUuidsToInitialState` writes
|
|
225
|
+
* (`Uuid`, `AdaptableVersion`, `Source`), which the published types do not declare on
|
|
226
|
+
* `BaseState`; the checked type allows it (and keeps every section required, as the
|
|
227
|
+
* runtime writes them all) so a `getPersistentState()` export is judged on its content.
|
|
228
|
+
*/
|
|
229
|
+
function checkPrefix(type, module) {
|
|
230
|
+
if (type !== 'AdaptablePersistentState') {
|
|
231
|
+
return `import type { ${type} } from ${JSON.stringify(module)};\nexport const value: ${type} = `;
|
|
232
|
+
}
|
|
233
|
+
// the alias keeps the diagnostics naming `AdaptablePersistentState`
|
|
234
|
+
return (`import type { ${type} as Persisted } from ${JSON.stringify(module)};\n` +
|
|
235
|
+
`type RuntimeMeta = { Uuid?: string; AdaptableVersion?: string; Source?: string };\n` +
|
|
236
|
+
`type ${type} = { [K in keyof Persisted]: Persisted[K] & RuntimeMeta };\n` +
|
|
237
|
+
`export const value: ${type} = `);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Type-checks `value` as `type` against the types of `types`. Never throws for a
|
|
241
|
+
* shape problem; `ok: false` only when the types cannot be loaded.
|
|
242
|
+
*/
|
|
243
|
+
export async function checkShape(input) {
|
|
244
|
+
const module = typesModule(input.types);
|
|
245
|
+
if (!module) {
|
|
246
|
+
const where = input.types.kind === 'source' ? `${input.types.dir}/types.ts` : `${input.types.dir}/types.d.ts`;
|
|
247
|
+
return { ok: false, reason: `The types entry ${where} does not exist; the package layout is not the one the check expects.` };
|
|
248
|
+
}
|
|
249
|
+
const ts = await loadTypeScript();
|
|
250
|
+
const checkFile = join(input.types.dir, CHECK_FILE);
|
|
251
|
+
const prefix = checkPrefix(input.type, module);
|
|
252
|
+
const text = `${prefix}${JSON.stringify(input.value, null, 2)};\n`;
|
|
253
|
+
const { program, sf } = createProgramFor(ts, input.types.dir, checkFile, text);
|
|
254
|
+
const diagnostics = [...program.getSyntacticDiagnostics(sf), ...program.getSemanticDiagnostics(sf)];
|
|
255
|
+
if (diagnostics.some((d) => d.code === 2307 || (d.start ?? 0) < prefix.indexOf('export'))) {
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
reason: `Could not load ${input.type} from ${module}: ${diagnostics.map((d) => messageOf(ts, d)).join('; ')}`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const declaration = sf.statements.filter(ts.isVariableStatement).flatMap((s) => s.declarationList.declarations)[0];
|
|
262
|
+
const root = declaration?.initializer;
|
|
263
|
+
const checker = program.getTypeChecker();
|
|
264
|
+
const area = input.type === 'AdaptableOptions' ? 'options' : 'state';
|
|
265
|
+
const unverifiablePaths = (input.unverifiable ?? []).map((u) => u.path);
|
|
266
|
+
const issues = [];
|
|
267
|
+
const suppressed = [];
|
|
268
|
+
for (const diagnostic of diagnostics) {
|
|
269
|
+
const message = messageOf(ts, diagnostic);
|
|
270
|
+
const { code, key } = classify(diagnostic, message);
|
|
271
|
+
// an unknown key is reported at the key's own path (the compiler usually positions it there already)
|
|
272
|
+
let path = root && diagnostic.start !== undefined ? pathAt(ts, sf, root, diagnostic.start) : '';
|
|
273
|
+
if (code === 'shape/unknown-key' && key && path !== key && !path.endsWith(`.${key}`)) {
|
|
274
|
+
path = childPath(path, key);
|
|
275
|
+
}
|
|
276
|
+
// a diagnostic at or under a stubbed value is about the stub; so is one about `null` on a container holding stubs
|
|
277
|
+
// (the compiler elaborates `Tags: [null]` to the enclosing array or object)
|
|
278
|
+
if (unverifiablePaths.some((u) => isUnder(path, u) || (isUnder(u, path) && /'null'|\bnull\b/.test(message)))) {
|
|
279
|
+
suppressed.push({ path, message });
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const issue = { code, severity: 'error', path, message };
|
|
283
|
+
if (code === 'shape/unknown-key' && key) {
|
|
284
|
+
issue.key = key;
|
|
285
|
+
const literal = deepestObjectLiteral(ts, sf, root, diagnostic.start);
|
|
286
|
+
const accepted = literal ? acceptedKeys(ts, checker, literal) : [];
|
|
287
|
+
const suggestions = suggestKeys(key, path, accepted, input.renames ?? [], area);
|
|
288
|
+
if (suggestions.length) {
|
|
289
|
+
issue.suggestions = suggestions;
|
|
290
|
+
issue.fix = describeSuggestions(key, suggestions);
|
|
291
|
+
}
|
|
292
|
+
const first = suggestions[0];
|
|
293
|
+
if (first?.kind === 'renamed') {
|
|
294
|
+
issue.docs = `#chg-${first.rename.anchor}`;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const position = input.lineMap?.[path];
|
|
298
|
+
if (position) {
|
|
299
|
+
const at = code === 'shape/unknown-key' ? position.key ?? position.value : position.value;
|
|
300
|
+
issue.file = at.file;
|
|
301
|
+
issue.line = at.line;
|
|
302
|
+
issue.column = at.column;
|
|
303
|
+
}
|
|
304
|
+
issues.push(issue);
|
|
305
|
+
}
|
|
306
|
+
const version = input.types.kind === 'package' ? input.types.version : undefined;
|
|
307
|
+
return {
|
|
308
|
+
ok: true,
|
|
309
|
+
issues,
|
|
310
|
+
suppressed,
|
|
311
|
+
checked: {
|
|
312
|
+
types: version ? `types.d.ts@${version}` : `source@${input.types.dir}`,
|
|
313
|
+
...(version ? { version } : {}),
|
|
314
|
+
source: input.types.kind,
|
|
315
|
+
agGridTypes: agGridTypesResolve(input.types.dir),
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/** Whether any key is acceptable in a literal of this type: `any`/`unknown`/`object`, an index signature, or no type at all */
|
|
320
|
+
function acceptsAnyKey(ts, checker, type) {
|
|
321
|
+
if (!type) {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
const members = type.isUnion() ? type.types : [type];
|
|
325
|
+
return members.some((member) => (member.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.NonPrimitive | ts.TypeFlags.TypeParameter)) !== 0 ||
|
|
326
|
+
checker.getIndexInfosOfType(member).length > 0);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Every property of `value` whose key the contextual type at that place does not
|
|
330
|
+
* declare — exhaustively, in one pass over the generated literal, independent of
|
|
331
|
+
* how the compiler elaborates its diagnostics (which stop at one problem per
|
|
332
|
+
* failing top-level property). A literal whose type accepts any key (`any`,
|
|
333
|
+
* index signatures, unresolved AG Grid types) contributes nothing; the children
|
|
334
|
+
* of an unknown key are not descended into.
|
|
335
|
+
*/
|
|
336
|
+
export async function findUnknownKeys(input) {
|
|
337
|
+
const module = typesModule(input.types);
|
|
338
|
+
if (!module) {
|
|
339
|
+
const where = input.types.kind === 'source' ? `${input.types.dir}/types.ts` : `${input.types.dir}/types.d.ts`;
|
|
340
|
+
return { ok: false, reason: `The types entry ${where} does not exist; the package layout is not the one the check expects.` };
|
|
341
|
+
}
|
|
342
|
+
const ts = await loadTypeScript();
|
|
343
|
+
const checkFile = join(input.types.dir, CHECK_FILE);
|
|
344
|
+
const prefix = checkPrefix(input.type, module);
|
|
345
|
+
const text = `${prefix}${JSON.stringify(input.value, null, 2)};\n`;
|
|
346
|
+
const { program, sf } = createProgramFor(ts, input.types.dir, checkFile, text);
|
|
347
|
+
const diagnostics = program.getSemanticDiagnostics(sf);
|
|
348
|
+
if (diagnostics.some((d) => d.code === 2307)) {
|
|
349
|
+
return { ok: false, reason: `Could not load ${input.type} from ${module}: ${diagnostics.map((d) => messageOf(ts, d)).join('; ')}` };
|
|
350
|
+
}
|
|
351
|
+
const root = sf.statements.filter(ts.isVariableStatement).flatMap((s) => s.declarationList.declarations)[0]?.initializer;
|
|
352
|
+
const checker = program.getTypeChecker();
|
|
353
|
+
const unknown = [];
|
|
354
|
+
const visit = (node, path) => {
|
|
355
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
356
|
+
const type = checker.getContextualType(node);
|
|
357
|
+
const accepted = acceptsAnyKey(ts, checker, type) ? undefined : acceptedKeys(ts, checker, node);
|
|
358
|
+
for (const property of node.properties) {
|
|
359
|
+
if (!ts.isPropertyAssignment(property) || !(ts.isStringLiteral(property.name) || ts.isIdentifier(property.name))) {
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const key = property.name.text;
|
|
363
|
+
const child = childPath(path, key);
|
|
364
|
+
if (accepted && !accepted.includes(key)) {
|
|
365
|
+
unknown.push({ path: child, key, accepted, type: checker.typeToString(checker.getNonNullableType(type)).replace(/ & RuntimeMeta$/, '') });
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
visit(property.initializer, child);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else if (ts.isArrayLiteralExpression(node)) {
|
|
372
|
+
node.elements.forEach((element, index) => visit(element, `${path}[${index}]`));
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
if (root) {
|
|
376
|
+
visit(root, '');
|
|
377
|
+
}
|
|
378
|
+
const version = input.types.kind === 'package' ? input.types.version : undefined;
|
|
379
|
+
return {
|
|
380
|
+
ok: true,
|
|
381
|
+
unknown,
|
|
382
|
+
checked: {
|
|
383
|
+
types: version ? `types.d.ts@${version}` : `source@${input.types.dir}`,
|
|
384
|
+
...(version ? { version } : {}),
|
|
385
|
+
source: input.types.kind,
|
|
386
|
+
agGridTypes: agGridTypesResolve(input.types.dir),
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/** The innermost object literal containing `pos` — for a diagnostic at a key, the object that key was written in */
|
|
391
|
+
function deepestObjectLiteral(ts, sf, root, pos) {
|
|
392
|
+
let found;
|
|
393
|
+
const visit = (node) => {
|
|
394
|
+
if (node.getStart(sf) <= pos && pos < node.end) {
|
|
395
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
396
|
+
found = node;
|
|
397
|
+
}
|
|
398
|
+
ts.forEachChild(node, visit);
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
visit(root);
|
|
402
|
+
return found;
|
|
403
|
+
}
|
|
404
|
+
/** Type issues not already explained by a rule issue on the same object (or inside it); kept for A2.3 */
|
|
405
|
+
export function unexplainedShapeIssues(shapeIssues, ruleIssues) {
|
|
406
|
+
return shapeIssues.filter((t) => !ruleIssues.some((r) => r.path === t.path || r.path.startsWith(`${t.path}.`)));
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=type-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-check.js","sourceRoot":"","sources":["../../../src/core/state/type-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adaptable mcp [--cwd <dir>] [--major <n>] [--framework <fw>] [--offline] [--docs-host <url>]`
|
|
3
|
+
* — the stdio MCP server (plan §8.14, §9). The flags are defaults for every tool
|
|
4
|
+
* call; a tool argument of the same name wins. stdout belongs to the transport, so
|
|
5
|
+
* everything else goes to stderr. The returned promise settles when the client
|
|
6
|
+
* closes the connection.
|
|
7
|
+
*/
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { exitCodeFor } from '../core/index.js';
|
|
10
|
+
import { createServer, mcpCapabilities } from './server.js';
|
|
11
|
+
const FRAMEWORKS = ['vanilla', 'react', 'angular', 'vue'];
|
|
12
|
+
const usage = (message) => ({
|
|
13
|
+
schemaVersion: 1,
|
|
14
|
+
ok: false,
|
|
15
|
+
error: { code: 'USAGE', message, hint: 'Usage: adaptable mcp [--cwd <dir>] [--major <n>] [--framework <fw>] [--offline] [--docs-host <url>]' },
|
|
16
|
+
});
|
|
17
|
+
/** Parses the server flags; returns a usage envelope for anything it does not know */
|
|
18
|
+
export function parseMcpArgs(argv) {
|
|
19
|
+
const defaults = {};
|
|
20
|
+
for (let i = 0; i < argv.length; i++) {
|
|
21
|
+
const arg = argv[i];
|
|
22
|
+
const [flag, inline] = arg.includes('=') ? [arg.slice(0, arg.indexOf('=')), arg.slice(arg.indexOf('=') + 1)] : [arg, undefined];
|
|
23
|
+
const value = () => inline ?? argv[++i];
|
|
24
|
+
switch (flag) {
|
|
25
|
+
case '--help':
|
|
26
|
+
case '-h':
|
|
27
|
+
return { help: true };
|
|
28
|
+
case '--offline':
|
|
29
|
+
defaults.offline = true;
|
|
30
|
+
break;
|
|
31
|
+
case '--cwd': {
|
|
32
|
+
const v = value();
|
|
33
|
+
if (!v) {
|
|
34
|
+
return { error: usage('--cwd needs a folder.') };
|
|
35
|
+
}
|
|
36
|
+
defaults.cwd = v;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case '--docs-host': {
|
|
40
|
+
const v = value();
|
|
41
|
+
if (!v) {
|
|
42
|
+
return { error: usage('--docs-host needs a URL.') };
|
|
43
|
+
}
|
|
44
|
+
defaults.docsHost = v;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case '--major': {
|
|
48
|
+
const v = value();
|
|
49
|
+
const n = Number(v);
|
|
50
|
+
if (!v || !Number.isInteger(n)) {
|
|
51
|
+
return { error: usage(`--major needs a whole number${v ? ` (got "${v}")` : ''}.`) };
|
|
52
|
+
}
|
|
53
|
+
defaults.major = n;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case '--framework': {
|
|
57
|
+
const v = value();
|
|
58
|
+
if (!v || !FRAMEWORKS.includes(v)) {
|
|
59
|
+
return { error: usage(`--framework must be one of ${FRAMEWORKS.join(', ')}${v ? ` (got "${v}")` : ''}.`) };
|
|
60
|
+
}
|
|
61
|
+
defaults.framework = v;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
default:
|
|
65
|
+
return { error: usage(`Unknown option "${arg}".`) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { defaults };
|
|
69
|
+
}
|
|
70
|
+
export function mcpHelp() {
|
|
71
|
+
const tools = mcpCapabilities('stdio').map((c) => ` ${c.mcp.tool.padEnd(26)} ${c.description}`);
|
|
72
|
+
return [
|
|
73
|
+
'Usage: adaptable mcp [options]',
|
|
74
|
+
'',
|
|
75
|
+
'Starts the AdapTable MCP server on stdio. Configure it in your MCP client as',
|
|
76
|
+
' { "command": "npx", "args": ["-y", "@adaptabletools/adaptable-mcp@^1", "mcp"] }',
|
|
77
|
+
'',
|
|
78
|
+
'Options (defaults for every tool call; a tool argument of the same name wins):',
|
|
79
|
+
' --cwd <dir> Project folder; defaults to the current directory',
|
|
80
|
+
' --major <n> AdapTable major to assume instead of detecting it',
|
|
81
|
+
' --framework <fw> Framework to assume instead of detecting it (vanilla, react, angular, vue)',
|
|
82
|
+
' --offline Never touch the network; use caches and bundled snapshots',
|
|
83
|
+
' --docs-host <url> Docs host to read instead of the default one',
|
|
84
|
+
'',
|
|
85
|
+
'Tools:',
|
|
86
|
+
...tools,
|
|
87
|
+
'',
|
|
88
|
+
].join('\n');
|
|
89
|
+
}
|
|
90
|
+
export async function runMcp(argv, io) {
|
|
91
|
+
const parsed = parseMcpArgs(argv);
|
|
92
|
+
if ('help' in parsed) {
|
|
93
|
+
io.stderr(mcpHelp());
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
if ('error' in parsed) {
|
|
97
|
+
io.stderr(`${JSON.stringify(parsed.error, null, 2)}\n`);
|
|
98
|
+
return exitCodeFor(parsed.error);
|
|
99
|
+
}
|
|
100
|
+
const server = createServer({ defaults: parsed.defaults, transport: 'stdio' });
|
|
101
|
+
const transport = new StdioServerTransport();
|
|
102
|
+
const closed = new Promise((resolve) => {
|
|
103
|
+
server.server.onclose = () => resolve();
|
|
104
|
+
});
|
|
105
|
+
await server.connect(transport);
|
|
106
|
+
await closed;
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|