kirograph 0.16.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +103 -1605
- package/dist/architecture/layers/dart.js +112 -0
- package/dist/architecture/layers/dart.js.map +7 -0
- package/dist/architecture/layers/index.js +3 -1
- package/dist/architecture/layers/index.js.map +2 -2
- package/dist/bin/banner.js +74 -6
- package/dist/bin/banner.js.map +2 -2
- package/dist/bin/commands/affected.js +40 -5
- package/dist/bin/commands/affected.js.map +2 -2
- package/dist/bin/commands/attack-surface.js +157 -0
- package/dist/bin/commands/attack-surface.js.map +7 -0
- package/dist/bin/commands/benchmark.js +206 -0
- package/dist/bin/commands/benchmark.js.map +7 -0
- package/dist/bin/commands/budget.js +70 -0
- package/dist/bin/commands/budget.js.map +7 -0
- package/dist/bin/commands/communities.js +77 -0
- package/dist/bin/commands/communities.js.map +7 -0
- package/dist/bin/commands/data.js +665 -0
- package/dist/bin/commands/data.js.map +7 -0
- package/dist/bin/commands/dep-confusion.js +119 -0
- package/dist/bin/commands/dep-confusion.js.map +7 -0
- package/dist/bin/commands/export.js +304 -10
- package/dist/bin/commands/export.js.map +2 -2
- package/dist/bin/commands/flows.js +97 -0
- package/dist/bin/commands/flows.js.map +7 -0
- package/dist/bin/commands/help.js +386 -100
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/install.js +90 -8
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/licenses.js +201 -0
- package/dist/bin/commands/licenses.js.map +7 -0
- package/dist/bin/commands/reachability.js +160 -0
- package/dist/bin/commands/reachability.js.map +7 -0
- package/dist/bin/commands/read.js +100 -0
- package/dist/bin/commands/read.js.map +7 -0
- package/dist/bin/commands/refactor.js +116 -0
- package/dist/bin/commands/refactor.js.map +7 -0
- package/dist/bin/commands/remediation.js +133 -0
- package/dist/bin/commands/remediation.js.map +7 -0
- package/dist/bin/commands/sbom.js +76 -0
- package/dist/bin/commands/sbom.js.map +7 -0
- package/dist/bin/commands/security-ci-report.js +267 -0
- package/dist/bin/commands/security-ci-report.js.map +7 -0
- package/dist/bin/commands/security-export.js +1349 -0
- package/dist/bin/commands/security-export.js.map +7 -0
- package/dist/bin/commands/security-flows.js +126 -0
- package/dist/bin/commands/security-flows.js.map +7 -0
- package/dist/bin/commands/security-secrets.js +170 -0
- package/dist/bin/commands/security-secrets.js.map +7 -0
- package/dist/bin/commands/security.js +193 -0
- package/dist/bin/commands/security.js.map +7 -0
- package/dist/bin/commands/staleness.js +144 -0
- package/dist/bin/commands/staleness.js.map +7 -0
- package/dist/bin/commands/status.js +102 -2
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/supply-chain.js +138 -0
- package/dist/bin/commands/supply-chain.js.map +7 -0
- package/dist/bin/commands/uninit.js +109 -60
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/vex.js +76 -0
- package/dist/bin/commands/vex.js.map +7 -0
- package/dist/bin/commands/vuln-suppress.js +95 -0
- package/dist/bin/commands/vuln-suppress.js.map +7 -0
- package/dist/bin/commands/vulns.js +382 -0
- package/dist/bin/commands/vulns.js.map +7 -0
- package/dist/bin/installer/auto-detect.js +125 -0
- package/dist/bin/installer/auto-detect.js.map +7 -0
- package/dist/bin/installer/cli-agent.js +28 -5
- package/dist/bin/installer/cli-agent.js.map +2 -2
- package/dist/bin/installer/common.js +47 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +39 -1
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/detect.js +309 -0
- package/dist/bin/installer/detect.js.map +7 -0
- package/dist/bin/installer/index.js +36 -1
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +195 -3
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/steering.js +440 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.js +35 -6
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.js +49 -5
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.js +32 -6
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.js +64 -12
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.js +2 -2
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.js +101 -0
- package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
- package/dist/bin/installer/targets/copilot.js +31 -5
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.js +4 -4
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.js +2 -2
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.js +2 -2
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.js +2 -14
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.js +3 -3
- package/dist/bin/installer/targets/goose.js.map +2 -2
- package/dist/bin/installer/targets/index.js +250 -0
- package/dist/bin/installer/targets/index.js.map +2 -2
- package/dist/bin/installer/targets/junie.js +2 -2
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.js +2 -2
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.js +3 -3
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.js +2 -2
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.js +91 -0
- package/dist/bin/installer/targets/qoder.js.map +7 -0
- package/dist/bin/installer/targets/qwen.js +96 -0
- package/dist/bin/installer/targets/qwen.js.map +7 -0
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.js +2 -2
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.js +5 -5
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.js +2 -2
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.js +35 -6
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +74 -6
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/bin/progress.js +30 -0
- package/dist/bin/progress.js.map +2 -2
- package/dist/compression/naive-cost.js +25 -0
- package/dist/compression/naive-cost.js.map +2 -2
- package/dist/compression/tracker.js +91 -2
- package/dist/compression/tracker.js.map +2 -2
- package/dist/compression/types.js.map +1 -1
- package/dist/config.js +126 -3
- package/dist/config.js.map +2 -2
- package/dist/core/pipeline.js +92 -4
- package/dist/core/pipeline.js.map +2 -2
- package/dist/data/filters.js +105 -0
- package/dist/data/filters.js.map +7 -0
- package/dist/data/indexer.js +225 -0
- package/dist/data/indexer.js.map +7 -0
- package/dist/data/linker.js +150 -0
- package/dist/data/linker.js.map +7 -0
- package/dist/data/lint.js +109 -0
- package/dist/data/lint.js.map +7 -0
- package/dist/data/parsers/csv.js +132 -0
- package/dist/data/parsers/csv.js.map +7 -0
- package/dist/data/parsers/excel.js +88 -0
- package/dist/data/parsers/excel.js.map +7 -0
- package/dist/data/parsers/index.js +79 -0
- package/dist/data/parsers/index.js.map +7 -0
- package/dist/data/parsers/json-array.js +89 -0
- package/dist/data/parsers/json-array.js.map +7 -0
- package/dist/data/parsers/jsonl.js +84 -0
- package/dist/data/parsers/jsonl.js.map +7 -0
- package/dist/data/parsers/parquet.js +95 -0
- package/dist/data/parsers/parquet.js.map +7 -0
- package/dist/data/profiler.js +182 -0
- package/dist/data/profiler.js.map +7 -0
- package/dist/data/queries.js +512 -0
- package/dist/data/queries.js.map +7 -0
- package/dist/data/types.js +17 -0
- package/dist/data/types.js.map +7 -0
- package/dist/db/data-schema.sql +61 -0
- package/dist/db/database.js +67 -5
- package/dist/db/database.js.map +2 -2
- package/dist/db/memory-schema.sql +5 -1
- package/dist/db/schema.sql +3 -1
- package/dist/db/security-schema.sql +72 -0
- package/dist/extraction/extractor.js +81 -0
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.js +32 -8
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.js +43 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/extraction/notebook.js +300 -0
- package/dist/extraction/notebook.js.map +7 -0
- package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
- package/dist/frameworks/flutter.js +130 -0
- package/dist/frameworks/flutter.js.map +7 -0
- package/dist/frameworks/index.js +7 -1
- package/dist/frameworks/index.js.map +3 -3
- package/dist/graph/communities.js +317 -0
- package/dist/graph/communities.js.map +7 -0
- package/dist/graph/flows.js +138 -0
- package/dist/graph/flows.js.map +7 -0
- package/dist/graph/refactor.js +155 -0
- package/dist/graph/refactor.js.map +7 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mcp/cache.js +172 -0
- package/dist/mcp/cache.js.map +7 -0
- package/dist/mcp/read-modes.js +295 -0
- package/dist/mcp/read-modes.js.map +7 -0
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.js +29 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +1588 -6
- package/dist/mcp/tools.js.map +3 -3
- package/dist/memory/database.js +32 -2
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/resolution/bridges/android-rn.js +298 -0
- package/dist/resolution/bridges/android-rn.js.map +7 -0
- package/dist/resolution/bridges/expo-modules.js +155 -0
- package/dist/resolution/bridges/expo-modules.js.map +7 -0
- package/dist/resolution/bridges/flutter-channel.js +385 -0
- package/dist/resolution/bridges/flutter-channel.js.map +7 -0
- package/dist/resolution/bridges/index.js +80 -0
- package/dist/resolution/bridges/index.js.map +7 -0
- package/dist/resolution/bridges/native-events.js +188 -0
- package/dist/resolution/bridges/native-events.js.map +7 -0
- package/dist/resolution/bridges/native-views.js +244 -0
- package/dist/resolution/bridges/native-views.js.map +7 -0
- package/dist/resolution/bridges/react-native.js +161 -0
- package/dist/resolution/bridges/react-native.js.map +7 -0
- package/dist/resolution/bridges/swift-objc.js +227 -0
- package/dist/resolution/bridges/swift-objc.js.map +7 -0
- package/dist/resolution/bridges/turbomodules.js +216 -0
- package/dist/resolution/bridges/turbomodules.js.map +7 -0
- package/dist/resolution/index.js +61 -2
- package/dist/resolution/index.js.map +2 -2
- package/dist/security/attack-surface.js +164 -0
- package/dist/security/attack-surface.js.map +7 -0
- package/dist/security/context-warnings.js +123 -0
- package/dist/security/context-warnings.js.map +7 -0
- package/dist/security/context-warnings.test.js +300 -0
- package/dist/security/context-warnings.test.js.map +7 -0
- package/dist/security/data-flows.js +228 -0
- package/dist/security/data-flows.js.map +7 -0
- package/dist/security/dep-confusion.js +255 -0
- package/dist/security/dep-confusion.js.map +7 -0
- package/dist/security/errors.js +51 -0
- package/dist/security/errors.js.map +7 -0
- package/dist/security/export/fix-suggestions.js +58 -0
- package/dist/security/export/fix-suggestions.js.map +7 -0
- package/dist/security/export/fix-suggestions.test.js +74 -0
- package/dist/security/export/fix-suggestions.test.js.map +7 -0
- package/dist/security/export/sbom.js +230 -0
- package/dist/security/export/sbom.js.map +7 -0
- package/dist/security/export/sbom.test.js +288 -0
- package/dist/security/export/sbom.test.js.map +7 -0
- package/dist/security/export/serialization.js +142 -0
- package/dist/security/export/serialization.js.map +7 -0
- package/dist/security/export/serialization.test.js +310 -0
- package/dist/security/export/serialization.test.js.map +7 -0
- package/dist/security/export/vex.js +220 -0
- package/dist/security/export/vex.js.map +7 -0
- package/dist/security/export/vex.test.js +278 -0
- package/dist/security/export/vex.test.js.map +7 -0
- package/dist/security/index.js +67 -0
- package/dist/security/index.js.map +7 -0
- package/dist/security/integrator-transitives.test.js +359 -0
- package/dist/security/integrator-transitives.test.js.map +7 -0
- package/dist/security/integrator.js +491 -0
- package/dist/security/integrator.js.map +7 -0
- package/dist/security/integrator.test.js +237 -0
- package/dist/security/integrator.test.js.map +7 -0
- package/dist/security/license.js +70 -0
- package/dist/security/license.js.map +7 -0
- package/dist/security/manifest/adapter.js +243 -0
- package/dist/security/manifest/adapter.js.map +7 -0
- package/dist/security/manifest/adapter.test.js +272 -0
- package/dist/security/manifest/adapter.test.js.map +7 -0
- package/dist/security/manifest/parser.js +376 -0
- package/dist/security/manifest/parser.js.map +7 -0
- package/dist/security/manifest/parser.test.js +110 -0
- package/dist/security/manifest/parser.test.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.js +233 -0
- package/dist/security/manifest/plugins/cargo.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.test.js +304 -0
- package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
- package/dist/security/manifest/plugins/composer.js +152 -0
- package/dist/security/manifest/plugins/composer.js.map +7 -0
- package/dist/security/manifest/plugins/go.js +146 -0
- package/dist/security/manifest/plugins/go.js.map +7 -0
- package/dist/security/manifest/plugins/go.test.js +341 -0
- package/dist/security/manifest/plugins/go.test.js.map +7 -0
- package/dist/security/manifest/plugins/gradle.js +159 -0
- package/dist/security/manifest/plugins/gradle.js.map +7 -0
- package/dist/security/manifest/plugins/hex.js +159 -0
- package/dist/security/manifest/plugins/hex.js.map +7 -0
- package/dist/security/manifest/plugins/maven.js +128 -0
- package/dist/security/manifest/plugins/maven.js.map +7 -0
- package/dist/security/manifest/plugins/maven.test.js +389 -0
- package/dist/security/manifest/plugins/maven.test.js.map +7 -0
- package/dist/security/manifest/plugins/npm.js +284 -0
- package/dist/security/manifest/plugins/npm.js.map +7 -0
- package/dist/security/manifest/plugins/npm.test.js +298 -0
- package/dist/security/manifest/plugins/npm.test.js.map +7 -0
- package/dist/security/manifest/plugins/nuget.js +186 -0
- package/dist/security/manifest/plugins/nuget.js.map +7 -0
- package/dist/security/manifest/plugins/pip.js +123 -0
- package/dist/security/manifest/plugins/pip.js.map +7 -0
- package/dist/security/manifest/plugins/pip.test.js +208 -0
- package/dist/security/manifest/plugins/pip.test.js.map +7 -0
- package/dist/security/manifest/plugins/pubspec.js +212 -0
- package/dist/security/manifest/plugins/pubspec.js.map +7 -0
- package/dist/security/manifest/plugins/pyproject.js +261 -0
- package/dist/security/manifest/plugins/pyproject.js.map +7 -0
- package/dist/security/manifest/plugins/rubygems.js +185 -0
- package/dist/security/manifest/plugins/rubygems.js.map +7 -0
- package/dist/security/manifest/plugins/swift.js +200 -0
- package/dist/security/manifest/plugins/swift.js.map +7 -0
- package/dist/security/owasp.js +104 -0
- package/dist/security/owasp.js.map +7 -0
- package/dist/security/pipeline.js +125 -0
- package/dist/security/pipeline.js.map +7 -0
- package/dist/security/reachability.js +276 -0
- package/dist/security/reachability.js.map +7 -0
- package/dist/security/reachability.test.js +394 -0
- package/dist/security/reachability.test.js.map +7 -0
- package/dist/security/remediation.js +126 -0
- package/dist/security/remediation.js.map +7 -0
- package/dist/security/secrets.js +176 -0
- package/dist/security/secrets.js.map +7 -0
- package/dist/security/staleness.js +231 -0
- package/dist/security/staleness.js.map +7 -0
- package/dist/security/supply-chain.js +301 -0
- package/dist/security/supply-chain.js.map +7 -0
- package/dist/security/suppressions.js +106 -0
- package/dist/security/suppressions.js.map +7 -0
- package/dist/security/types.js +17 -0
- package/dist/security/types.js.map +7 -0
- package/dist/security/vuln/client.js +355 -0
- package/dist/security/vuln/client.js.map +7 -0
- package/dist/security/vuln/client.test.js +288 -0
- package/dist/security/vuln/client.test.js.map +7 -0
- package/dist/security/vuln/epss-client.js +95 -0
- package/dist/security/vuln/epss-client.js.map +7 -0
- package/dist/security/vuln/index.js +29 -0
- package/dist/security/vuln/index.js.map +7 -0
- package/dist/security/vuln/osv-adapter.js +321 -0
- package/dist/security/vuln/osv-adapter.js.map +7 -0
- package/dist/security/vuln/osv-adapter.test.js +391 -0
- package/dist/security/vuln/osv-adapter.test.js.map +7 -0
- package/dist/security/vuln/types.js +17 -0
- package/dist/security/vuln/types.js.map +7 -0
- package/dist/types.js.map +2 -2
- package/package.json +5 -2
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var linker_exports = {};
|
|
20
|
+
__export(linker_exports, {
|
|
21
|
+
DataCodeLinker: () => DataCodeLinker,
|
|
22
|
+
detectDataReferences: () => detectDataReferences
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(linker_exports);
|
|
25
|
+
const READ_PATTERNS = [
|
|
26
|
+
// Node.js / TypeScript
|
|
27
|
+
/readFileSync\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
28
|
+
/readFile\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
29
|
+
/createReadStream\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
30
|
+
// Python pandas
|
|
31
|
+
/read_csv\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
32
|
+
/read_excel\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
33
|
+
/read_json\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
34
|
+
/read_parquet\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
35
|
+
/read_table\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
36
|
+
// Python open
|
|
37
|
+
/open\s*\(\s*['"`]([^'"`]+\.(?:csv|tsv|jsonl|ndjson|json|xlsx|xls|parquet))['"`]/g,
|
|
38
|
+
// SQL COPY
|
|
39
|
+
/COPY\s+\w+\s+FROM\s+['"`]([^'"`]+)['"`]/gi,
|
|
40
|
+
/\\copy\s+\w+\s+from\s+['"`]([^'"`]+)['"`]/gi,
|
|
41
|
+
// Generic path references in strings (data file extensions)
|
|
42
|
+
/['"`]((?:\.\.?\/)?(?:[\w\-./]+\/)?[\w\-]+\.(?:csv|tsv|jsonl|ndjson|xlsx|xls|parquet))['"`]/g
|
|
43
|
+
];
|
|
44
|
+
const WRITE_PATTERNS = [
|
|
45
|
+
/writeFileSync\s*\(\s*['"`]([^'"`]+\.(?:csv|tsv|jsonl|json|xlsx|parquet))['"`]/g,
|
|
46
|
+
/writeFile\s*\(\s*['"`]([^'"`]+\.(?:csv|tsv|jsonl|json|xlsx|parquet))['"`]/g,
|
|
47
|
+
/to_csv\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
48
|
+
/to_excel\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
49
|
+
/to_json\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
50
|
+
/to_parquet\s*\(\s*['"`]([^'"`]+)['"`]/g,
|
|
51
|
+
/createWriteStream\s*\(\s*['"`]([^'"`]+\.(?:csv|tsv|jsonl|json|xlsx|parquet))['"`]/g,
|
|
52
|
+
/COPY\s+\w+\s+TO\s+['"`]([^'"`]+)['"`]/gi
|
|
53
|
+
];
|
|
54
|
+
function detectDataReferences(sourceContent, knownDataPaths) {
|
|
55
|
+
const refs = /* @__PURE__ */ new Map();
|
|
56
|
+
for (const pattern of READ_PATTERNS) {
|
|
57
|
+
pattern.lastIndex = 0;
|
|
58
|
+
let match;
|
|
59
|
+
while ((match = pattern.exec(sourceContent)) !== null) {
|
|
60
|
+
const filePath = normalizePath(match[1]);
|
|
61
|
+
if (isDataFilePath(filePath, knownDataPaths)) {
|
|
62
|
+
const existing = refs.get(filePath);
|
|
63
|
+
if (!existing || existing.confidence < 0.9) {
|
|
64
|
+
const confidence = knownDataPaths.has(filePath) ? 1 : 0.7;
|
|
65
|
+
refs.set(filePath, { refType: "reads", confidence });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const pattern of WRITE_PATTERNS) {
|
|
71
|
+
pattern.lastIndex = 0;
|
|
72
|
+
let match;
|
|
73
|
+
while ((match = pattern.exec(sourceContent)) !== null) {
|
|
74
|
+
const filePath = normalizePath(match[1]);
|
|
75
|
+
if (isDataFilePath(filePath, knownDataPaths)) {
|
|
76
|
+
const confidence = knownDataPaths.has(filePath) ? 1 : 0.7;
|
|
77
|
+
refs.set(filePath, { refType: "writes", confidence });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return Array.from(refs.entries()).map(([filePath, info]) => ({
|
|
82
|
+
filePath,
|
|
83
|
+
...info
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
function generateDatasetId(filePath) {
|
|
87
|
+
return filePath.replace(/\.[^.]+$/, "").replace(/[/\\]/g, "-").replace(/[^a-zA-Z0-9-_]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").toLowerCase();
|
|
88
|
+
}
|
|
89
|
+
function normalizePath(p) {
|
|
90
|
+
return p.replace(/^\.\//, "").replace(/\\/g, "/");
|
|
91
|
+
}
|
|
92
|
+
function isDataFilePath(filePath, knownPaths) {
|
|
93
|
+
if (knownPaths.has(filePath)) return true;
|
|
94
|
+
const ext = filePath.split(".").pop()?.toLowerCase();
|
|
95
|
+
return ["csv", "tsv", "jsonl", "ndjson", "json", "xlsx", "xls", "parquet"].includes(ext ?? "");
|
|
96
|
+
}
|
|
97
|
+
class DataCodeLinker {
|
|
98
|
+
constructor(db, projectRoot) {
|
|
99
|
+
this.db = db;
|
|
100
|
+
this.projectRoot = projectRoot;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Populate data_code_refs by scanning source files for data file references.
|
|
104
|
+
* Returns the number of refs created.
|
|
105
|
+
*/
|
|
106
|
+
linkAll() {
|
|
107
|
+
const fs = require("fs");
|
|
108
|
+
const path = require("path");
|
|
109
|
+
const datasets = this.db.all("SELECT id, file_path FROM data_datasets");
|
|
110
|
+
if (datasets.length === 0) return 0;
|
|
111
|
+
const knownPaths = new Set(datasets.map((d) => d.file_path));
|
|
112
|
+
const pathToDatasetId = new Map(datasets.map((d) => [d.file_path, d.id]));
|
|
113
|
+
const sourceFiles = this.db.all(
|
|
114
|
+
`SELECT file_path FROM files WHERE file_path NOT LIKE '%.csv' AND file_path NOT LIKE '%.tsv' AND file_path NOT LIKE '%.jsonl' AND file_path NOT LIKE '%.ndjson' AND file_path NOT LIKE '%.xlsx' AND file_path NOT LIKE '%.parquet'`
|
|
115
|
+
);
|
|
116
|
+
this.db.run("DELETE FROM data_code_refs");
|
|
117
|
+
let refsCreated = 0;
|
|
118
|
+
for (const file of sourceFiles) {
|
|
119
|
+
const absPath = path.join(this.projectRoot, file.file_path);
|
|
120
|
+
let content;
|
|
121
|
+
try {
|
|
122
|
+
content = fs.readFileSync(absPath, "utf-8");
|
|
123
|
+
} catch {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const refs = detectDataReferences(content, knownPaths);
|
|
127
|
+
if (refs.length === 0) continue;
|
|
128
|
+
const qualifiedName = file.file_path;
|
|
129
|
+
for (const ref of refs) {
|
|
130
|
+
const datasetId = pathToDatasetId.get(ref.filePath);
|
|
131
|
+
if (!datasetId) continue;
|
|
132
|
+
try {
|
|
133
|
+
this.db.run(
|
|
134
|
+
`INSERT OR REPLACE INTO data_code_refs (dataset_id, qualified_name, ref_type, confidence) VALUES (?, ?, ?, ?)`,
|
|
135
|
+
[datasetId, qualifiedName, ref.refType, ref.confidence]
|
|
136
|
+
);
|
|
137
|
+
refsCreated++;
|
|
138
|
+
} catch {
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return refsCreated;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
146
|
+
0 && (module.exports = {
|
|
147
|
+
DataCodeLinker,
|
|
148
|
+
detectDataReferences
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=linker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/data/linker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Data \u2194 Code Linker\n *\n * Detects references to data files in source code and populates data_code_refs.\n * Patterns detected:\n * - readFileSync('data/users.csv'), readFile('path/to/file.csv')\n * - pd.read_csv('data/file.csv'), pd.read_excel(...)\n * - open('data/file.csv'), csv.reader(open(...))\n * - COPY FROM 'file.csv', \\copy ... from 'file.csv'\n * - require('./data/file.json'), import ... from './data/file.json'\n * - fs.createReadStream('data/file.csv')\n * - String literals matching known data file paths\n */\n\nimport type { DataCodeRef } from './types';\n\n/** Patterns that indicate a code symbol reads a data file */\nconst READ_PATTERNS = [\n // Node.js / TypeScript\n /readFileSync\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /readFile\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /createReadStream\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n // Python pandas\n /read_csv\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /read_excel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /read_json\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /read_parquet\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /read_table\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n // Python open\n /open\\s*\\(\\s*['\"`]([^'\"`]+\\.(?:csv|tsv|jsonl|ndjson|json|xlsx|xls|parquet))['\"`]/g,\n // SQL COPY\n /COPY\\s+\\w+\\s+FROM\\s+['\"`]([^'\"`]+)['\"`]/gi,\n /\\\\copy\\s+\\w+\\s+from\\s+['\"`]([^'\"`]+)['\"`]/gi,\n // Generic path references in strings (data file extensions)\n /['\"`]((?:\\.\\.?\\/)?(?:[\\w\\-./]+\\/)?[\\w\\-]+\\.(?:csv|tsv|jsonl|ndjson|xlsx|xls|parquet))['\"`]/g,\n];\n\n/** Patterns that indicate a code symbol writes a data file */\nconst WRITE_PATTERNS = [\n /writeFileSync\\s*\\(\\s*['\"`]([^'\"`]+\\.(?:csv|tsv|jsonl|json|xlsx|parquet))['\"`]/g,\n /writeFile\\s*\\(\\s*['\"`]([^'\"`]+\\.(?:csv|tsv|jsonl|json|xlsx|parquet))['\"`]/g,\n /to_csv\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /to_excel\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /to_json\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /to_parquet\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/g,\n /createWriteStream\\s*\\(\\s*['\"`]([^'\"`]+\\.(?:csv|tsv|jsonl|json|xlsx|parquet))['\"`]/g,\n /COPY\\s+\\w+\\s+TO\\s+['\"`]([^'\"`]+)['\"`]/gi,\n];\n\n/**\n * Scan source code content for references to data files.\n * Returns matched file paths with their reference type.\n */\nexport function detectDataReferences(\n sourceContent: string,\n knownDataPaths: Set<string>,\n): Array<{ filePath: string; refType: 'reads' | 'writes'; confidence: number }> {\n const refs = new Map<string, { refType: 'reads' | 'writes'; confidence: number }>();\n\n // Check read patterns\n for (const pattern of READ_PATTERNS) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(sourceContent)) !== null) {\n const filePath = normalizePath(match[1]!);\n if (isDataFilePath(filePath, knownDataPaths)) {\n const existing = refs.get(filePath);\n if (!existing || existing.confidence < 0.9) {\n const confidence = knownDataPaths.has(filePath) ? 1.0 : 0.7;\n refs.set(filePath, { refType: 'reads', confidence });\n }\n }\n }\n }\n\n // Check write patterns\n for (const pattern of WRITE_PATTERNS) {\n pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(sourceContent)) !== null) {\n const filePath = normalizePath(match[1]!);\n if (isDataFilePath(filePath, knownDataPaths)) {\n const confidence = knownDataPaths.has(filePath) ? 1.0 : 0.7;\n refs.set(filePath, { refType: 'writes', confidence });\n }\n }\n }\n\n return Array.from(refs.entries()).map(([filePath, info]) => ({\n filePath,\n ...info,\n }));\n}\n\n/**\n * Generate dataset ID from a file path (same logic as indexer).\n */\nfunction generateDatasetId(filePath: string): string {\n return filePath\n .replace(/\\.[^.]+$/, '')\n .replace(/[/\\\\]/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n}\n\n/**\n * Normalize a path reference found in code.\n * Strips leading ./ and resolves simple relative paths.\n */\nfunction normalizePath(p: string): string {\n return p.replace(/^\\.\\//, '').replace(/\\\\/g, '/');\n}\n\n/**\n * Check if a path looks like a data file (by extension or known path match).\n */\nfunction isDataFilePath(filePath: string, knownPaths: Set<string>): boolean {\n if (knownPaths.has(filePath)) return true;\n // Check extension\n const ext = filePath.split('.').pop()?.toLowerCase();\n return ['csv', 'tsv', 'jsonl', 'ndjson', 'json', 'xlsx', 'xls', 'parquet'].includes(ext ?? '');\n}\n\n/**\n * Link data files to code symbols.\n * Scans all indexed source files for references to known data file paths.\n */\nexport class DataCodeLinker {\n private readonly db: any;\n private readonly projectRoot: string;\n\n constructor(db: any, projectRoot: string) {\n this.db = db;\n this.projectRoot = projectRoot;\n }\n\n /**\n * Populate data_code_refs by scanning source files for data file references.\n * Returns the number of refs created.\n */\n linkAll(): number {\n const fs = require('fs');\n const path = require('path');\n\n // Get all known data file paths\n const datasets = this.db.all('SELECT id, file_path FROM data_datasets') as Array<{ id: string; file_path: string }>;\n if (datasets.length === 0) return 0;\n\n const knownPaths = new Set(datasets.map(d => d.file_path));\n const pathToDatasetId = new Map(datasets.map(d => [d.file_path, d.id]));\n\n // Get all indexed source files (from the graph)\n const sourceFiles = this.db.all(\n `SELECT file_path FROM files WHERE file_path NOT LIKE '%.csv' AND file_path NOT LIKE '%.tsv' AND file_path NOT LIKE '%.jsonl' AND file_path NOT LIKE '%.ndjson' AND file_path NOT LIKE '%.xlsx' AND file_path NOT LIKE '%.parquet'`\n ) as Array<{ file_path: string }>;\n\n // Clear existing refs\n this.db.run('DELETE FROM data_code_refs');\n\n let refsCreated = 0;\n\n for (const file of sourceFiles) {\n const absPath = path.join(this.projectRoot, file.file_path);\n let content: string;\n try {\n content = fs.readFileSync(absPath, 'utf-8');\n } catch {\n continue;\n }\n\n const refs = detectDataReferences(content, knownPaths);\n if (refs.length === 0) continue;\n\n // Find the qualified_name of the containing symbol (file-level)\n // Use the file path as the qualified name for file-level refs\n const qualifiedName = file.file_path;\n\n for (const ref of refs) {\n const datasetId = pathToDatasetId.get(ref.filePath);\n if (!datasetId) continue;\n\n try {\n this.db.run(\n `INSERT OR REPLACE INTO data_code_refs (dataset_id, qualified_name, ref_type, confidence) VALUES (?, ?, ?, ?)`,\n [datasetId, qualifiedName, ref.refType, ref.confidence],\n );\n refsCreated++;\n } catch {\n // Ignore duplicates\n }\n }\n }\n\n return refsCreated;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var lint_exports = {};
|
|
30
|
+
__export(lint_exports, {
|
|
31
|
+
DataLinter: () => DataLinter
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(lint_exports);
|
|
34
|
+
var fs = __toESM(require("fs"));
|
|
35
|
+
var path = __toESM(require("path"));
|
|
36
|
+
var crypto = __toESM(require("crypto"));
|
|
37
|
+
class DataLinter {
|
|
38
|
+
constructor(db, projectRoot) {
|
|
39
|
+
this.db = db;
|
|
40
|
+
this.projectRoot = projectRoot;
|
|
41
|
+
}
|
|
42
|
+
lint() {
|
|
43
|
+
const issues = [];
|
|
44
|
+
const datasets = this.db.all("SELECT * FROM data_datasets");
|
|
45
|
+
let healthy = 0;
|
|
46
|
+
for (const ds of datasets) {
|
|
47
|
+
const dsIssues = [];
|
|
48
|
+
const absPath = path.join(this.projectRoot, ds.file_path);
|
|
49
|
+
if (!fs.existsSync(absPath)) {
|
|
50
|
+
dsIssues.push({ severity: "error", dataset: ds.id, message: `Source file missing: ${ds.file_path}` });
|
|
51
|
+
} else {
|
|
52
|
+
try {
|
|
53
|
+
const content = fs.readFileSync(absPath);
|
|
54
|
+
const currentHash = crypto.createHash("sha256").update(content).digest("hex");
|
|
55
|
+
if (currentHash !== ds.content_hash) {
|
|
56
|
+
dsIssues.push({ severity: "warning", dataset: ds.id, message: `Content changed since last index (hash mismatch). Run kirograph data reindex.` });
|
|
57
|
+
}
|
|
58
|
+
} catch {
|
|
59
|
+
dsIssues.push({ severity: "warning", dataset: ds.id, message: `Cannot read source file: ${ds.file_path}` });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const tableName = `data_rows_${ds.id.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
63
|
+
try {
|
|
64
|
+
const countRow = this.db.get(`SELECT COUNT(*) as cnt FROM "${tableName}"`);
|
|
65
|
+
const actualRows = countRow?.cnt ?? 0;
|
|
66
|
+
if (actualRows !== ds.row_count) {
|
|
67
|
+
dsIssues.push({ severity: "error", dataset: ds.id, message: `Row count mismatch: metadata says ${ds.row_count}, table has ${actualRows}` });
|
|
68
|
+
}
|
|
69
|
+
} catch {
|
|
70
|
+
dsIssues.push({ severity: "error", dataset: ds.id, message: `Row table "${tableName}" does not exist` });
|
|
71
|
+
}
|
|
72
|
+
const profileCount = this.db.get("SELECT COUNT(*) as cnt FROM data_columns WHERE dataset_id = ?", [ds.id])?.cnt ?? 0;
|
|
73
|
+
if (profileCount !== ds.column_count) {
|
|
74
|
+
dsIssues.push({ severity: "warning", dataset: ds.id, message: `Column count mismatch: metadata says ${ds.column_count}, profiles has ${profileCount}` });
|
|
75
|
+
}
|
|
76
|
+
if (dsIssues.length === 0) {
|
|
77
|
+
healthy++;
|
|
78
|
+
}
|
|
79
|
+
issues.push(...dsIssues);
|
|
80
|
+
}
|
|
81
|
+
const orphanRefs = this.db.all(`
|
|
82
|
+
SELECT r.dataset_id, r.qualified_name FROM data_code_refs r
|
|
83
|
+
LEFT JOIN data_datasets d ON r.dataset_id = d.id
|
|
84
|
+
WHERE d.id IS NULL
|
|
85
|
+
`);
|
|
86
|
+
if (orphanRefs.length > 0) {
|
|
87
|
+
issues.push({ severity: "warning", message: `${orphanRefs.length} orphan code ref(s) pointing to deleted datasets` });
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
require.resolve("xlsx");
|
|
91
|
+
} catch {
|
|
92
|
+
const xlsxFiles = this.db.all(`SELECT file_path FROM data_datasets WHERE format IN ('xlsx', 'xls')`);
|
|
93
|
+
if (xlsxFiles.length === 0) {
|
|
94
|
+
issues.push({ severity: "info", message: `Optional dep 'xlsx' not installed. Excel files (.xlsx/.xls) will be skipped during indexing.` });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
require.resolve("parquetjs-lite");
|
|
99
|
+
} catch {
|
|
100
|
+
issues.push({ severity: "info", message: `Optional dep 'parquetjs-lite' not installed. Parquet files will be skipped during indexing.` });
|
|
101
|
+
}
|
|
102
|
+
return { issues, datasetsChecked: datasets.length, healthy };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
106
|
+
0 && (module.exports = {
|
|
107
|
+
DataLinter
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/data/lint.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Data Lint\n *\n * Integrity checks for the data index:\n * - Row count mismatch (stored vs actual table rows)\n * - Schema consistency (columns in profile vs actual table)\n * - Stale datasets (source file deleted or changed)\n * - Missing optional deps (files skipped due to missing xlsx/parquetjs-lite)\n * - Orphan code refs (refs pointing to deleted datasets)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport interface LintIssue {\n severity: 'error' | 'warning' | 'info';\n dataset?: string;\n message: string;\n}\n\nexport interface LintResult {\n issues: LintIssue[];\n datasetsChecked: number;\n healthy: number;\n}\n\nexport class DataLinter {\n private readonly db: any;\n private readonly projectRoot: string;\n\n constructor(db: any, projectRoot: string) {\n this.db = db;\n this.projectRoot = projectRoot;\n }\n\n lint(): LintResult {\n const issues: LintIssue[] = [];\n const datasets = this.db.all('SELECT * FROM data_datasets') as any[];\n let healthy = 0;\n\n for (const ds of datasets) {\n const dsIssues: LintIssue[] = [];\n\n // Check source file exists\n const absPath = path.join(this.projectRoot, ds.file_path);\n if (!fs.existsSync(absPath)) {\n dsIssues.push({ severity: 'error', dataset: ds.id, message: `Source file missing: ${ds.file_path}` });\n } else {\n // Check content hash (stale detection)\n try {\n const content = fs.readFileSync(absPath);\n const currentHash = crypto.createHash('sha256').update(content).digest('hex');\n if (currentHash !== ds.content_hash) {\n dsIssues.push({ severity: 'warning', dataset: ds.id, message: `Content changed since last index (hash mismatch). Run kirograph data reindex.` });\n }\n } catch {\n dsIssues.push({ severity: 'warning', dataset: ds.id, message: `Cannot read source file: ${ds.file_path}` });\n }\n }\n\n // Check row count matches actual table\n const tableName = `data_rows_${ds.id.replace(/[^a-zA-Z0-9_]/g, '_')}`;\n try {\n const countRow = this.db.get(`SELECT COUNT(*) as cnt FROM \"${tableName}\"`);\n const actualRows = countRow?.cnt ?? 0;\n if (actualRows !== ds.row_count) {\n dsIssues.push({ severity: 'error', dataset: ds.id, message: `Row count mismatch: metadata says ${ds.row_count}, table has ${actualRows}` });\n }\n } catch {\n dsIssues.push({ severity: 'error', dataset: ds.id, message: `Row table \"${tableName}\" does not exist` });\n }\n\n // Check column count matches profiles\n const profileCount = this.db.get('SELECT COUNT(*) as cnt FROM data_columns WHERE dataset_id = ?', [ds.id])?.cnt ?? 0;\n if (profileCount !== ds.column_count) {\n dsIssues.push({ severity: 'warning', dataset: ds.id, message: `Column count mismatch: metadata says ${ds.column_count}, profiles has ${profileCount}` });\n }\n\n if (dsIssues.length === 0) {\n healthy++;\n }\n issues.push(...dsIssues);\n }\n\n // Check for orphan code refs\n const orphanRefs = this.db.all(`\n SELECT r.dataset_id, r.qualified_name FROM data_code_refs r\n LEFT JOIN data_datasets d ON r.dataset_id = d.id\n WHERE d.id IS NULL\n `) as any[];\n\n if (orphanRefs.length > 0) {\n issues.push({ severity: 'warning', message: `${orphanRefs.length} orphan code ref(s) pointing to deleted datasets` });\n }\n\n // Check for missing optional deps\n try {\n require.resolve('xlsx');\n } catch {\n // Check if any xlsx/xls files exist in include patterns\n const xlsxFiles = this.db.all(`SELECT file_path FROM data_datasets WHERE format IN ('xlsx', 'xls')`) as any[];\n if (xlsxFiles.length === 0) {\n // Check if there are xlsx files on disk that were skipped\n issues.push({ severity: 'info', message: `Optional dep 'xlsx' not installed. Excel files (.xlsx/.xls) will be skipped during indexing.` });\n }\n }\n\n try {\n require.resolve('parquetjs-lite');\n } catch {\n issues.push({ severity: 'info', message: `Optional dep 'parquetjs-lite' not installed. Parquet files will be skipped during indexing.` });\n }\n\n return { issues, datasetsChecked: datasets.length, healthy };\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,SAAoB;AACpB,WAAsB;AACtB,aAAwB;AAcjB,MAAM,WAAW;AAAA,EAItB,YAAY,IAAS,aAAqB;AACxC,SAAK,KAAK;AACV,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,OAAmB;AACjB,UAAM,SAAsB,CAAC;AAC7B,UAAM,WAAW,KAAK,GAAG,IAAI,6BAA6B;AAC1D,QAAI,UAAU;AAEd,eAAW,MAAM,UAAU;AACzB,YAAM,WAAwB,CAAC;AAG/B,YAAM,UAAU,KAAK,KAAK,KAAK,aAAa,GAAG,SAAS;AACxD,UAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,iBAAS,KAAK,EAAE,UAAU,SAAS,SAAS,GAAG,IAAI,SAAS,wBAAwB,GAAG,SAAS,GAAG,CAAC;AAAA,MACtG,OAAO;AAEL,YAAI;AACF,gBAAM,UAAU,GAAG,aAAa,OAAO;AACvC,gBAAM,cAAc,OAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC5E,cAAI,gBAAgB,GAAG,cAAc;AACnC,qBAAS,KAAK,EAAE,UAAU,WAAW,SAAS,GAAG,IAAI,SAAS,gFAAgF,CAAC;AAAA,UACjJ;AAAA,QACF,QAAQ;AACN,mBAAS,KAAK,EAAE,UAAU,WAAW,SAAS,GAAG,IAAI,SAAS,4BAA4B,GAAG,SAAS,GAAG,CAAC;AAAA,QAC5G;AAAA,MACF;AAGA,YAAM,YAAY,aAAa,GAAG,GAAG,QAAQ,kBAAkB,GAAG,CAAC;AACnE,UAAI;AACF,cAAM,WAAW,KAAK,GAAG,IAAI,gCAAgC,SAAS,GAAG;AACzE,cAAM,aAAa,UAAU,OAAO;AACpC,YAAI,eAAe,GAAG,WAAW;AAC/B,mBAAS,KAAK,EAAE,UAAU,SAAS,SAAS,GAAG,IAAI,SAAS,qCAAqC,GAAG,SAAS,eAAe,UAAU,GAAG,CAAC;AAAA,QAC5I;AAAA,MACF,QAAQ;AACN,iBAAS,KAAK,EAAE,UAAU,SAAS,SAAS,GAAG,IAAI,SAAS,cAAc,SAAS,mBAAmB,CAAC;AAAA,MACzG;AAGA,YAAM,eAAe,KAAK,GAAG,IAAI,iEAAiE,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;AACnH,UAAI,iBAAiB,GAAG,cAAc;AACpC,iBAAS,KAAK,EAAE,UAAU,WAAW,SAAS,GAAG,IAAI,SAAS,wCAAwC,GAAG,YAAY,kBAAkB,YAAY,GAAG,CAAC;AAAA,MACzJ;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB;AAAA,MACF;AACA,aAAO,KAAK,GAAG,QAAQ;AAAA,IACzB;AAGA,UAAM,aAAa,KAAK,GAAG,IAAI;AAAA;AAAA;AAAA;AAAA,KAI9B;AAED,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,KAAK,EAAE,UAAU,WAAW,SAAS,GAAG,WAAW,MAAM,mDAAmD,CAAC;AAAA,IACtH;AAGA,QAAI;AACF,sBAAgB,MAAM;AAAA,IACxB,QAAQ;AAEN,YAAM,YAAY,KAAK,GAAG,IAAI,qEAAqE;AACnG,UAAI,UAAU,WAAW,GAAG;AAE1B,eAAO,KAAK,EAAE,UAAU,QAAQ,SAAS,+FAA+F,CAAC;AAAA,MAC3I;AAAA,IACF;AAEA,QAAI;AACF,sBAAgB,gBAAgB;AAAA,IAClC,QAAQ;AACN,aAAO,KAAK,EAAE,UAAU,QAAQ,SAAS,8FAA8F,CAAC;AAAA,IAC1I;AAEA,WAAO,EAAE,QAAQ,iBAAiB,SAAS,QAAQ,QAAQ;AAAA,EAC7D;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var csv_exports = {};
|
|
30
|
+
__export(csv_exports, {
|
|
31
|
+
csvParser: () => csvParser,
|
|
32
|
+
tsvParser: () => tsvParser
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(csv_exports);
|
|
35
|
+
var fs = __toESM(require("fs"));
|
|
36
|
+
var readline = __toESM(require("readline"));
|
|
37
|
+
const BATCH_SIZE = 1e4;
|
|
38
|
+
function parseCSVLine(line, delimiter) {
|
|
39
|
+
const fields = [];
|
|
40
|
+
let current = "";
|
|
41
|
+
let inQuotes = false;
|
|
42
|
+
for (let i = 0; i < line.length; i++) {
|
|
43
|
+
const char = line[i];
|
|
44
|
+
if (inQuotes) {
|
|
45
|
+
if (char === '"') {
|
|
46
|
+
if (i + 1 < line.length && line[i + 1] === '"') {
|
|
47
|
+
current += '"';
|
|
48
|
+
i++;
|
|
49
|
+
} else {
|
|
50
|
+
inQuotes = false;
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
current += char;
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
if (char === '"') {
|
|
57
|
+
inQuotes = true;
|
|
58
|
+
} else if (char === delimiter) {
|
|
59
|
+
fields.push(current.trim());
|
|
60
|
+
current = "";
|
|
61
|
+
} else {
|
|
62
|
+
current += char;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
fields.push(current.trim());
|
|
67
|
+
return fields;
|
|
68
|
+
}
|
|
69
|
+
function inferValue(raw) {
|
|
70
|
+
if (raw === "" || raw.toLowerCase() === "null" || raw.toLowerCase() === "na" || raw.toLowerCase() === "n/a") return null;
|
|
71
|
+
if (raw.toLowerCase() === "true") return true;
|
|
72
|
+
if (raw.toLowerCase() === "false") return false;
|
|
73
|
+
if (/^-?\d+$/.test(raw)) {
|
|
74
|
+
const n = parseInt(raw, 10);
|
|
75
|
+
if (n >= Number.MIN_SAFE_INTEGER && n <= Number.MAX_SAFE_INTEGER) return n;
|
|
76
|
+
}
|
|
77
|
+
if (/^-?\d+\.\d+$/.test(raw) || /^-?\d+[eE][+-]?\d+$/.test(raw)) {
|
|
78
|
+
const f = parseFloat(raw);
|
|
79
|
+
if (!isNaN(f)) return f;
|
|
80
|
+
}
|
|
81
|
+
return raw;
|
|
82
|
+
}
|
|
83
|
+
async function parseFile(filePath, delimiter, opts) {
|
|
84
|
+
const stream = fs.createReadStream(filePath, { encoding: "utf8" });
|
|
85
|
+
const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
86
|
+
let columns = [];
|
|
87
|
+
let totalRows = 0;
|
|
88
|
+
let batch = [];
|
|
89
|
+
let isHeader = true;
|
|
90
|
+
for await (const line of rl) {
|
|
91
|
+
if (line.trim() === "") continue;
|
|
92
|
+
if (isHeader) {
|
|
93
|
+
columns = parseCSVLine(line, delimiter);
|
|
94
|
+
isHeader = false;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (totalRows >= opts.maxRows) break;
|
|
98
|
+
const values = parseCSVLine(line, delimiter);
|
|
99
|
+
const row = {};
|
|
100
|
+
for (let i = 0; i < columns.length; i++) {
|
|
101
|
+
row[columns[i]] = inferValue(values[i] ?? "");
|
|
102
|
+
}
|
|
103
|
+
batch.push(row);
|
|
104
|
+
totalRows++;
|
|
105
|
+
if (batch.length >= BATCH_SIZE) {
|
|
106
|
+
opts.onBatch(batch, columns);
|
|
107
|
+
batch = [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (batch.length > 0) {
|
|
111
|
+
opts.onBatch(batch, columns);
|
|
112
|
+
}
|
|
113
|
+
return { columns, totalRows };
|
|
114
|
+
}
|
|
115
|
+
const csvParser = {
|
|
116
|
+
name: "csv",
|
|
117
|
+
extensions: [".csv"],
|
|
118
|
+
isAvailable: () => true,
|
|
119
|
+
parse: (filePath, opts) => parseFile(filePath, ",", opts)
|
|
120
|
+
};
|
|
121
|
+
const tsvParser = {
|
|
122
|
+
name: "tsv",
|
|
123
|
+
extensions: [".tsv"],
|
|
124
|
+
isAvailable: () => true,
|
|
125
|
+
parse: (filePath, opts) => parseFile(filePath, " ", opts)
|
|
126
|
+
};
|
|
127
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
128
|
+
0 && (module.exports = {
|
|
129
|
+
csvParser,
|
|
130
|
+
tsvParser
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=csv.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/data/parsers/csv.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * CSV/TSV Streaming Parser\n *\n * Handles: .csv, .tsv\n * Parses line-by-line without loading the full file into memory.\n * Handles quoted fields, newlines within quotes, and various delimiters.\n */\n\nimport * as fs from 'fs';\nimport * as readline from 'readline';\nimport type { DataFormatParser, ParsedRow } from '../types';\n\nconst BATCH_SIZE = 10_000;\n\nfunction parseCSVLine(line: string, delimiter: string): string[] {\n const fields: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n\n if (inQuotes) {\n if (char === '\"') {\n if (i + 1 < line.length && line[i + 1] === '\"') {\n current += '\"';\n i++; // skip escaped quote\n } else {\n inQuotes = false;\n }\n } else {\n current += char;\n }\n } else {\n if (char === '\"') {\n inQuotes = true;\n } else if (char === delimiter) {\n fields.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n }\n fields.push(current.trim());\n return fields;\n}\n\nfunction inferValue(raw: string): string | number | boolean | null {\n if (raw === '' || raw.toLowerCase() === 'null' || raw.toLowerCase() === 'na' || raw.toLowerCase() === 'n/a') return null;\n if (raw.toLowerCase() === 'true') return true;\n if (raw.toLowerCase() === 'false') return false;\n\n // Try integer\n if (/^-?\\d+$/.test(raw)) {\n const n = parseInt(raw, 10);\n if (n >= Number.MIN_SAFE_INTEGER && n <= Number.MAX_SAFE_INTEGER) return n;\n }\n\n // Try float\n if (/^-?\\d+\\.\\d+$/.test(raw) || /^-?\\d+[eE][+-]?\\d+$/.test(raw)) {\n const f = parseFloat(raw);\n if (!isNaN(f)) return f;\n }\n\n return raw;\n}\n\nasync function parseFile(\n filePath: string,\n delimiter: string,\n opts: { maxRows: number; onBatch: (rows: ParsedRow[], columns: string[]) => void },\n): Promise<{ columns: string[]; totalRows: number }> {\n const stream = fs.createReadStream(filePath, { encoding: 'utf8' });\n const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });\n\n let columns: string[] = [];\n let totalRows = 0;\n let batch: ParsedRow[] = [];\n let isHeader = true;\n\n for await (const line of rl) {\n if (line.trim() === '') continue;\n\n if (isHeader) {\n columns = parseCSVLine(line, delimiter);\n isHeader = false;\n continue;\n }\n\n if (totalRows >= opts.maxRows) break;\n\n const values = parseCSVLine(line, delimiter);\n const row: ParsedRow = {};\n for (let i = 0; i < columns.length; i++) {\n row[columns[i]] = inferValue(values[i] ?? '');\n }\n\n batch.push(row);\n totalRows++;\n\n if (batch.length >= BATCH_SIZE) {\n opts.onBatch(batch, columns);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n opts.onBatch(batch, columns);\n }\n\n return { columns, totalRows };\n}\n\nexport const csvParser: DataFormatParser = {\n name: 'csv',\n extensions: ['.csv'],\n isAvailable: () => true,\n parse: (filePath, opts) => parseFile(filePath, ',', opts),\n};\n\nexport const tsvParser: DataFormatParser = {\n name: 'tsv',\n extensions: ['.tsv'],\n isAvailable: () => true,\n parse: (filePath, opts) => parseFile(filePath, '\\t', opts),\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var excel_exports = {};
|
|
20
|
+
__export(excel_exports, {
|
|
21
|
+
excelParser: () => excelParser
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(excel_exports);
|
|
24
|
+
const BATCH_SIZE = 1e4;
|
|
25
|
+
let xlsxModule = null;
|
|
26
|
+
let xlsxChecked = false;
|
|
27
|
+
function tryLoadXlsx() {
|
|
28
|
+
if (xlsxChecked) return xlsxModule !== null;
|
|
29
|
+
xlsxChecked = true;
|
|
30
|
+
try {
|
|
31
|
+
xlsxModule = require("xlsx");
|
|
32
|
+
return true;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const excelParser = {
|
|
38
|
+
name: "xlsx",
|
|
39
|
+
extensions: [".xlsx", ".xls"],
|
|
40
|
+
isAvailable() {
|
|
41
|
+
return tryLoadXlsx();
|
|
42
|
+
},
|
|
43
|
+
async parse(filePath, opts) {
|
|
44
|
+
if (!tryLoadXlsx()) {
|
|
45
|
+
return { columns: [], totalRows: 0 };
|
|
46
|
+
}
|
|
47
|
+
const workbook = xlsxModule.readFile(filePath, { type: "file", cellDates: true });
|
|
48
|
+
const sheetName = workbook.SheetNames[0];
|
|
49
|
+
if (!sheetName) return { columns: [], totalRows: 0 };
|
|
50
|
+
const sheet = workbook.Sheets[sheetName];
|
|
51
|
+
const jsonData = xlsxModule.utils.sheet_to_json(sheet, { defval: null });
|
|
52
|
+
if (jsonData.length === 0) return { columns: [], totalRows: 0 };
|
|
53
|
+
const columns = Object.keys(jsonData[0]);
|
|
54
|
+
let totalRows = 0;
|
|
55
|
+
let batch = [];
|
|
56
|
+
for (const item of jsonData) {
|
|
57
|
+
if (totalRows >= opts.maxRows) break;
|
|
58
|
+
const row = {};
|
|
59
|
+
for (const col of columns) {
|
|
60
|
+
const val = item[col];
|
|
61
|
+
if (val === null || val === void 0) {
|
|
62
|
+
row[col] = null;
|
|
63
|
+
} else if (val instanceof Date) {
|
|
64
|
+
row[col] = val.toISOString();
|
|
65
|
+
} else if (typeof val === "object") {
|
|
66
|
+
row[col] = JSON.stringify(val);
|
|
67
|
+
} else {
|
|
68
|
+
row[col] = val;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
batch.push(row);
|
|
72
|
+
totalRows++;
|
|
73
|
+
if (batch.length >= BATCH_SIZE) {
|
|
74
|
+
opts.onBatch(batch, columns);
|
|
75
|
+
batch = [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (batch.length > 0) {
|
|
79
|
+
opts.onBatch(batch, columns);
|
|
80
|
+
}
|
|
81
|
+
return { columns, totalRows };
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
85
|
+
0 && (module.exports = {
|
|
86
|
+
excelParser
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=excel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/data/parsers/excel.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Excel Parser (Optional Dependency)\n *\n * Handles: .xlsx, .xls\n * Requires: xlsx package (optional dependency)\n * Gracefully returns isAvailable()=false if not installed.\n */\n\nimport type { DataFormatParser, ParsedRow } from '../types';\n\nconst BATCH_SIZE = 10_000;\n\nlet xlsxModule: any = null;\nlet xlsxChecked = false;\n\nfunction tryLoadXlsx(): boolean {\n if (xlsxChecked) return xlsxModule !== null;\n xlsxChecked = true;\n try {\n xlsxModule = require('xlsx');\n return true;\n } catch {\n return false;\n }\n}\n\nexport const excelParser: DataFormatParser = {\n name: 'xlsx',\n extensions: ['.xlsx', '.xls'],\n\n isAvailable(): boolean {\n return tryLoadXlsx();\n },\n\n async parse(filePath, opts) {\n if (!tryLoadXlsx()) {\n return { columns: [], totalRows: 0 };\n }\n\n const workbook = xlsxModule.readFile(filePath, { type: 'file', cellDates: true });\n const sheetName = workbook.SheetNames[0];\n if (!sheetName) return { columns: [], totalRows: 0 };\n\n const sheet = workbook.Sheets[sheetName];\n const jsonData = xlsxModule.utils.sheet_to_json(sheet, { defval: null }) as Record<string, any>[];\n\n if (jsonData.length === 0) return { columns: [], totalRows: 0 };\n\n const columns = Object.keys(jsonData[0]);\n let totalRows = 0;\n let batch: ParsedRow[] = [];\n\n for (const item of jsonData) {\n if (totalRows >= opts.maxRows) break;\n\n const row: ParsedRow = {};\n for (const col of columns) {\n const val = item[col];\n if (val === null || val === undefined) {\n row[col] = null;\n } else if (val instanceof Date) {\n row[col] = val.toISOString();\n } else if (typeof val === 'object') {\n row[col] = JSON.stringify(val);\n } else {\n row[col] = val;\n }\n }\n\n batch.push(row);\n totalRows++;\n\n if (batch.length >= BATCH_SIZE) {\n opts.onBatch(batch, columns);\n batch = [];\n }\n }\n\n if (batch.length > 0) {\n opts.onBatch(batch, columns);\n }\n\n return { columns, totalRows };\n },\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,MAAM,aAAa;AAEnB,IAAI,aAAkB;AACtB,IAAI,cAAc;AAElB,SAAS,cAAuB;AAC9B,MAAI,YAAa,QAAO,eAAe;AACvC,gBAAc;AACd,MAAI;AACF,iBAAa,QAAQ,MAAM;AAC3B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,MAAM,cAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,YAAY,CAAC,SAAS,MAAM;AAAA,EAE5B,cAAuB;AACrB,WAAO,YAAY;AAAA,EACrB;AAAA,EAEA,MAAM,MAAM,UAAU,MAAM;AAC1B,QAAI,CAAC,YAAY,GAAG;AAClB,aAAO,EAAE,SAAS,CAAC,GAAG,WAAW,EAAE;AAAA,IACrC;AAEA,UAAM,WAAW,WAAW,SAAS,UAAU,EAAE,MAAM,QAAQ,WAAW,KAAK,CAAC;AAChF,UAAM,YAAY,SAAS,WAAW,CAAC;AACvC,QAAI,CAAC,UAAW,QAAO,EAAE,SAAS,CAAC,GAAG,WAAW,EAAE;AAEnD,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,WAAW,WAAW,MAAM,cAAc,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEvE,QAAI,SAAS,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,WAAW,EAAE;AAE9D,UAAM,UAAU,OAAO,KAAK,SAAS,CAAC,CAAC;AACvC,QAAI,YAAY;AAChB,QAAI,QAAqB,CAAC;AAE1B,eAAW,QAAQ,UAAU;AAC3B,UAAI,aAAa,KAAK,QAAS;AAE/B,YAAM,MAAiB,CAAC;AACxB,iBAAW,OAAO,SAAS;AACzB,cAAM,MAAM,KAAK,GAAG;AACpB,YAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,cAAI,GAAG,IAAI;AAAA,QACb,WAAW,eAAe,MAAM;AAC9B,cAAI,GAAG,IAAI,IAAI,YAAY;AAAA,QAC7B,WAAW,OAAO,QAAQ,UAAU;AAClC,cAAI,GAAG,IAAI,KAAK,UAAU,GAAG;AAAA,QAC/B,OAAO;AACL,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF;AAEA,YAAM,KAAK,GAAG;AACd;AAEA,UAAI,MAAM,UAAU,YAAY;AAC9B,aAAK,QAAQ,OAAO,OAAO;AAC3B,gBAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,WAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B;AAEA,WAAO,EAAE,SAAS,UAAU;AAAA,EAC9B;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var parsers_exports = {};
|
|
20
|
+
__export(parsers_exports, {
|
|
21
|
+
getAvailableExtensions: () => getAvailableExtensions,
|
|
22
|
+
getDataParser: () => getDataParser,
|
|
23
|
+
getUnavailableExtensions: () => getUnavailableExtensions,
|
|
24
|
+
isSupportedDataFormat: () => isSupportedDataFormat
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(parsers_exports);
|
|
27
|
+
var import_csv = require("./csv");
|
|
28
|
+
var import_jsonl = require("./jsonl");
|
|
29
|
+
var import_json_array = require("./json-array");
|
|
30
|
+
var import_excel = require("./excel");
|
|
31
|
+
var import_parquet = require("./parquet");
|
|
32
|
+
const allParsers = [
|
|
33
|
+
import_csv.csvParser,
|
|
34
|
+
import_csv.tsvParser,
|
|
35
|
+
import_jsonl.jsonlParser,
|
|
36
|
+
import_json_array.jsonArrayParser,
|
|
37
|
+
import_excel.excelParser,
|
|
38
|
+
import_parquet.parquetParser
|
|
39
|
+
];
|
|
40
|
+
const extensionMap = /* @__PURE__ */ new Map();
|
|
41
|
+
for (const parser of allParsers) {
|
|
42
|
+
for (const ext of parser.extensions) {
|
|
43
|
+
extensionMap.set(ext.toLowerCase(), parser);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function getDataParser(filePath) {
|
|
47
|
+
const ext = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
|
|
48
|
+
const parser = extensionMap.get(ext) ?? null;
|
|
49
|
+
if (!parser) return null;
|
|
50
|
+
if (!parser.isAvailable()) return null;
|
|
51
|
+
return parser;
|
|
52
|
+
}
|
|
53
|
+
function isSupportedDataFormat(filePath) {
|
|
54
|
+
return getDataParser(filePath) !== null;
|
|
55
|
+
}
|
|
56
|
+
function getAvailableExtensions() {
|
|
57
|
+
const available = [];
|
|
58
|
+
for (const [ext, parser] of extensionMap) {
|
|
59
|
+
if (parser.isAvailable()) available.push(ext);
|
|
60
|
+
}
|
|
61
|
+
return available;
|
|
62
|
+
}
|
|
63
|
+
function getUnavailableExtensions() {
|
|
64
|
+
const unavailable = [];
|
|
65
|
+
for (const [ext, parser] of extensionMap) {
|
|
66
|
+
if (!parser.isAvailable()) {
|
|
67
|
+
unavailable.push({ ext, parser: parser.name });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return unavailable;
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
getAvailableExtensions,
|
|
75
|
+
getDataParser,
|
|
76
|
+
getUnavailableExtensions,
|
|
77
|
+
isSupportedDataFormat
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/data/parsers/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Data Format Registry\n *\n * Maps file extensions to their appropriate parser.\n * Gracefully skips formats whose optional dependencies are not installed.\n */\n\nimport type { DataFormatParser } from '../types';\nimport { csvParser, tsvParser } from './csv';\nimport { jsonlParser } from './jsonl';\nimport { jsonArrayParser } from './json-array';\nimport { excelParser } from './excel';\nimport { parquetParser } from './parquet';\n\n// \u2500\u2500 Registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst allParsers: DataFormatParser[] = [\n csvParser,\n tsvParser,\n jsonlParser,\n jsonArrayParser,\n excelParser,\n parquetParser,\n];\n\n/** Extension \u2192 parser lookup */\nconst extensionMap = new Map<string, DataFormatParser>();\nfor (const parser of allParsers) {\n for (const ext of parser.extensions) {\n extensionMap.set(ext.toLowerCase(), parser);\n }\n}\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Get the parser for a given file extension.\n * Returns null if no parser is registered or the optional dep is missing.\n */\nexport function getDataParser(filePath: string): DataFormatParser | null {\n const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase();\n const parser = extensionMap.get(ext) ?? null;\n if (!parser) return null;\n if (!parser.isAvailable()) return null;\n return parser;\n}\n\n/**\n * Check if a file extension is supported for data parsing.\n */\nexport function isSupportedDataFormat(filePath: string): boolean {\n return getDataParser(filePath) !== null;\n}\n\n/**\n * Get all supported extensions (only those with available deps).\n */\nexport function getAvailableExtensions(): string[] {\n const available: string[] = [];\n for (const [ext, parser] of extensionMap) {\n if (parser.isAvailable()) available.push(ext);\n }\n return available;\n}\n\n/**\n * Get extensions that are registered but have missing optional deps.\n */\nexport function getUnavailableExtensions(): Array<{ ext: string; parser: string }> {\n const unavailable: Array<{ ext: string; parser: string }> = [];\n for (const [ext, parser] of extensionMap) {\n if (!parser.isAvailable()) {\n unavailable.push({ ext, parser: parser.name });\n }\n }\n return unavailable;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,iBAAqC;AACrC,mBAA4B;AAC5B,wBAAgC;AAChC,mBAA4B;AAC5B,qBAA8B;AAI9B,MAAM,aAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,eAAe,oBAAI,IAA8B;AACvD,WAAW,UAAU,YAAY;AAC/B,aAAW,OAAO,OAAO,YAAY;AACnC,iBAAa,IAAI,IAAI,YAAY,GAAG,MAAM;AAAA,EAC5C;AACF;AAQO,SAAS,cAAc,UAA2C;AACvE,QAAM,MAAM,SAAS,MAAM,SAAS,YAAY,GAAG,CAAC,EAAE,YAAY;AAClE,QAAM,SAAS,aAAa,IAAI,GAAG,KAAK;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,CAAC,OAAO,YAAY,EAAG,QAAO;AAClC,SAAO;AACT;AAKO,SAAS,sBAAsB,UAA2B;AAC/D,SAAO,cAAc,QAAQ,MAAM;AACrC;AAKO,SAAS,yBAAmC;AACjD,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,KAAK,MAAM,KAAK,cAAc;AACxC,QAAI,OAAO,YAAY,EAAG,WAAU,KAAK,GAAG;AAAA,EAC9C;AACA,SAAO;AACT;AAKO,SAAS,2BAAmE;AACjF,QAAM,cAAsD,CAAC;AAC7D,aAAW,CAAC,KAAK,MAAM,KAAK,cAAc;AACxC,QAAI,CAAC,OAAO,YAAY,GAAG;AACzB,kBAAY,KAAK,EAAE,KAAK,QAAQ,OAAO,KAAK,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|