@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,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scaffold overlay (plan §8.11 Shell, Overlay): which files go where for a framework,
|
|
3
|
+
* what conflicts with the project, the `package.json` dependency additions, `AGENTS.md`,
|
|
4
|
+
* and applying the plan (or not, with `--dry-run`).
|
|
5
|
+
*
|
|
6
|
+
* The framework's creator owns the shell (Vite / Angular CLI); the overlay writes the
|
|
7
|
+
* AdapTable files under `<srcDir>/` and replaces the creator's root component / entry
|
|
8
|
+
* with the wiring. On a fresh creator project that entry is the one conflict the plan
|
|
9
|
+
* reports — it is overwritten only with `--force`, like any other existing file.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { basename, dirname, join, posix, relative } from 'node:path';
|
|
13
|
+
import { CapabilityError } from '../envelope.js';
|
|
14
|
+
import { extractFromFile } from '../extract/input.js';
|
|
15
|
+
import { angularComponent, angularStyles, generateAdaptableOptions, generateAgGridModules, generateColumnDefs, generateGridOptions, generateLicenses, generateOnAdaptableReady, generateRowData, reactApp, typeOnlyImports, vanillaMain, viteStyles, vueApp, } from './generate.js';
|
|
16
|
+
import { hasAgentsSnippet, loadAgentsSnippet, loadTemplatesManifest, readTemplateFile, SCAFFOLD_FRAMEWORKS, templatesDir, } from './templates.js';
|
|
17
|
+
/** The creator command per framework (plan §8.11 Shell); `<dir>` is substituted */
|
|
18
|
+
export const CREATORS = {
|
|
19
|
+
vanilla: 'npm create vite@latest <dir> -- --template vanilla-ts',
|
|
20
|
+
react: 'npm create vite@latest <dir> -- --template react-ts',
|
|
21
|
+
vue: 'npm create vite@latest <dir> -- --template vue-ts',
|
|
22
|
+
angular: 'npx -p @angular/cli@latest ng new <dir> --style css --routing false --ssr false --skip-install',
|
|
23
|
+
};
|
|
24
|
+
/** The dev command the report suggests after `npm install` */
|
|
25
|
+
export const DEV_COMMANDS = {
|
|
26
|
+
vanilla: 'npm run dev',
|
|
27
|
+
react: 'npm run dev',
|
|
28
|
+
vue: 'npm run dev',
|
|
29
|
+
angular: 'npx ng serve',
|
|
30
|
+
};
|
|
31
|
+
/** Reads the shell: package.json presence and content */
|
|
32
|
+
export function readShell(outDir) {
|
|
33
|
+
const file = join(outDir, 'package.json');
|
|
34
|
+
if (!existsSync(file)) {
|
|
35
|
+
return { present: false };
|
|
36
|
+
}
|
|
37
|
+
const text = readFileSync(file, 'utf8');
|
|
38
|
+
let parsed;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(text);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
throw new CapabilityError('EXTRACTION_FAILED', `${file}: ${error instanceof Error ? error.message : String(error)}`, 'Fix the package.json so it parses as JSON.');
|
|
44
|
+
}
|
|
45
|
+
return { present: true, packageJson: parsed, packageJsonText: text, name: typeof parsed.name === 'string' ? parsed.name : undefined };
|
|
46
|
+
}
|
|
47
|
+
function allDependencies(pkg) {
|
|
48
|
+
const out = {};
|
|
49
|
+
for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {
|
|
50
|
+
const deps = pkg?.[section];
|
|
51
|
+
if (deps && typeof deps === 'object') {
|
|
52
|
+
Object.assign(out, deps);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/** The framework from the shell's dependencies: `@angular/core` → angular, `react` → react, `vue` → vue, else vanilla */
|
|
58
|
+
export function detectFramework(shell) {
|
|
59
|
+
if (!shell.present) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const deps = allDependencies(shell.packageJson);
|
|
63
|
+
if (deps['@angular/core']) {
|
|
64
|
+
return 'angular';
|
|
65
|
+
}
|
|
66
|
+
if (deps.react) {
|
|
67
|
+
return 'react';
|
|
68
|
+
}
|
|
69
|
+
if (deps.vue) {
|
|
70
|
+
return 'vue';
|
|
71
|
+
}
|
|
72
|
+
return 'vanilla';
|
|
73
|
+
}
|
|
74
|
+
/** `^<version>` for a release; a prerelease (canary) is kept so npm can resolve it */
|
|
75
|
+
export function caretRange(version, major) {
|
|
76
|
+
if (version && /^\d+\.\d+\.\d+/.test(version)) {
|
|
77
|
+
return `^${version}`;
|
|
78
|
+
}
|
|
79
|
+
return `^${major}.0.0`;
|
|
80
|
+
}
|
|
81
|
+
/** The dependencies the framework needs (plan §8.11): AdapTable, the wrapper, AG Grid Enterprise and its peers */
|
|
82
|
+
export function dependenciesFor(framework, adaptablePackage, versions) {
|
|
83
|
+
const deps = {
|
|
84
|
+
'@adaptabletools/adaptable': versions.adaptableRange,
|
|
85
|
+
'ag-grid-enterprise': versions.agGridRange,
|
|
86
|
+
'ag-stack': versions.agGridRange,
|
|
87
|
+
};
|
|
88
|
+
if (framework !== 'vanilla') {
|
|
89
|
+
deps[adaptablePackage] = versions.adaptableRange;
|
|
90
|
+
}
|
|
91
|
+
const gridPackage = { vanilla: undefined, react: 'ag-grid-react', angular: 'ag-grid-angular', vue: 'ag-grid-vue3' }[framework];
|
|
92
|
+
if (gridPackage) {
|
|
93
|
+
deps[gridPackage] = versions.agGridRange;
|
|
94
|
+
}
|
|
95
|
+
return Object.fromEntries(Object.entries(deps).sort(([a], [b]) => a.localeCompare(b)));
|
|
96
|
+
}
|
|
97
|
+
export function planDependencies(shell, wanted) {
|
|
98
|
+
const existing = allDependencies(shell.packageJson);
|
|
99
|
+
const add = {};
|
|
100
|
+
const present = {};
|
|
101
|
+
for (const [name, range] of Object.entries(wanted)) {
|
|
102
|
+
if (existing[name] !== undefined) {
|
|
103
|
+
present[name] = existing[name];
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
add[name] = range;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { add, present };
|
|
110
|
+
}
|
|
111
|
+
/** package.json with the additions merged into `dependencies`, keeping the file's indentation and trailing newline */
|
|
112
|
+
export function mergePackageJson(text, add) {
|
|
113
|
+
const pkg = JSON.parse(text);
|
|
114
|
+
const indent = text.match(/^([ \t]+)"/m)?.[1] ?? ' ';
|
|
115
|
+
const deps = { ...(pkg.dependencies ?? {}), ...add };
|
|
116
|
+
pkg.dependencies = Object.fromEntries(Object.entries(deps).sort(([a], [b]) => a.localeCompare(b)));
|
|
117
|
+
return `${JSON.stringify(pkg, null, indent)}${text.endsWith('\n') ? '\n' : ''}`;
|
|
118
|
+
}
|
|
119
|
+
/** The Angular root component file the creator wrote (≥ 20: `app.ts` / `App`; 17–19: `app.component.ts` / `AppComponent`) */
|
|
120
|
+
export function angularTarget(outDir) {
|
|
121
|
+
if (!existsSync(join(outDir, 'src', 'app', 'app.ts')) && existsSync(join(outDir, 'src', 'app', 'app.component.ts'))) {
|
|
122
|
+
return { file: 'src/app/app.component.ts', className: 'AppComponent' };
|
|
123
|
+
}
|
|
124
|
+
return { file: 'src/app/app.ts', className: 'App' };
|
|
125
|
+
}
|
|
126
|
+
/** The demo dataset's columns from the template `columnDefs.ts` (the "neither" case of §8.11 Inference) */
|
|
127
|
+
export function demoColumns(framework) {
|
|
128
|
+
const manifest = loadTemplatesManifest().frameworks[framework];
|
|
129
|
+
const file = join(templatesDir(), framework, ...posix.join(manifest.srcDir, 'columnDefs.ts').split('/'));
|
|
130
|
+
const extraction = extractFromFile(file, { target: 'columnDefs' });
|
|
131
|
+
const value = 'value' in extraction ? extraction.value : undefined;
|
|
132
|
+
if (!Array.isArray(value)) {
|
|
133
|
+
throw new CapabilityError('EXTRACTION_FAILED', `The template columnDefs.ts for ${framework} could not be read.`, 'Reinstall the package; in the repository run `npm run generate`.');
|
|
134
|
+
}
|
|
135
|
+
return value.map((col) => {
|
|
136
|
+
const field = String(col.field ?? col.colId ?? '');
|
|
137
|
+
const colId = String(col.colId ?? field);
|
|
138
|
+
const cellDataType = (typeof col.cellDataType === 'string' ? col.cellDataType : 'text');
|
|
139
|
+
return {
|
|
140
|
+
field,
|
|
141
|
+
colId,
|
|
142
|
+
headerName: typeof col.headerName === 'string' ? col.headerName : field,
|
|
143
|
+
cellDataType: ['text', 'number', 'boolean', 'date', 'object'].includes(cellDataType) ? cellDataType : 'text',
|
|
144
|
+
nullable: false,
|
|
145
|
+
nullCount: 0,
|
|
146
|
+
cardinality: 0,
|
|
147
|
+
uniqueness: 0,
|
|
148
|
+
enumLike: false,
|
|
149
|
+
samples: [],
|
|
150
|
+
primaryKeyCandidate: colId === 'id',
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function actionFor(outDir, path, force) {
|
|
155
|
+
const target = join(outDir, ...path.split('/'));
|
|
156
|
+
if (!existsSync(target)) {
|
|
157
|
+
return 'write';
|
|
158
|
+
}
|
|
159
|
+
return force ? 'overwrite' : 'skip-exists';
|
|
160
|
+
}
|
|
161
|
+
/** Builds the file plan for a framework */
|
|
162
|
+
export function planOverlay(input) {
|
|
163
|
+
const { framework, outDir, force } = input;
|
|
164
|
+
const manifest = loadTemplatesManifest().frameworks[framework];
|
|
165
|
+
const src = manifest.srcDir;
|
|
166
|
+
const at = (name) => posix.join(src, name);
|
|
167
|
+
const templateSource = (name) => manifest.files.find((f) => f.path === at(name))?.source;
|
|
168
|
+
const files = [];
|
|
169
|
+
const notes = [];
|
|
170
|
+
const planned = new Map();
|
|
171
|
+
const add = (path, origin, content, source) => {
|
|
172
|
+
const file = { path, origin, action: actionFor(outDir, path, force), content, ...(source ? { source } : {}) };
|
|
173
|
+
planned.set(path, file);
|
|
174
|
+
files.push(file);
|
|
175
|
+
};
|
|
176
|
+
const demo = input.generate === undefined;
|
|
177
|
+
const rowType = input.generate?.rowType ?? input.demoRowType ?? 'WebFramework';
|
|
178
|
+
const generateInput = input.generate ??
|
|
179
|
+
{
|
|
180
|
+
framework,
|
|
181
|
+
rowType,
|
|
182
|
+
schema: input.demoSchema,
|
|
183
|
+
rows: [],
|
|
184
|
+
primaryKey: 'id',
|
|
185
|
+
adaptableId: input.shell.name ?? basename(outDir),
|
|
186
|
+
rowModel: 'client',
|
|
187
|
+
adaptablePackage: input.adaptablePackage,
|
|
188
|
+
};
|
|
189
|
+
// --- data files
|
|
190
|
+
if (demo) {
|
|
191
|
+
add(at('columnDefs.ts'), 'template', readTemplateFile(framework, at('columnDefs.ts')), templateSource('columnDefs.ts'));
|
|
192
|
+
add(at('rowData.ts'), 'template', readTemplateFile(framework, at('rowData.ts')), templateSource('rowData.ts'));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
add(at('columnDefs.ts'), 'generated', generateColumnDefs(generateInput));
|
|
196
|
+
add(at('rowData.ts'), 'generated', generateRowData(generateInput));
|
|
197
|
+
}
|
|
198
|
+
// --- the AdapTable files of §8.11
|
|
199
|
+
add(at('adaptableOptions.ts'), 'generated', generateAdaptableOptions(generateInput));
|
|
200
|
+
add(at('gridOptions.ts'), 'generated', generateGridOptions(generateInput));
|
|
201
|
+
add(at('agGridModules.ts'), 'generated', generateAgGridModules());
|
|
202
|
+
add(at('licenses.ts'), 'generated', generateLicenses(framework));
|
|
203
|
+
add(at('onAdaptableReady.ts'), 'generated', generateOnAdaptableReady(generateInput));
|
|
204
|
+
const styles = readTemplateFile(framework, at('styles.css'));
|
|
205
|
+
if (framework === 'angular') {
|
|
206
|
+
// the creator's global stylesheet (angular.json "styles"); a component stylesheet would trip the anyComponentStyle budget
|
|
207
|
+
add('src/styles.css', 'template', angularStyles(styles, input.adaptablePackage), templateSource('styles.css'));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
add(at('styles.css'), 'template', viteStyles(styles), templateSource('styles.css'));
|
|
211
|
+
}
|
|
212
|
+
// --- the wiring: the creator's entry, replaced
|
|
213
|
+
let wiring;
|
|
214
|
+
let persistenceRestored;
|
|
215
|
+
if (framework === 'react') {
|
|
216
|
+
const result = reactApp(readTemplateFile(framework, 'src/App.tsx'), rowType);
|
|
217
|
+
wiring = 'src/App.tsx';
|
|
218
|
+
persistenceRestored = result.persistenceRestored;
|
|
219
|
+
add(wiring, 'template', result.content, templateSource('App.tsx') ?? manifest.files.find((f) => f.path === 'src/App.tsx')?.source);
|
|
220
|
+
}
|
|
221
|
+
else if (framework === 'vue') {
|
|
222
|
+
const result = vueApp(readTemplateFile(framework, 'src/App.vue'), rowType, input.adaptablePackage);
|
|
223
|
+
wiring = 'src/App.vue';
|
|
224
|
+
persistenceRestored = result.persistenceRestored;
|
|
225
|
+
add(wiring, 'template', result.content, manifest.files.find((f) => f.path === 'src/App.vue')?.source);
|
|
226
|
+
notes.push("Vue: the AdapTable stylesheet is imported from App.vue (the creator's main.ts is left untouched).");
|
|
227
|
+
}
|
|
228
|
+
else if (framework === 'vanilla') {
|
|
229
|
+
const result = vanillaMain(readTemplateFile(framework, 'src/index.ts'), rowType);
|
|
230
|
+
wiring = 'src/main.ts';
|
|
231
|
+
persistenceRestored = result.persistenceRestored;
|
|
232
|
+
add(wiring, 'template', result.content, manifest.files.find((f) => f.path === 'src/index.ts')?.source);
|
|
233
|
+
notes.push("Vanilla: the template's index.ts is written as src/main.ts, the entry Vite's index.html loads; it creates the #adaptable and #grid containers inside #app.");
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const target = angularTarget(outDir);
|
|
237
|
+
wiring = target.file;
|
|
238
|
+
persistenceRestored = true;
|
|
239
|
+
add(wiring, 'generated', angularComponent(generateInput, target));
|
|
240
|
+
notes.push(`Angular: ${target.file} becomes a standalone root component with an inline template (the docs template is NgModule-based); the creator's app.html, app.css and app.spec.ts beside it are no longer used and can be deleted.`, `Angular: the AdapTable stylesheet is imported from the global src/styles.css (listed under "styles" in angular.json); a component stylesheet would exceed the anyComponentStyle budget.`, 'Angular: AG Grid Enterprise + AdapTable are ~7 MB, above the default 1 MB "initial" production budget — raise budgets[].maximumWarning/maximumError for "initial" in angular.json (e.g. 10mb) or `ng build` fails; `ng serve` is unaffected.');
|
|
241
|
+
}
|
|
242
|
+
// --- AGENTS.md (plan §8.11, Appendix D)
|
|
243
|
+
const snippet = loadAgentsSnippet();
|
|
244
|
+
const agentsPath = join(outDir, 'AGENTS.md');
|
|
245
|
+
let agentsAction = 'write';
|
|
246
|
+
if (existsSync(agentsPath)) {
|
|
247
|
+
agentsAction = hasAgentsSnippet(readFileSync(agentsPath, 'utf8')) ? 'exists-with-snippet' : 'exists';
|
|
248
|
+
}
|
|
249
|
+
// the creators' tsconfigs set verbatimModuleSyntax: every type import must say so
|
|
250
|
+
for (const file of files) {
|
|
251
|
+
if (/\.(ts|tsx|vue)$/.test(file.path)) {
|
|
252
|
+
file.content = typeOnlyImports(file.content, [rowType]);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const conflicts = files.filter((f) => f.action === 'skip-exists').map((f) => f.path);
|
|
256
|
+
return { files, conflicts, wiring, persistenceRestored, agentsMd: { path: 'AGENTS.md', action: agentsAction, snippet }, notes };
|
|
257
|
+
}
|
|
258
|
+
/** Writes the plan: new files, overwrites (only with `--force`), `AGENTS.md` when absent, package.json additions */
|
|
259
|
+
export function applyOverlay(outDir, plan, shell, dependencies) {
|
|
260
|
+
const result = { written: [], overwritten: [], skipped: [], agentsMdWritten: false, packageJsonUpdated: false };
|
|
261
|
+
for (const file of plan.files) {
|
|
262
|
+
const target = join(outDir, ...file.path.split('/'));
|
|
263
|
+
if (file.action === 'skip-exists') {
|
|
264
|
+
result.skipped.push(file.path);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
268
|
+
writeFileSync(target, file.content);
|
|
269
|
+
(file.action === 'overwrite' ? result.overwritten : result.written).push(file.path);
|
|
270
|
+
}
|
|
271
|
+
if (plan.agentsMd.action === 'write') {
|
|
272
|
+
writeFileSync(join(outDir, 'AGENTS.md'), `${plan.agentsMd.snippet}\n`);
|
|
273
|
+
result.agentsMdWritten = true;
|
|
274
|
+
}
|
|
275
|
+
if (shell.present && shell.packageJsonText && Object.keys(dependencies.add).length > 0) {
|
|
276
|
+
writeFileSync(join(outDir, 'package.json'), mergePackageJson(shell.packageJsonText, dependencies.add));
|
|
277
|
+
result.packageJsonUpdated = true;
|
|
278
|
+
}
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
export function frameworkFromName(name) {
|
|
282
|
+
return SCAFFOLD_FRAMEWORKS.includes(name ?? '') ? name : undefined;
|
|
283
|
+
}
|
|
284
|
+
/** `<dir>` in a creator command: the out dir relative to cwd when it is below it, else absolute */
|
|
285
|
+
export function creatorCommand(framework, outDir, cwd) {
|
|
286
|
+
const rel = relative(cwd, outDir);
|
|
287
|
+
const dir = rel === '' ? '.' : rel.startsWith('..') ? outDir : rel;
|
|
288
|
+
return CREATORS[framework].replace('<dir>', dir.includes(' ') ? `"${dir}"` : dir);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/core/scaffold/overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV reader for `scaffold --data` (plan §8.11 Inference). RFC 4180 with the usual
|
|
3
|
+
* tolerances: `,` `;` `\t` `|` delimiters (detected from the first rows unless given),
|
|
4
|
+
* quoted fields with `""` escapes and embedded newlines, CRLF or LF, a UTF-8 BOM,
|
|
5
|
+
* a trailing newline, blank lines skipped. The first row is the header. Cells stay
|
|
6
|
+
* strings (`infer.ts` classifies them); an empty cell is `null`.
|
|
7
|
+
*/
|
|
8
|
+
import { CapabilityError } from '../../envelope.js';
|
|
9
|
+
import { normaliseHeader, rowsFromCells } from './dataset.js';
|
|
10
|
+
export const CSV_DELIMITERS = [',', ';', '\t', '|'];
|
|
11
|
+
/**
|
|
12
|
+
* Picks the delimiter whose count is the same on the most of the first rows (and
|
|
13
|
+
* non-zero); ties go to the order above. Counts ignore quoted sections.
|
|
14
|
+
*/
|
|
15
|
+
export function detectDelimiter(text, sampleRows = 10) {
|
|
16
|
+
const lines = text.split(/\r?\n/).filter((line) => line.trim() !== '').slice(0, sampleRows);
|
|
17
|
+
if (lines.length === 0) {
|
|
18
|
+
return ',';
|
|
19
|
+
}
|
|
20
|
+
let best = { delimiter: ',', consistent: 0, total: 0 };
|
|
21
|
+
for (const delimiter of CSV_DELIMITERS) {
|
|
22
|
+
const counts = lines.map((line) => countUnquoted(line, delimiter));
|
|
23
|
+
const total = counts.reduce((sum, count) => sum + count, 0);
|
|
24
|
+
if (total === 0) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const first = counts[0];
|
|
28
|
+
const consistent = first > 0 ? counts.filter((count) => count === first).length : 0;
|
|
29
|
+
if (consistent > best.consistent || (consistent === best.consistent && total > best.total)) {
|
|
30
|
+
best = { delimiter, consistent, total };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return best.delimiter;
|
|
34
|
+
}
|
|
35
|
+
function countUnquoted(line, delimiter) {
|
|
36
|
+
let count = 0;
|
|
37
|
+
let quoted = false;
|
|
38
|
+
for (const char of line) {
|
|
39
|
+
if (char === '"') {
|
|
40
|
+
quoted = !quoted;
|
|
41
|
+
}
|
|
42
|
+
else if (!quoted && char === delimiter) {
|
|
43
|
+
count += 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return count;
|
|
47
|
+
}
|
|
48
|
+
/** Parses the whole text into rows of cells; throws `EXTRACTION_FAILED` on an unterminated quote */
|
|
49
|
+
export function parseCsv(text, delimiter, file = '<csv>') {
|
|
50
|
+
const rows = [];
|
|
51
|
+
let row = [];
|
|
52
|
+
let cell = '';
|
|
53
|
+
let quoted = false;
|
|
54
|
+
let cellStarted = false;
|
|
55
|
+
let skippedBlank = 0;
|
|
56
|
+
let line = 1;
|
|
57
|
+
let quoteOpenedAt = 0;
|
|
58
|
+
const endCell = () => {
|
|
59
|
+
row.push(cell);
|
|
60
|
+
cell = '';
|
|
61
|
+
cellStarted = false;
|
|
62
|
+
};
|
|
63
|
+
const endRow = () => {
|
|
64
|
+
endCell();
|
|
65
|
+
if (row.length === 1 && row[0] === '') {
|
|
66
|
+
skippedBlank += 1;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
rows.push(row);
|
|
70
|
+
}
|
|
71
|
+
row = [];
|
|
72
|
+
};
|
|
73
|
+
const start = text.charCodeAt(0) === 0xfeff ? 1 : 0;
|
|
74
|
+
for (let i = start; i < text.length; i += 1) {
|
|
75
|
+
const char = text[i];
|
|
76
|
+
if (quoted) {
|
|
77
|
+
if (char === '"') {
|
|
78
|
+
if (text[i + 1] === '"') {
|
|
79
|
+
cell += '"';
|
|
80
|
+
i += 1;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
quoted = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (char === '\n') {
|
|
88
|
+
line += 1;
|
|
89
|
+
}
|
|
90
|
+
cell += char;
|
|
91
|
+
}
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (char === '"' && !cellStarted) {
|
|
95
|
+
quoted = true;
|
|
96
|
+
cellStarted = true;
|
|
97
|
+
quoteOpenedAt = line;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (char === delimiter) {
|
|
101
|
+
endCell();
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (char === '\r') {
|
|
105
|
+
if (text[i + 1] === '\n') {
|
|
106
|
+
i += 1;
|
|
107
|
+
}
|
|
108
|
+
endRow();
|
|
109
|
+
line += 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (char === '\n') {
|
|
113
|
+
endRow();
|
|
114
|
+
line += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
cell += char;
|
|
118
|
+
cellStarted = true;
|
|
119
|
+
}
|
|
120
|
+
if (quoted) {
|
|
121
|
+
throw new CapabilityError('EXTRACTION_FAILED', `${file}:${quoteOpenedAt}: a quoted field is not closed before the end of the file.`, 'Close the quote (a literal quote inside a quoted field is written as "") or re-export the file.');
|
|
122
|
+
}
|
|
123
|
+
if (cell !== '' || row.length > 0 || cellStarted) {
|
|
124
|
+
endRow();
|
|
125
|
+
}
|
|
126
|
+
return { rows, skippedBlank };
|
|
127
|
+
}
|
|
128
|
+
export function readCsvDataset(text, file, options = {}) {
|
|
129
|
+
const delimiter = options.delimiter ?? detectDelimiter(text);
|
|
130
|
+
const { rows, skippedBlank } = parseCsv(text, delimiter, file);
|
|
131
|
+
if (rows.length === 0) {
|
|
132
|
+
throw new CapabilityError('EXTRACTION_FAILED', `${file} has no rows.`, 'Pass a CSV with a header row and at least one data row.');
|
|
133
|
+
}
|
|
134
|
+
const { columns, notes } = normaliseHeader(rows[0]);
|
|
135
|
+
if (skippedBlank > 0) {
|
|
136
|
+
notes.push(`${skippedBlank} blank line(s) skipped.`);
|
|
137
|
+
}
|
|
138
|
+
const data = rowsFromCells(columns, rows.slice(1), notes);
|
|
139
|
+
return {
|
|
140
|
+
columns,
|
|
141
|
+
rows: data,
|
|
142
|
+
source: { file, format: 'csv', rowCount: data.length, delimiter },
|
|
143
|
+
notes,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../../src/core/scaffold/readers/csv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape every scaffold reader produces (plan §8.11 Inference): a flat table of
|
|
3
|
+
* rows keyed by column name, with the cells typed as faithfully as the source allows
|
|
4
|
+
* (CSV cells are strings; JSON cells are JSON values; XLSX cells are strings, numbers,
|
|
5
|
+
* booleans or `Date`s). `infer.ts` classifies them from there.
|
|
6
|
+
*/
|
|
7
|
+
/** Plan §7.1 names caps for State and expressions only; datasets get their own (decision in A4.2) */
|
|
8
|
+
export const DATASET_MAX_BYTES = 25 * 1024 * 1024;
|
|
9
|
+
/**
|
|
10
|
+
* Makes header cells usable as column names: empty → `column_<n>` (1-based position),
|
|
11
|
+
* duplicates → `<name>_2`, `<name>_3`, …; trims whitespace. Returns the names and the
|
|
12
|
+
* notes describing what changed.
|
|
13
|
+
*/
|
|
14
|
+
export function normaliseHeader(cells) {
|
|
15
|
+
const notes = [];
|
|
16
|
+
const seen = new Map();
|
|
17
|
+
const columns = cells.map((raw, index) => {
|
|
18
|
+
let name = (raw ?? '').trim();
|
|
19
|
+
if (name === '') {
|
|
20
|
+
name = `column_${index + 1}`;
|
|
21
|
+
notes.push(`Header cell ${index + 1} is empty; the column is named ${name}.`);
|
|
22
|
+
}
|
|
23
|
+
const count = seen.get(name) ?? 0;
|
|
24
|
+
seen.set(name, count + 1);
|
|
25
|
+
if (count > 0) {
|
|
26
|
+
const renamed = `${name}_${count + 1}`;
|
|
27
|
+
notes.push(`Header "${name}" appears more than once; occurrence ${count + 1} is named ${renamed}.`);
|
|
28
|
+
return renamed;
|
|
29
|
+
}
|
|
30
|
+
return name;
|
|
31
|
+
});
|
|
32
|
+
return { columns, notes };
|
|
33
|
+
}
|
|
34
|
+
/** Rows of cells → row objects over `columns`; short rows are padded with `null`, long rows are trimmed (noted once) */
|
|
35
|
+
export function rowsFromCells(columns, cells, notes) {
|
|
36
|
+
let trimmed = 0;
|
|
37
|
+
const rows = cells.map((row) => {
|
|
38
|
+
if (row.length > columns.length && row.slice(columns.length).some((cell) => cell !== null && cell !== undefined && cell !== '')) {
|
|
39
|
+
trimmed += 1;
|
|
40
|
+
}
|
|
41
|
+
const record = {};
|
|
42
|
+
columns.forEach((column, index) => {
|
|
43
|
+
const value = row[index];
|
|
44
|
+
record[column] = value === undefined || value === '' ? null : value;
|
|
45
|
+
});
|
|
46
|
+
return record;
|
|
47
|
+
});
|
|
48
|
+
if (trimmed > 0) {
|
|
49
|
+
notes.push(`${trimmed} row(s) have more cells than the header has columns; the extra cells were dropped.`);
|
|
50
|
+
}
|
|
51
|
+
return rows;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=dataset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../../../src/core/scaffold/readers/dataset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6BH,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACvC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,IAAI,GAAG,UAAU,KAAK,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,wCAAwC,KAAK,GAAG,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;YACpG,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,aAAa,CAAC,OAAiB,EAAE,KAAkB,EAAE,KAAe;IAClF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;YAChI,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,oFAAoF,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `readDataset(path)`: the one entry the scaffold uses for `--data` and `--sample`
|
|
3
|
+
* (plan §8.11 Inference). Dispatches on the extension — `.csv` / `.tsv` / `.txt`
|
|
4
|
+
* (CSV, delimiter detected; `.tsv` forces a tab), `.json` / `.jsonc` / `.json5`,
|
|
5
|
+
* `.xlsx` — applies the dataset size cap, and reads the file.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
8
|
+
import { extname, resolve } from 'node:path';
|
|
9
|
+
import { CapabilityError } from '../../envelope.js';
|
|
10
|
+
import { readCsvDataset } from './csv.js';
|
|
11
|
+
import { DATASET_MAX_BYTES } from './dataset.js';
|
|
12
|
+
import { readJsonDataset } from './json.js';
|
|
13
|
+
import { readXlsxDataset } from './xlsx.js';
|
|
14
|
+
export { DATASET_MAX_BYTES } from './dataset.js';
|
|
15
|
+
export const DATASET_EXTENSIONS = {
|
|
16
|
+
'.csv': 'csv',
|
|
17
|
+
'.tsv': 'csv',
|
|
18
|
+
'.txt': 'csv',
|
|
19
|
+
'.json': 'json',
|
|
20
|
+
'.jsonc': 'json',
|
|
21
|
+
'.json5': 'json',
|
|
22
|
+
'.xlsx': 'xlsx',
|
|
23
|
+
};
|
|
24
|
+
export function datasetFormatOf(path) {
|
|
25
|
+
return DATASET_EXTENSIONS[extname(path).toLowerCase()];
|
|
26
|
+
}
|
|
27
|
+
function formatBytes(bytes) {
|
|
28
|
+
return bytes >= 1024 * 1024 ? `${(bytes / 1024 / 1024).toFixed(1)} MB` : `${Math.ceil(bytes / 1024)} kB`;
|
|
29
|
+
}
|
|
30
|
+
export async function readDataset(path, options = {}) {
|
|
31
|
+
const file = resolve(path);
|
|
32
|
+
const ext = extname(file).toLowerCase();
|
|
33
|
+
const format = datasetFormatOf(file);
|
|
34
|
+
const role = options.role ?? 'data';
|
|
35
|
+
if (!format) {
|
|
36
|
+
const legacy = ext === '.xls' ? ' Legacy .xls workbooks are not supported; re-save as .xlsx.' : '';
|
|
37
|
+
throw new CapabilityError('USAGE', `${path}: unsupported ${role} file type "${ext || '(none)'}".`, `Pass a .csv, .tsv, .json or .xlsx file.${legacy}`);
|
|
38
|
+
}
|
|
39
|
+
if (role === 'sample' && format !== 'json') {
|
|
40
|
+
throw new CapabilityError('USAGE', `${path}: --sample takes a JSON array; for a ${format.toUpperCase()} file use --data.`, 'Pass the file with --data, or save the sample as JSON.');
|
|
41
|
+
}
|
|
42
|
+
let size;
|
|
43
|
+
try {
|
|
44
|
+
size = statSync(file).size;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new CapabilityError('NOT_FOUND', `${path} does not exist or is not readable.`, 'Pass the path of a CSV, JSON or XLSX file.');
|
|
48
|
+
}
|
|
49
|
+
const maxBytes = options.maxBytes ?? DATASET_MAX_BYTES;
|
|
50
|
+
if (size > maxBytes) {
|
|
51
|
+
throw new CapabilityError('INPUT_TOO_LARGE', `${path} is ${formatBytes(size)}; scaffold datasets are capped at ${formatBytes(maxBytes)}.`, 'Pass a representative subset (the first few thousand rows are enough to infer columns) and point rowData at the full source afterwards.');
|
|
52
|
+
}
|
|
53
|
+
if (format === 'xlsx') {
|
|
54
|
+
return readXlsxDataset(file);
|
|
55
|
+
}
|
|
56
|
+
const text = readFileSync(file, 'utf8');
|
|
57
|
+
if (format === 'json') {
|
|
58
|
+
return readJsonDataset(text, file);
|
|
59
|
+
}
|
|
60
|
+
return readCsvDataset(text, file, { delimiter: options.delimiter ?? (ext === '.tsv' ? '\t' : undefined) });
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/scaffold/readers/index.ts"],"names":[],"mappings":"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"}
|