@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,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":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAY,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD,SAAS,gBAAgB,CAAC,MAAW;IACnC,MAAM,IAAI,GAAwC,EAAE,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC/F,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtC,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,yBAAyB,EAAE,yBAAyB,CAAC,EAAE,CAAC;QACzG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAE,CAAC;QACzF,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAQ,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,kBAAkB;IACxB,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,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,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;YACnC,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,IAAI,WAAW,CAAC,OAAQ,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,SAAS;gBACX,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB,CAAC,KAAK,GAAG,EAAE;oBACnC,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,WAAW,QAAQ,mCAAmC,OAAQ,CAAC,MAAM,IAAI;oBAClF,GAAG,EAAE,KAAK;wBACR,CAAC,CAAC,QAAQ,KAAK,oCAAoC;wBACnD,CAAC,CAAC,wJAAwJ;iBAC7J,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|