@memberjunction/db-auto-doc 2.116.0 → 2.118.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/README.md +652 -165
- package/bin/run.js +7 -0
- package/dist/api/DBAutoDocAPI.d.ts +252 -0
- package/dist/api/DBAutoDocAPI.d.ts.map +1 -0
- package/dist/api/DBAutoDocAPI.js +530 -0
- package/dist/api/DBAutoDocAPI.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +10 -0
- package/dist/api/index.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -4
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +58 -71
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/export.d.ts +14 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +156 -61
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/init.d.ts +3 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +155 -146
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/reset.d.ts +4 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +33 -19
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/AnalysisEngine.d.ts +108 -0
- package/dist/core/AnalysisEngine.d.ts.map +1 -0
- package/dist/core/AnalysisEngine.js +716 -0
- package/dist/core/AnalysisEngine.js.map +1 -0
- package/dist/core/AnalysisOrchestrator.d.ts +37 -0
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
- package/dist/core/AnalysisOrchestrator.js +294 -0
- package/dist/core/AnalysisOrchestrator.js.map +1 -0
- package/dist/core/BackpropagationEngine.d.ts +32 -0
- package/dist/core/BackpropagationEngine.d.ts.map +1 -0
- package/dist/core/BackpropagationEngine.js +121 -0
- package/dist/core/BackpropagationEngine.js.map +1 -0
- package/dist/core/ConvergenceDetector.d.ts +27 -0
- package/dist/core/ConvergenceDetector.d.ts.map +1 -0
- package/dist/core/ConvergenceDetector.js +92 -0
- package/dist/core/ConvergenceDetector.js.map +1 -0
- package/dist/core/GuardrailsManager.d.ts +78 -0
- package/dist/core/GuardrailsManager.d.ts.map +1 -0
- package/dist/core/GuardrailsManager.js +367 -0
- package/dist/core/GuardrailsManager.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/database/Database.d.ts +56 -0
- package/dist/database/Database.d.ts.map +1 -0
- package/dist/database/Database.js +172 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/TopologicalSorter.d.ts +25 -0
- package/dist/database/TopologicalSorter.d.ts.map +1 -0
- package/dist/database/TopologicalSorter.js +150 -0
- package/dist/database/TopologicalSorter.js.map +1 -0
- package/dist/database/index.d.ts +6 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +14 -0
- package/dist/database/index.js.map +1 -0
- package/dist/discovery/ColumnStatsCache.d.ts +91 -0
- package/dist/discovery/ColumnStatsCache.d.ts.map +1 -0
- package/dist/discovery/ColumnStatsCache.js +231 -0
- package/dist/discovery/ColumnStatsCache.js.map +1 -0
- package/dist/discovery/DiscoveryEngine.d.ts +100 -0
- package/dist/discovery/DiscoveryEngine.d.ts.map +1 -0
- package/dist/discovery/DiscoveryEngine.js +726 -0
- package/dist/discovery/DiscoveryEngine.js.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts +57 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js +186 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js.map +1 -0
- package/dist/discovery/FKDetector.d.ts +47 -0
- package/dist/discovery/FKDetector.d.ts.map +1 -0
- package/dist/discovery/FKDetector.js +317 -0
- package/dist/discovery/FKDetector.js.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts +64 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.js +431 -0
- package/dist/discovery/LLMDiscoveryValidator.js.map +1 -0
- package/dist/discovery/LLMSanityChecker.d.ts +38 -0
- package/dist/discovery/LLMSanityChecker.d.ts.map +1 -0
- package/dist/discovery/LLMSanityChecker.js +156 -0
- package/dist/discovery/LLMSanityChecker.js.map +1 -0
- package/dist/discovery/PKDetector.d.ts +62 -0
- package/dist/discovery/PKDetector.d.ts.map +1 -0
- package/dist/discovery/PKDetector.js +436 -0
- package/dist/discovery/PKDetector.js.map +1 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +25 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts +132 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.js +121 -0
- package/dist/drivers/BaseAutoDocDriver.js.map +1 -0
- package/dist/drivers/MySQLDriver.d.ts +61 -0
- package/dist/drivers/MySQLDriver.d.ts.map +1 -0
- package/dist/drivers/MySQLDriver.js +668 -0
- package/dist/drivers/MySQLDriver.js.map +1 -0
- package/dist/drivers/PostgreSQLDriver.d.ts +65 -0
- package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -0
- package/dist/drivers/PostgreSQLDriver.js +704 -0
- package/dist/drivers/PostgreSQLDriver.js.map +1 -0
- package/dist/drivers/SQLServerDriver.d.ts +61 -0
- package/dist/drivers/SQLServerDriver.d.ts.map +1 -0
- package/dist/drivers/SQLServerDriver.js +667 -0
- package/dist/drivers/SQLServerDriver.js.map +1 -0
- package/dist/generators/CSVGenerator.d.ts +35 -0
- package/dist/generators/CSVGenerator.d.ts.map +1 -0
- package/dist/generators/CSVGenerator.js +154 -0
- package/dist/generators/CSVGenerator.js.map +1 -0
- package/dist/generators/HTMLGenerator.d.ts +29 -0
- package/dist/generators/HTMLGenerator.d.ts.map +1 -0
- package/dist/generators/HTMLGenerator.js +710 -0
- package/dist/generators/HTMLGenerator.js.map +1 -0
- package/dist/generators/MarkdownGenerator.d.ts +27 -0
- package/dist/generators/MarkdownGenerator.d.ts.map +1 -0
- package/dist/generators/MarkdownGenerator.js +361 -0
- package/dist/generators/MarkdownGenerator.js.map +1 -0
- package/dist/generators/MermaidGenerator.d.ts +35 -0
- package/dist/generators/MermaidGenerator.d.ts.map +1 -0
- package/dist/generators/MermaidGenerator.js +321 -0
- package/dist/generators/MermaidGenerator.js.map +1 -0
- package/dist/generators/ReportGenerator.d.ts +22 -0
- package/dist/generators/ReportGenerator.d.ts.map +1 -0
- package/dist/generators/ReportGenerator.js +176 -0
- package/dist/generators/ReportGenerator.js.map +1 -0
- package/dist/generators/SQLGenerator.d.ts +31 -0
- package/dist/generators/SQLGenerator.d.ts.map +1 -0
- package/dist/generators/SQLGenerator.js +168 -0
- package/dist/generators/SQLGenerator.js.map +1 -0
- package/dist/generators/index.d.ts +10 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +19 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +11 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -20
- package/dist/index.js.map +1 -1
- package/dist/prompts/PromptEngine.d.ts +65 -0
- package/dist/prompts/PromptEngine.d.ts.map +1 -0
- package/dist/prompts/PromptEngine.js +282 -0
- package/dist/prompts/PromptEngine.js.map +1 -0
- package/dist/prompts/PromptFileLoader.d.ts +21 -0
- package/dist/prompts/PromptFileLoader.d.ts.map +1 -0
- package/dist/prompts/PromptFileLoader.js +74 -0
- package/dist/prompts/PromptFileLoader.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +11 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/state/IterationTracker.d.ts +64 -0
- package/dist/state/IterationTracker.d.ts.map +1 -0
- package/dist/state/IterationTracker.js +136 -0
- package/dist/state/IterationTracker.js.map +1 -0
- package/dist/state/StateManager.d.ts +79 -0
- package/dist/state/StateManager.d.ts.map +1 -0
- package/dist/state/StateManager.js +348 -0
- package/dist/state/StateManager.js.map +1 -0
- package/dist/state/StateValidator.d.ts +24 -0
- package/dist/state/StateValidator.d.ts.map +1 -0
- package/dist/state/StateValidator.js +147 -0
- package/dist/state/StateValidator.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +13 -0
- package/dist/state/index.js.map +1 -0
- package/dist/types/analysis.d.ts +76 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +6 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +132 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/discovery.d.ts +277 -0
- package/dist/types/discovery.d.ts.map +1 -0
- package/dist/types/discovery.js +7 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/driver.d.ts +148 -0
- package/dist/types/driver.d.ts.map +1 -0
- package/dist/types/driver.js +7 -0
- package/dist/types/driver.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/prompts.d.ts +158 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +6 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/state.d.ts +278 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +7 -0
- package/dist/types/state.js.map +1 -0
- package/dist/utils/config-loader.d.ts +29 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +163 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +24 -3
- package/dist/ai/simple-ai-client.d.ts +0 -70
- package/dist/ai/simple-ai-client.d.ts.map +0 -1
- package/dist/ai/simple-ai-client.js +0 -181
- package/dist/ai/simple-ai-client.js.map +0 -1
- package/dist/analyzers/analyzer.d.ts +0 -23
- package/dist/analyzers/analyzer.d.ts.map +0 -1
- package/dist/analyzers/analyzer.js +0 -127
- package/dist/analyzers/analyzer.js.map +0 -1
- package/dist/cli-old/cli.d.ts +0 -3
- package/dist/cli-old/cli.d.ts.map +0 -1
- package/dist/cli-old/cli.js +0 -388
- package/dist/cli-old/cli.js.map +0 -1
- package/dist/commands/review.d.ts +0 -11
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -82
- package/dist/commands/review.js.map +0 -1
- package/dist/database/connection.d.ts +0 -40
- package/dist/database/connection.d.ts.map +0 -1
- package/dist/database/connection.js +0 -136
- package/dist/database/connection.js.map +0 -1
- package/dist/database/introspection.d.ts +0 -59
- package/dist/database/introspection.d.ts.map +0 -1
- package/dist/database/introspection.js +0 -124
- package/dist/database/introspection.js.map +0 -1
- package/dist/generators/markdown-generator.d.ts +0 -8
- package/dist/generators/markdown-generator.d.ts.map +0 -1
- package/dist/generators/markdown-generator.js +0 -106
- package/dist/generators/markdown-generator.js.map +0 -1
- package/dist/generators/sql-generator.d.ts +0 -20
- package/dist/generators/sql-generator.d.ts.map +0 -1
- package/dist/generators/sql-generator.js +0 -83
- package/dist/generators/sql-generator.js.map +0 -1
- package/dist/state/state-manager.d.ts +0 -95
- package/dist/state/state-manager.d.ts.map +0 -1
- package/dist/state/state-manager.js +0 -236
- package/dist/state/state-manager.js.map +0 -1
- package/dist/types/state-file.d.ts +0 -124
- package/dist/types/state-file.d.ts.map +0 -1
- package/dist/types/state-file.js +0 -79
- package/dist/types/state-file.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Primary Key Detection
|
|
3
|
+
* Analyzes columns to find potential primary keys based on uniqueness,
|
|
4
|
+
* naming patterns, and data characteristics
|
|
5
|
+
*/
|
|
6
|
+
import { BaseAutoDocDriver } from '../drivers/BaseAutoDocDriver.js';
|
|
7
|
+
import { TableDefinition } from '../types/state.js';
|
|
8
|
+
import { PKCandidate } from '../types/discovery.js';
|
|
9
|
+
import { RelationshipDiscoveryConfig } from '../types/config.js';
|
|
10
|
+
import { ColumnStatsCache } from './ColumnStatsCache.js';
|
|
11
|
+
export declare class PKDetector {
|
|
12
|
+
private driver;
|
|
13
|
+
private config;
|
|
14
|
+
private statsCache;
|
|
15
|
+
constructor(driver: BaseAutoDocDriver, config: RelationshipDiscoveryConfig, statsCache: ColumnStatsCache);
|
|
16
|
+
/**
|
|
17
|
+
* Detect primary key candidates for a table
|
|
18
|
+
*/
|
|
19
|
+
detectPKCandidates(schemaName: string, table: TableDefinition, iteration: number): Promise<PKCandidate[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if we have a high-quality surrogate key candidate
|
|
22
|
+
* Surrogate keys are single-column integer keys with "_id" suffix or "id" name
|
|
23
|
+
* that have high uniqueness (>95%)
|
|
24
|
+
*/
|
|
25
|
+
private hasSurrogatePKCandidate;
|
|
26
|
+
/**
|
|
27
|
+
* Analyze a single column as potential PK
|
|
28
|
+
*/
|
|
29
|
+
private analyzeSingleColumnPK;
|
|
30
|
+
/**
|
|
31
|
+
* Calculate naming score based on PK naming patterns
|
|
32
|
+
*/
|
|
33
|
+
private calculateNamingScore;
|
|
34
|
+
/**
|
|
35
|
+
* Calculate data type score - how appropriate is this type for a PK?
|
|
36
|
+
*/
|
|
37
|
+
private calculateDataTypeScore;
|
|
38
|
+
/**
|
|
39
|
+
* Detect data pattern (sequential, GUID, etc.)
|
|
40
|
+
*/
|
|
41
|
+
private detectDataPattern;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate overall PK confidence score (0-100)
|
|
44
|
+
*
|
|
45
|
+
* Scoring System:
|
|
46
|
+
* - Surrogate keys (id, table_id, etc.) with high uniqueness: 85-100
|
|
47
|
+
* - Natural keys with good uniqueness: 60-85
|
|
48
|
+
* - Composite keys: 50-75
|
|
49
|
+
* - Everything else: <50
|
|
50
|
+
*/
|
|
51
|
+
private calculatePKConfidence;
|
|
52
|
+
/**
|
|
53
|
+
* Detect if a column name looks like a foreign key rather than a primary key
|
|
54
|
+
* Returns a score from 0-1 (0 = not FK-like, 1 = very FK-like)
|
|
55
|
+
*/
|
|
56
|
+
private detectFKPattern;
|
|
57
|
+
/**
|
|
58
|
+
* Detect composite primary keys
|
|
59
|
+
*/
|
|
60
|
+
private detectCompositeKeys;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=PKDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PKDetector.d.ts","sourceRoot":"","sources":["../../src/discovery/PKDetector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAmD,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBAAa,UAAU;IAEnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;gBAFV,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,gBAAgB;IAGtC;;OAEG;IACU,kBAAkB,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC;IAqCzB;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAsC/B;;OAEG;YACW,qBAAqB;IA4GnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAmH7B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;YACW,mBAAmB;CAgDlC"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Primary Key Detection
|
|
4
|
+
* Analyzes columns to find potential primary keys based on uniqueness,
|
|
5
|
+
* naming patterns, and data characteristics
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PKDetector = void 0;
|
|
9
|
+
class PKDetector {
|
|
10
|
+
constructor(driver, config, statsCache) {
|
|
11
|
+
this.driver = driver;
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.statsCache = statsCache;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect primary key candidates for a table
|
|
17
|
+
*/
|
|
18
|
+
async detectPKCandidates(schemaName, table, iteration) {
|
|
19
|
+
const candidates = [];
|
|
20
|
+
// Single-column PK detection
|
|
21
|
+
for (const column of table.columns) {
|
|
22
|
+
const candidate = await this.analyzeSingleColumnPK(schemaName, table.name, column, iteration);
|
|
23
|
+
if (candidate && candidate.confidence >= this.config.confidence.primaryKeyMinimum * 100) {
|
|
24
|
+
candidates.push(candidate);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// **IMPORTANT**: Check if we have a high-quality surrogate key candidate
|
|
28
|
+
// If we do, skip composite key detection entirely
|
|
29
|
+
const hasSurrogateKey = this.hasSurrogatePKCandidate(table.name, candidates);
|
|
30
|
+
if (hasSurrogateKey) {
|
|
31
|
+
console.log(`[PKDetector] Table ${table.name} has surrogate key candidate - skipping composite key detection`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Composite PK detection only if no good surrogate key exists
|
|
35
|
+
const compositeCandidates = await this.detectCompositeKeys(schemaName, table, iteration);
|
|
36
|
+
candidates.push(...compositeCandidates);
|
|
37
|
+
}
|
|
38
|
+
// Sort by confidence descending
|
|
39
|
+
return candidates.sort((a, b) => b.confidence - a.confidence);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if we have a high-quality surrogate key candidate
|
|
43
|
+
* Surrogate keys are single-column integer keys with "_id" suffix or "id" name
|
|
44
|
+
* that have high uniqueness (>95%)
|
|
45
|
+
*/
|
|
46
|
+
hasSurrogatePKCandidate(tableName, candidates) {
|
|
47
|
+
const tableLower = tableName.toLowerCase();
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
// Must be single column
|
|
50
|
+
if (candidate.columnNames.length !== 1) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const columnName = candidate.columnNames[0];
|
|
54
|
+
const columnLower = columnName.toLowerCase();
|
|
55
|
+
// Check for surrogate key naming pattern
|
|
56
|
+
const isSurrogateNaming = columnLower === 'id' || // Generic "id"
|
|
57
|
+
columnLower === `${tableLower}_id` || // Table-specific "table_id"
|
|
58
|
+
columnLower === `${tableLower}id` || // Table-specific "tableid"
|
|
59
|
+
columnLower.endsWith('_id'); // Any "_id" suffix
|
|
60
|
+
// Check for high uniqueness
|
|
61
|
+
const hasHighUniqueness = candidate.evidence.uniqueness >= 0.95;
|
|
62
|
+
// Check for appropriate data type (INT, BIGINT)
|
|
63
|
+
const hasGoodDataType = candidate.evidence.dataTypeScore >= 0.9;
|
|
64
|
+
// Check for high confidence (>= 70)
|
|
65
|
+
const hasGoodConfidence = candidate.confidence >= 70;
|
|
66
|
+
// If all criteria met, this is a good surrogate key candidate
|
|
67
|
+
if (isSurrogateNaming && hasHighUniqueness && hasGoodDataType && hasGoodConfidence) {
|
|
68
|
+
console.log(`[PKDetector] Found surrogate key: ${columnName} (uniqueness: ${(candidate.evidence.uniqueness * 100).toFixed(1)}%, confidence: ${candidate.confidence})`);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Analyze a single column as potential PK
|
|
76
|
+
*/
|
|
77
|
+
async analyzeSingleColumnPK(schemaName, tableName, column, iteration) {
|
|
78
|
+
// Get or compute column statistics
|
|
79
|
+
let cachedStats = this.statsCache.getColumnStats(schemaName, tableName, column.name);
|
|
80
|
+
if (!cachedStats) {
|
|
81
|
+
// Compute and cache the stats
|
|
82
|
+
const startTime = Date.now();
|
|
83
|
+
const stats = await this.driver.getColumnStatisticsForDiscovery(schemaName, tableName, column.name, column.dataType, this.config.sampling.maxRowsPerTable);
|
|
84
|
+
// Detect data pattern
|
|
85
|
+
const dataPattern = this.detectDataPattern(stats.sampleValues, column.dataType);
|
|
86
|
+
cachedStats = {
|
|
87
|
+
schemaName,
|
|
88
|
+
tableName,
|
|
89
|
+
columnName: column.name,
|
|
90
|
+
dataType: column.dataType,
|
|
91
|
+
totalRows: stats.totalRows,
|
|
92
|
+
nullCount: stats.nullCount,
|
|
93
|
+
nullPercentage: stats.totalRows > 0 ? stats.nullCount / stats.totalRows : 0,
|
|
94
|
+
distinctCount: stats.distinctCount,
|
|
95
|
+
uniqueness: stats.totalRows > 0 ? stats.distinctCount / stats.totalRows : 0,
|
|
96
|
+
minValue: stats.minValue,
|
|
97
|
+
maxValue: stats.maxValue,
|
|
98
|
+
avgLength: stats.avgLength,
|
|
99
|
+
dataPattern,
|
|
100
|
+
sampleValues: stats.sampleValues,
|
|
101
|
+
computedAt: new Date().toISOString(),
|
|
102
|
+
queryTimeMs: Date.now() - startTime
|
|
103
|
+
};
|
|
104
|
+
this.statsCache.setColumnStats(cachedStats);
|
|
105
|
+
}
|
|
106
|
+
// Use cached stats for PK analysis
|
|
107
|
+
const uniqueness = cachedStats.uniqueness;
|
|
108
|
+
const hasNulls = cachedStats.nullCount > 0;
|
|
109
|
+
// Analyze naming pattern
|
|
110
|
+
const namingScore = this.calculateNamingScore(column.name);
|
|
111
|
+
// Analyze data type
|
|
112
|
+
const dataTypeScore = this.calculateDataTypeScore(column.dataType);
|
|
113
|
+
// Use cached data pattern
|
|
114
|
+
const dataPattern = cachedStats.dataPattern;
|
|
115
|
+
// Calculate overall confidence
|
|
116
|
+
const confidence = this.calculatePKConfidence({
|
|
117
|
+
uniqueness,
|
|
118
|
+
nullCount: cachedStats.nullCount,
|
|
119
|
+
totalRows: cachedStats.totalRows,
|
|
120
|
+
dataPattern,
|
|
121
|
+
namingScore,
|
|
122
|
+
dataTypeScore,
|
|
123
|
+
warnings: []
|
|
124
|
+
}, tableName, column.name);
|
|
125
|
+
// Build evidence
|
|
126
|
+
const evidence = {
|
|
127
|
+
uniqueness,
|
|
128
|
+
nullCount: cachedStats.nullCount,
|
|
129
|
+
totalRows: cachedStats.totalRows,
|
|
130
|
+
dataPattern,
|
|
131
|
+
namingScore,
|
|
132
|
+
dataTypeScore,
|
|
133
|
+
warnings: []
|
|
134
|
+
};
|
|
135
|
+
// Add warnings
|
|
136
|
+
if (hasNulls) {
|
|
137
|
+
evidence.warnings.push('Column contains NULL values');
|
|
138
|
+
}
|
|
139
|
+
if (uniqueness < 1.0) {
|
|
140
|
+
evidence.warnings.push(`Only ${(uniqueness * 100).toFixed(1)}% unique values`);
|
|
141
|
+
}
|
|
142
|
+
if (namingScore < 0.3) {
|
|
143
|
+
evidence.warnings.push('Column name does not match typical PK naming patterns');
|
|
144
|
+
}
|
|
145
|
+
// Don't return if confidence too low
|
|
146
|
+
if (confidence < 30) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
schemaName,
|
|
151
|
+
tableName,
|
|
152
|
+
columnNames: [column.name],
|
|
153
|
+
confidence,
|
|
154
|
+
evidence,
|
|
155
|
+
discoveredInIteration: iteration,
|
|
156
|
+
validatedByLLM: false,
|
|
157
|
+
status: 'candidate'
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Calculate naming score based on PK naming patterns
|
|
162
|
+
*/
|
|
163
|
+
calculateNamingScore(columnName) {
|
|
164
|
+
let score = 0;
|
|
165
|
+
const lowerName = columnName.toLowerCase();
|
|
166
|
+
// Check against configured patterns
|
|
167
|
+
for (const pattern of this.config.patterns.primaryKeyNames) {
|
|
168
|
+
const regex = new RegExp(pattern, 'i');
|
|
169
|
+
if (regex.test(columnName)) {
|
|
170
|
+
score += 0.4;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Common PK names
|
|
174
|
+
const commonPKNames = [
|
|
175
|
+
/^id$/i,
|
|
176
|
+
/^.*id$/i,
|
|
177
|
+
/^pk_/i,
|
|
178
|
+
/^.*_key$/i,
|
|
179
|
+
/^key$/i,
|
|
180
|
+
/^.*guid$/i,
|
|
181
|
+
/^.*uuid$/i
|
|
182
|
+
];
|
|
183
|
+
for (const pattern of commonPKNames) {
|
|
184
|
+
if (pattern.test(columnName)) {
|
|
185
|
+
score += 0.3;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Exact match bonuses
|
|
190
|
+
if (lowerName === 'id')
|
|
191
|
+
score += 0.3;
|
|
192
|
+
if (lowerName.endsWith('id'))
|
|
193
|
+
score += 0.2;
|
|
194
|
+
if (lowerName.startsWith('pk_'))
|
|
195
|
+
score += 0.2;
|
|
196
|
+
return Math.min(score, 1.0);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Calculate data type score - how appropriate is this type for a PK?
|
|
200
|
+
*/
|
|
201
|
+
calculateDataTypeScore(dataType) {
|
|
202
|
+
const lowerType = dataType.toLowerCase();
|
|
203
|
+
// Ideal PK types
|
|
204
|
+
if (lowerType.includes('int') ||
|
|
205
|
+
lowerType.includes('bigint') ||
|
|
206
|
+
lowerType.includes('uniqueidentifier') ||
|
|
207
|
+
lowerType.includes('uuid') ||
|
|
208
|
+
lowerType.includes('guid')) {
|
|
209
|
+
return 1.0;
|
|
210
|
+
}
|
|
211
|
+
// Acceptable PK types
|
|
212
|
+
if (lowerType.includes('varchar') ||
|
|
213
|
+
lowerType.includes('char') ||
|
|
214
|
+
lowerType.includes('string')) {
|
|
215
|
+
return 0.6;
|
|
216
|
+
}
|
|
217
|
+
// Poor PK types
|
|
218
|
+
if (lowerType.includes('text') ||
|
|
219
|
+
lowerType.includes('blob') ||
|
|
220
|
+
lowerType.includes('json') ||
|
|
221
|
+
lowerType.includes('xml')) {
|
|
222
|
+
return 0.2;
|
|
223
|
+
}
|
|
224
|
+
// Everything else
|
|
225
|
+
return 0.4;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Detect data pattern (sequential, GUID, etc.)
|
|
229
|
+
*/
|
|
230
|
+
detectDataPattern(sampleValues, dataType) {
|
|
231
|
+
// GUID pattern
|
|
232
|
+
if (dataType && (dataType.toLowerCase().includes('uniqueidentifier') ||
|
|
233
|
+
dataType.toLowerCase().includes('uuid') ||
|
|
234
|
+
dataType.toLowerCase().includes('guid'))) {
|
|
235
|
+
return 'guid';
|
|
236
|
+
}
|
|
237
|
+
// Check sample values for patterns
|
|
238
|
+
if (sampleValues && sampleValues.length > 1) {
|
|
239
|
+
const values = sampleValues.filter(v => v != null);
|
|
240
|
+
// Check for GUID pattern in string values
|
|
241
|
+
if (values.length > 0 && typeof values[0] === 'string') {
|
|
242
|
+
const guidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
243
|
+
if (values.every(v => typeof v === 'string' && guidPattern.test(v))) {
|
|
244
|
+
return 'guid';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Check for sequential numeric pattern
|
|
248
|
+
if (values.length > 0 && typeof values[0] === 'number') {
|
|
249
|
+
const numValues = values;
|
|
250
|
+
const sorted = [...numValues].sort((a, b) => a - b);
|
|
251
|
+
const isSequential = sorted.every((val, idx) => idx === 0 || val === sorted[idx - 1] + 1);
|
|
252
|
+
if (isSequential) {
|
|
253
|
+
return 'sequential';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Natural key (string based on actual data)
|
|
258
|
+
if (dataType && (dataType.toLowerCase().includes('varchar') ||
|
|
259
|
+
dataType.toLowerCase().includes('char'))) {
|
|
260
|
+
return 'natural';
|
|
261
|
+
}
|
|
262
|
+
return 'unknown';
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Calculate overall PK confidence score (0-100)
|
|
266
|
+
*
|
|
267
|
+
* Scoring System:
|
|
268
|
+
* - Surrogate keys (id, table_id, etc.) with high uniqueness: 85-100
|
|
269
|
+
* - Natural keys with good uniqueness: 60-85
|
|
270
|
+
* - Composite keys: 50-75
|
|
271
|
+
* - Everything else: <50
|
|
272
|
+
*/
|
|
273
|
+
calculatePKConfidence(evidence, tableName, columnName) {
|
|
274
|
+
let score = 0;
|
|
275
|
+
// **CRITICAL FIX**: Reject obvious non-PK columns immediately
|
|
276
|
+
const blacklistPatterns = [
|
|
277
|
+
// Quantities and counts
|
|
278
|
+
/^qty$/i, /^quantity$/i, /^amount$/i, /^amt$/i,
|
|
279
|
+
/^count$/i, /^cnt$/i, /^num$/i, /^number$/i,
|
|
280
|
+
// Sequences and ordering
|
|
281
|
+
/^seq$/i, /^sequence$/i, /^order$/i, /^sort$/i,
|
|
282
|
+
/^lvl$/i, /^level$/i, /^depth$/i,
|
|
283
|
+
// Financial/numeric values
|
|
284
|
+
/^price$/i, /^prc$/i, /^cost$/i,
|
|
285
|
+
/^total$/i, /^tot$/i, /^sum$/i,
|
|
286
|
+
/^balance$/i, /^bal$/i,
|
|
287
|
+
/^limit$/i, /^lmt$/i, /^capacity$/i, /^cap$/i,
|
|
288
|
+
// Statistical/calculated values
|
|
289
|
+
/^var$/i, /^variance$/i, /^diff$/i, /^delta$/i,
|
|
290
|
+
/^min$/i, /^max$/i, /^avg$/i, /^mean$/i,
|
|
291
|
+
/^rate$/i, /^rtg$/i, /^rating$/i, /^score$/i,
|
|
292
|
+
/^expected$/i, /^exp_/i, /^actual$/i, /^act_/i,
|
|
293
|
+
/^received$/i, /^rcv_/i, /^reserved$/i, /^rsv$/i,
|
|
294
|
+
// Date/time fields - NEVER primary keys
|
|
295
|
+
/_dt$/i, /_date$/i, /^date/i, /^dt$/i,
|
|
296
|
+
/_time$/i, /^time/i, /^timestamp/i,
|
|
297
|
+
/^created/i, /^modified/i, /^updated/i, /^deleted/i,
|
|
298
|
+
/^start/i, /^end/i, /^begin/i, /^finish/i,
|
|
299
|
+
/^ship_dt$/i, /^dlv_dt$/i, /^ord_dt$/i, /^rcv_dt$/i,
|
|
300
|
+
/^lst_ord$/i, /^last_/i,
|
|
301
|
+
// Text/description fields
|
|
302
|
+
/^description$/i, /^dsc$/i, /^desc$/i,
|
|
303
|
+
/^notes$/i, /^note$/i, /^comment$/i, /^txt$/i,
|
|
304
|
+
/^name$/i, /^nm$/i, /^title$/i,
|
|
305
|
+
// Address/location fields
|
|
306
|
+
/^address$/i, /^addr$/i, /^ln1$/i, /^ln2$/i,
|
|
307
|
+
/^city$/i, /^cty$/i, /^state$/i, /^st$/i, /^zip$/i,
|
|
308
|
+
// Flags/booleans
|
|
309
|
+
/^is_/i, /^has_/i, /^flag$/i, /^active$/i, /^enabled$/i,
|
|
310
|
+
/^default$/i, /^dflt$/i, /^primary$/i,
|
|
311
|
+
// Extensions/extra info
|
|
312
|
+
/^ext$/i, /^extension$/i, /^ref$/i, /^reference$/i
|
|
313
|
+
];
|
|
314
|
+
for (const pattern of blacklistPatterns) {
|
|
315
|
+
if (pattern.test(columnName)) {
|
|
316
|
+
console.log(`[PKDetector] REJECT ${columnName} - matches blacklist pattern ${pattern}`);
|
|
317
|
+
return 0; // Immediate rejection
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// **SURROGATE KEY DETECTION**: Boost score for single-column surrogate keys
|
|
321
|
+
const tableLower = tableName.toLowerCase();
|
|
322
|
+
const colLower = columnName.toLowerCase();
|
|
323
|
+
const isSurrogateKey = colLower === 'id' ||
|
|
324
|
+
colLower === `${tableLower}_id` ||
|
|
325
|
+
colLower === `${tableLower}id` ||
|
|
326
|
+
colLower.endsWith('_id');
|
|
327
|
+
// Uniqueness is critical (50% weight)
|
|
328
|
+
score += evidence.uniqueness * 50;
|
|
329
|
+
// Naming pattern (20% weight)
|
|
330
|
+
score += evidence.namingScore * 20;
|
|
331
|
+
// Data type appropriateness (15% weight)
|
|
332
|
+
score += evidence.dataTypeScore * 15;
|
|
333
|
+
// Data pattern bonus (15% weight)
|
|
334
|
+
const patternScore = {
|
|
335
|
+
'sequential': 15,
|
|
336
|
+
'guid': 15,
|
|
337
|
+
'natural': 10,
|
|
338
|
+
'composite': 5,
|
|
339
|
+
'unknown': 5
|
|
340
|
+
}[evidence.dataPattern];
|
|
341
|
+
score += patternScore;
|
|
342
|
+
// FK-pattern detection: penalize columns that look like foreign keys
|
|
343
|
+
const fkLikelihood = this.detectFKPattern(tableName, columnName);
|
|
344
|
+
if (fkLikelihood > 0.5) {
|
|
345
|
+
// Reduce score significantly if column looks like an FK
|
|
346
|
+
score *= (1 - (fkLikelihood * 0.6)); // Up to 60% penalty for strong FK patterns
|
|
347
|
+
}
|
|
348
|
+
// Penalties
|
|
349
|
+
if (evidence.nullCount > 0) {
|
|
350
|
+
score *= 0.7; // 30% penalty for nulls
|
|
351
|
+
}
|
|
352
|
+
// **STRICTER REQUIREMENT**: Require BOTH high uniqueness AND naming score
|
|
353
|
+
if (evidence.uniqueness >= 0.95 && evidence.namingScore < 0.3) {
|
|
354
|
+
score *= 0.5; // 50% penalty if unique but poor naming
|
|
355
|
+
console.log(`[PKDetector] ${columnName}: unique but poor naming (${evidence.namingScore.toFixed(2)}), score penalized`);
|
|
356
|
+
}
|
|
357
|
+
// **SURROGATE KEY BOOST**: Give significant bonus to surrogate keys
|
|
358
|
+
// This ensures single-column surrogate keys score higher than composite keys
|
|
359
|
+
if (isSurrogateKey && evidence.uniqueness >= 0.95 && evidence.dataTypeScore >= 0.9) {
|
|
360
|
+
const boost = 20; // Add 20 points for perfect surrogate key
|
|
361
|
+
score += boost;
|
|
362
|
+
console.log(`[PKDetector] ${columnName}: surrogate key boost +${boost} (final: ${Math.round(Math.min(score, 100))})`);
|
|
363
|
+
}
|
|
364
|
+
return Math.round(Math.min(score, 100));
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Detect if a column name looks like a foreign key rather than a primary key
|
|
368
|
+
* Returns a score from 0-1 (0 = not FK-like, 1 = very FK-like)
|
|
369
|
+
*/
|
|
370
|
+
detectFKPattern(tableName, columnName) {
|
|
371
|
+
const colLower = columnName.toLowerCase();
|
|
372
|
+
const tableLower = tableName.toLowerCase();
|
|
373
|
+
// Pattern 1: Column ends with _id but doesn't start with table name
|
|
374
|
+
// e.g., cst_id in ord table (FK-like), vs cst_id in cst table (PK-like)
|
|
375
|
+
if (colLower.endsWith('_id') || colLower.endsWith('id')) {
|
|
376
|
+
const prefix = colLower.replace(/_?id$/, '');
|
|
377
|
+
// If column is just "id", it's likely a PK
|
|
378
|
+
if (prefix === '') {
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
// If prefix matches table name, likely a PK
|
|
382
|
+
if (tableLower.includes(prefix) || prefix.includes(tableLower)) {
|
|
383
|
+
return 0.1; // Slight FK likelihood (could be self-reference)
|
|
384
|
+
}
|
|
385
|
+
// If prefix doesn't match table name, very likely an FK
|
|
386
|
+
return 0.9;
|
|
387
|
+
}
|
|
388
|
+
// Pattern 2: Column ends with _key or _fk
|
|
389
|
+
if (colLower.endsWith('_key') || colLower.endsWith('_fk')) {
|
|
390
|
+
const prefix = colLower.replace(/_(?:key|fk)$/, '');
|
|
391
|
+
if (tableLower.includes(prefix) || prefix.includes(tableLower)) {
|
|
392
|
+
return 0.2;
|
|
393
|
+
}
|
|
394
|
+
return 0.95;
|
|
395
|
+
}
|
|
396
|
+
// No FK pattern detected
|
|
397
|
+
return 0;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Detect composite primary keys
|
|
401
|
+
*/
|
|
402
|
+
async detectCompositeKeys(schemaName, table, iteration) {
|
|
403
|
+
const candidates = [];
|
|
404
|
+
// Look for common composite key patterns
|
|
405
|
+
// 1. Multiple columns ending in "ID"
|
|
406
|
+
const idColumns = table.columns.filter(c => /id$/i.test(c.name) || /key$/i.test(c.name));
|
|
407
|
+
if (idColumns.length >= 2) {
|
|
408
|
+
// Check if combination is unique
|
|
409
|
+
const isUnique = await this.driver.checkColumnCombinationUniqueness(schemaName, table.name, idColumns.map(c => c.name), this.config.sampling.maxRowsPerTable);
|
|
410
|
+
if (isUnique) {
|
|
411
|
+
const evidence = {
|
|
412
|
+
uniqueness: 1.0,
|
|
413
|
+
nullCount: 0, // Assume no nulls if unique
|
|
414
|
+
totalRows: this.config.sampling.maxRowsPerTable,
|
|
415
|
+
dataPattern: 'composite',
|
|
416
|
+
namingScore: 0.8, // Good naming for composite
|
|
417
|
+
dataTypeScore: 0.9,
|
|
418
|
+
warnings: ['Composite key - verify with domain expert']
|
|
419
|
+
};
|
|
420
|
+
candidates.push({
|
|
421
|
+
schemaName,
|
|
422
|
+
tableName: table.name,
|
|
423
|
+
columnNames: idColumns.map(c => c.name),
|
|
424
|
+
confidence: 75, // Moderate confidence for composite keys
|
|
425
|
+
evidence,
|
|
426
|
+
discoveredInIteration: iteration,
|
|
427
|
+
validatedByLLM: false,
|
|
428
|
+
status: 'candidate'
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return candidates;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
exports.PKDetector = PKDetector;
|
|
436
|
+
//# sourceMappingURL=PKDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PKDetector.js","sourceRoot":"","sources":["../../src/discovery/PKDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relationship Discovery Module
|
|
3
|
+
* Detects primary keys and foreign keys in databases with incomplete metadata
|
|
4
|
+
*/
|
|
5
|
+
export * from './DiscoveryTriggerAnalyzer.js';
|
|
6
|
+
export * from './DiscoveryEngine.js';
|
|
7
|
+
export * from './PKDetector.js';
|
|
8
|
+
export * from './FKDetector.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Relationship Discovery Module
|
|
4
|
+
* Detects primary keys and foreign keys in databases with incomplete metadata
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./DiscoveryTriggerAnalyzer.js"), exports);
|
|
22
|
+
__exportStar(require("./DiscoveryEngine.js"), exports);
|
|
23
|
+
__exportStar(require("./PKDetector.js"), exports);
|
|
24
|
+
__exportStar(require("./FKDetector.js"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gEAA8C;AAC9C,uDAAqC;AACrC,kDAAgC;AAChC,kDAAgC"}
|