@datachonk/cli 0.1.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 +200 -0
- package/dist/__tests__/cache.test.d.ts +2 -0
- package/dist/__tests__/cache.test.d.ts.map +1 -0
- package/dist/__tests__/cache.test.js +40 -0
- package/dist/__tests__/cache.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +113 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/templates.test.d.ts +2 -0
- package/dist/__tests__/templates.test.d.ts.map +1 -0
- package/dist/__tests__/templates.test.js +51 -0
- package/dist/__tests__/templates.test.js.map +1 -0
- package/dist/commands/analyze.d.ts +10 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +156 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +121 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +287 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/docs.d.ts +7 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +208 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/generate.d.ts +9 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +130 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +149 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lineage.d.ts +9 -0
- package/dist/commands/lineage.d.ts.map +1 -0
- package/dist/commands/lineage.js +186 -0
- package/dist/commands/lineage.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +213 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/review.d.ts +8 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +215 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/scan.d.ts +18 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +335 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +244 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +232 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/analyzer.d.ts +39 -0
- package/dist/utils/analyzer.d.ts.map +1 -0
- package/dist/utils/analyzer.js +310 -0
- package/dist/utils/analyzer.js.map +1 -0
- package/dist/utils/cache.d.ts +98 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +253 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +56 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +108 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/generators.d.ts +8 -0
- package/dist/utils/generators.d.ts.map +1 -0
- package/dist/utils/generators.js +265 -0
- package/dist/utils/generators.js.map +1 -0
- package/dist/utils/plugins.d.ts +94 -0
- package/dist/utils/plugins.d.ts.map +1 -0
- package/dist/utils/plugins.js +164 -0
- package/dist/utils/plugins.js.map +1 -0
- package/dist/utils/templates.d.ts +57 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +458 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caching Layer for DataChonk CLI
|
|
3
|
+
*
|
|
4
|
+
* Caches expensive operations like:
|
|
5
|
+
* - Database discovery scans
|
|
6
|
+
* - Knowledge graph computations
|
|
7
|
+
* - AI model responses
|
|
8
|
+
* - Parsed SQL results
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheEntry<T> {
|
|
11
|
+
key: string;
|
|
12
|
+
data: T;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
expiresAt: number;
|
|
15
|
+
tags: string[];
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface CacheConfig {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
directory: string;
|
|
21
|
+
defaultTTL: number;
|
|
22
|
+
maxSize: number;
|
|
23
|
+
maxEntries: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the cache with custom configuration
|
|
27
|
+
*/
|
|
28
|
+
export declare function initCache(customConfig?: Partial<CacheConfig>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a cache key from input data
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateCacheKey(namespace: string, ...args: unknown[]): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get a value from cache
|
|
35
|
+
*/
|
|
36
|
+
export declare function get<T>(key: string): T | null;
|
|
37
|
+
/**
|
|
38
|
+
* Set a value in cache
|
|
39
|
+
*/
|
|
40
|
+
export declare function set<T>(key: string, data: T, options?: {
|
|
41
|
+
ttl?: number;
|
|
42
|
+
tags?: string[];
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Delete a cache entry
|
|
47
|
+
*/
|
|
48
|
+
export declare function del(key: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Clear cache entries by tag
|
|
51
|
+
*/
|
|
52
|
+
export declare function clearByTag(tag: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Clear all expired entries
|
|
55
|
+
*/
|
|
56
|
+
export declare function clearExpired(): number;
|
|
57
|
+
/**
|
|
58
|
+
* Clear all cache entries
|
|
59
|
+
*/
|
|
60
|
+
export declare function clearAll(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Get cache statistics
|
|
63
|
+
*/
|
|
64
|
+
export declare function getStats(): {
|
|
65
|
+
entries: number;
|
|
66
|
+
size: number;
|
|
67
|
+
oldestEntry: number | null;
|
|
68
|
+
newestEntry: number | null;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Decorator-style cache wrapper for async functions
|
|
72
|
+
*/
|
|
73
|
+
export declare function cached<T extends (...args: unknown[]) => Promise<unknown>>(fn: T, options: {
|
|
74
|
+
namespace: string;
|
|
75
|
+
ttl?: number;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
}): T;
|
|
78
|
+
/**
|
|
79
|
+
* Cache wrapper for scan results
|
|
80
|
+
*/
|
|
81
|
+
export declare function cacheScanResult(connectionId: string, schemas: string[], result: unknown): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get cached scan result
|
|
84
|
+
*/
|
|
85
|
+
export declare function getCachedScanResult(connectionId: string, schemas: string[]): unknown | null;
|
|
86
|
+
/**
|
|
87
|
+
* Cache wrapper for knowledge graph
|
|
88
|
+
*/
|
|
89
|
+
export declare function cacheKnowledgeGraph(projectPath: string, graph: unknown): void;
|
|
90
|
+
/**
|
|
91
|
+
* Get cached knowledge graph
|
|
92
|
+
*/
|
|
93
|
+
export declare function getCachedKnowledgeGraph(projectPath: string): unknown | null;
|
|
94
|
+
/**
|
|
95
|
+
* Print cache status to console
|
|
96
|
+
*/
|
|
97
|
+
export declare function printCacheStatus(): void;
|
|
98
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,IAAI,CAMvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAG9E;AASD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAoB5C;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,EACP,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAO,GAClF,IAAI,CAcN;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOxC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsB9C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAuBrC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAcjC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CA+BA;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,EAAE,EAAE,CAAC,EACL,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5D,CAAC,CAgBH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,OAAO,GACd,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,GAAG,IAAI,CAGhB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAgBvC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
const DEFAULT_CONFIG = {
|
|
6
|
+
enabled: true,
|
|
7
|
+
directory: join(process.cwd(), ".datachonk", "cache"),
|
|
8
|
+
defaultTTL: 3600, // 1 hour
|
|
9
|
+
maxSize: 100 * 1024 * 1024, // 100MB
|
|
10
|
+
maxEntries: 1000,
|
|
11
|
+
};
|
|
12
|
+
let config = { ...DEFAULT_CONFIG };
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the cache with custom configuration
|
|
15
|
+
*/
|
|
16
|
+
export function initCache(customConfig = {}) {
|
|
17
|
+
config = { ...DEFAULT_CONFIG, ...customConfig };
|
|
18
|
+
if (config.enabled && !existsSync(config.directory)) {
|
|
19
|
+
mkdirSync(config.directory, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate a cache key from input data
|
|
24
|
+
*/
|
|
25
|
+
export function generateCacheKey(namespace, ...args) {
|
|
26
|
+
const input = JSON.stringify({ namespace, args });
|
|
27
|
+
return createHash("sha256").update(input).digest("hex").slice(0, 32);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get cache file path for a key
|
|
31
|
+
*/
|
|
32
|
+
function getCachePath(key) {
|
|
33
|
+
return join(config.directory, `${key}.json`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get a value from cache
|
|
37
|
+
*/
|
|
38
|
+
export function get(key) {
|
|
39
|
+
if (!config.enabled)
|
|
40
|
+
return null;
|
|
41
|
+
const path = getCachePath(key);
|
|
42
|
+
if (!existsSync(path))
|
|
43
|
+
return null;
|
|
44
|
+
try {
|
|
45
|
+
const content = readFileSync(path, "utf-8");
|
|
46
|
+
const entry = JSON.parse(content);
|
|
47
|
+
// Check expiration
|
|
48
|
+
if (Date.now() > entry.expiresAt) {
|
|
49
|
+
unlinkSync(path);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return entry.data;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Set a value in cache
|
|
60
|
+
*/
|
|
61
|
+
export function set(key, data, options = {}) {
|
|
62
|
+
if (!config.enabled)
|
|
63
|
+
return;
|
|
64
|
+
const entry = {
|
|
65
|
+
key,
|
|
66
|
+
data,
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
expiresAt: Date.now() + (options.ttl || config.defaultTTL) * 1000,
|
|
69
|
+
tags: options.tags || [],
|
|
70
|
+
metadata: options.metadata,
|
|
71
|
+
};
|
|
72
|
+
const path = getCachePath(key);
|
|
73
|
+
writeFileSync(path, JSON.stringify(entry, null, 2));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Delete a cache entry
|
|
77
|
+
*/
|
|
78
|
+
export function del(key) {
|
|
79
|
+
const path = getCachePath(key);
|
|
80
|
+
if (existsSync(path)) {
|
|
81
|
+
unlinkSync(path);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clear cache entries by tag
|
|
88
|
+
*/
|
|
89
|
+
export function clearByTag(tag) {
|
|
90
|
+
if (!existsSync(config.directory))
|
|
91
|
+
return 0;
|
|
92
|
+
let cleared = 0;
|
|
93
|
+
const files = readdirSync(config.directory).filter((f) => f.endsWith(".json"));
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
try {
|
|
96
|
+
const path = join(config.directory, file);
|
|
97
|
+
const content = readFileSync(path, "utf-8");
|
|
98
|
+
const entry = JSON.parse(content);
|
|
99
|
+
if (entry.tags.includes(tag)) {
|
|
100
|
+
unlinkSync(path);
|
|
101
|
+
cleared++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Skip invalid entries
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return cleared;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clear all expired entries
|
|
112
|
+
*/
|
|
113
|
+
export function clearExpired() {
|
|
114
|
+
if (!existsSync(config.directory))
|
|
115
|
+
return 0;
|
|
116
|
+
let cleared = 0;
|
|
117
|
+
const files = readdirSync(config.directory).filter((f) => f.endsWith(".json"));
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
try {
|
|
121
|
+
const path = join(config.directory, file);
|
|
122
|
+
const content = readFileSync(path, "utf-8");
|
|
123
|
+
const entry = JSON.parse(content);
|
|
124
|
+
if (now > entry.expiresAt) {
|
|
125
|
+
unlinkSync(path);
|
|
126
|
+
cleared++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Skip invalid entries
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return cleared;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear all cache entries
|
|
137
|
+
*/
|
|
138
|
+
export function clearAll() {
|
|
139
|
+
if (!existsSync(config.directory))
|
|
140
|
+
return 0;
|
|
141
|
+
const files = readdirSync(config.directory).filter((f) => f.endsWith(".json"));
|
|
142
|
+
for (const file of files) {
|
|
143
|
+
try {
|
|
144
|
+
unlinkSync(join(config.directory, file));
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Skip errors
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return files.length;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get cache statistics
|
|
154
|
+
*/
|
|
155
|
+
export function getStats() {
|
|
156
|
+
if (!existsSync(config.directory)) {
|
|
157
|
+
return { entries: 0, size: 0, oldestEntry: null, newestEntry: null };
|
|
158
|
+
}
|
|
159
|
+
const files = readdirSync(config.directory).filter((f) => f.endsWith(".json"));
|
|
160
|
+
let size = 0;
|
|
161
|
+
let oldest = null;
|
|
162
|
+
let newest = null;
|
|
163
|
+
for (const file of files) {
|
|
164
|
+
try {
|
|
165
|
+
const path = join(config.directory, file);
|
|
166
|
+
const stat = statSync(path);
|
|
167
|
+
size += stat.size;
|
|
168
|
+
const content = readFileSync(path, "utf-8");
|
|
169
|
+
const entry = JSON.parse(content);
|
|
170
|
+
if (oldest === null || entry.timestamp < oldest) {
|
|
171
|
+
oldest = entry.timestamp;
|
|
172
|
+
}
|
|
173
|
+
if (newest === null || entry.timestamp > newest) {
|
|
174
|
+
newest = entry.timestamp;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Skip invalid entries
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { entries: files.length, size, oldestEntry: oldest, newestEntry: newest };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Decorator-style cache wrapper for async functions
|
|
185
|
+
*/
|
|
186
|
+
export function cached(fn, options) {
|
|
187
|
+
return (async (...args) => {
|
|
188
|
+
const key = generateCacheKey(options.namespace, ...args);
|
|
189
|
+
// Try to get from cache
|
|
190
|
+
const cached = get(key);
|
|
191
|
+
if (cached !== null) {
|
|
192
|
+
return cached;
|
|
193
|
+
}
|
|
194
|
+
// Execute function and cache result
|
|
195
|
+
const result = await fn(...args);
|
|
196
|
+
set(key, result, { ttl: options.ttl, tags: options.tags });
|
|
197
|
+
return result;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Cache wrapper for scan results
|
|
202
|
+
*/
|
|
203
|
+
export function cacheScanResult(connectionId, schemas, result) {
|
|
204
|
+
const key = generateCacheKey("scan", connectionId, schemas.sort().join(","));
|
|
205
|
+
set(key, result, {
|
|
206
|
+
ttl: 24 * 3600, // 24 hours
|
|
207
|
+
tags: ["scan", `connection:${connectionId}`],
|
|
208
|
+
metadata: { connectionId, schemas, scannedAt: new Date().toISOString() },
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get cached scan result
|
|
213
|
+
*/
|
|
214
|
+
export function getCachedScanResult(connectionId, schemas) {
|
|
215
|
+
const key = generateCacheKey("scan", connectionId, schemas.sort().join(","));
|
|
216
|
+
return get(key);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Cache wrapper for knowledge graph
|
|
220
|
+
*/
|
|
221
|
+
export function cacheKnowledgeGraph(projectPath, graph) {
|
|
222
|
+
const key = generateCacheKey("knowledge-graph", projectPath);
|
|
223
|
+
set(key, graph, {
|
|
224
|
+
ttl: 3600, // 1 hour
|
|
225
|
+
tags: ["knowledge-graph", `project:${projectPath}`],
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get cached knowledge graph
|
|
230
|
+
*/
|
|
231
|
+
export function getCachedKnowledgeGraph(projectPath) {
|
|
232
|
+
const key = generateCacheKey("knowledge-graph", projectPath);
|
|
233
|
+
return get(key);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Print cache status to console
|
|
237
|
+
*/
|
|
238
|
+
export function printCacheStatus() {
|
|
239
|
+
const stats = getStats();
|
|
240
|
+
console.log(chalk.bold("\nCache Status"));
|
|
241
|
+
console.log(chalk.gray("─".repeat(40)));
|
|
242
|
+
console.log(` Entries: ${stats.entries}`);
|
|
243
|
+
console.log(` Size: ${(stats.size / 1024 / 1024).toFixed(2)} MB`);
|
|
244
|
+
if (stats.oldestEntry) {
|
|
245
|
+
const oldestAge = Math.round((Date.now() - stats.oldestEntry) / 1000 / 60);
|
|
246
|
+
console.log(` Oldest: ${oldestAge} minutes ago`);
|
|
247
|
+
}
|
|
248
|
+
if (stats.newestEntry) {
|
|
249
|
+
const newestAge = Math.round((Date.now() - stats.newestEntry) / 1000 / 60);
|
|
250
|
+
console.log(` Newest: ${newestAge} minutes ago`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type DatabaseType = "snowflake" | "bigquery" | "redshift" | "databricks" | "postgres" | "mysql" | "duckdb";
|
|
2
|
+
export type ModelingApproach = "kimball" | "data_vault" | "obt" | "activity_schema" | "mixed";
|
|
3
|
+
export interface DatabaseConnection {
|
|
4
|
+
type: DatabaseType;
|
|
5
|
+
name: string;
|
|
6
|
+
host?: string;
|
|
7
|
+
port?: string | number;
|
|
8
|
+
database?: string;
|
|
9
|
+
username?: string;
|
|
10
|
+
account?: string;
|
|
11
|
+
warehouse?: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
project?: string;
|
|
14
|
+
keyFile?: string;
|
|
15
|
+
dataset?: string;
|
|
16
|
+
lastUsed?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DataChonkConfig {
|
|
19
|
+
version: number;
|
|
20
|
+
warehouse: DatabaseType;
|
|
21
|
+
apiUrl?: string;
|
|
22
|
+
modeling: {
|
|
23
|
+
approach: ModelingApproach;
|
|
24
|
+
conventions: string[];
|
|
25
|
+
};
|
|
26
|
+
ai: {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
apiKey: string | null;
|
|
29
|
+
};
|
|
30
|
+
analysis: {
|
|
31
|
+
ignorePaths: string[];
|
|
32
|
+
ignoreRules: string[];
|
|
33
|
+
};
|
|
34
|
+
generation: {
|
|
35
|
+
defaultMaterialization: "view" | "table" | "incremental" | "ephemeral";
|
|
36
|
+
addDescriptions: boolean;
|
|
37
|
+
addTests: boolean;
|
|
38
|
+
};
|
|
39
|
+
connections?: Record<string, DatabaseConnection>;
|
|
40
|
+
}
|
|
41
|
+
export declare const DEFAULT_API_URL = "https://datachonk.dev";
|
|
42
|
+
export declare function getApiUrl(): string;
|
|
43
|
+
export declare function getConfigPath(projectPath?: string): string;
|
|
44
|
+
export declare function loadConfig(projectPath?: string): DataChonkConfig;
|
|
45
|
+
export declare function saveConfig(config: DataChonkConfig, projectPath?: string): void;
|
|
46
|
+
export declare function getApiKey(): string | null;
|
|
47
|
+
export declare function setApiKey(apiKey: string): void;
|
|
48
|
+
export declare function getConnections(): Record<string, DatabaseConnection>;
|
|
49
|
+
export declare function getConnection(name: string): DatabaseConnection | null;
|
|
50
|
+
export declare function saveConnection(name: string, connection: DatabaseConnection): void;
|
|
51
|
+
export declare function deleteConnection(name: string): boolean;
|
|
52
|
+
export declare function listConnections(): Array<{
|
|
53
|
+
name: string;
|
|
54
|
+
connection: DatabaseConnection;
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAE9F,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,YAAY,CAAC;IAExB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,EAAE,EAAE;QACF,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,UAAU,EAAE;QACV,sBAAsB,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAC;QACvE,eAAe,EAAE,OAAO,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAClD;AAGD,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAyBD,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAY,GAAG,MAAM,CAE/D;AAED,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAY,GAAG,eAAe,CAwBrE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,GAAE,MAAY,GAAG,IAAI,CAGnF;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAGzC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK9C;AAGD,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAGnE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAGrE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED,wBAAgB,eAAe,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAMzF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
// Default API URL - can be overridden via config or environment variable
|
|
5
|
+
export const DEFAULT_API_URL = "https://datachonk.dev";
|
|
6
|
+
export function getApiUrl() {
|
|
7
|
+
const config = loadConfig(".");
|
|
8
|
+
return config.apiUrl || process.env.DATACHONK_API_URL || DEFAULT_API_URL;
|
|
9
|
+
}
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
version: 1,
|
|
12
|
+
warehouse: "snowflake",
|
|
13
|
+
modeling: {
|
|
14
|
+
approach: "kimball",
|
|
15
|
+
conventions: ["stg_prefix", "int_prefix", "fct_prefix", "dim_prefix", "snake_case"],
|
|
16
|
+
},
|
|
17
|
+
ai: {
|
|
18
|
+
enabled: false,
|
|
19
|
+
apiKey: null,
|
|
20
|
+
},
|
|
21
|
+
analysis: {
|
|
22
|
+
ignorePaths: ["target/**", "dbt_packages/**", "logs/**"],
|
|
23
|
+
ignoreRules: [],
|
|
24
|
+
},
|
|
25
|
+
generation: {
|
|
26
|
+
defaultMaterialization: "view",
|
|
27
|
+
addDescriptions: true,
|
|
28
|
+
addTests: true,
|
|
29
|
+
},
|
|
30
|
+
connections: {},
|
|
31
|
+
};
|
|
32
|
+
export function getConfigPath(projectPath = ".") {
|
|
33
|
+
return join(projectPath, ".datachonk.yml");
|
|
34
|
+
}
|
|
35
|
+
export function loadConfig(projectPath = ".") {
|
|
36
|
+
const configPath = getConfigPath(projectPath);
|
|
37
|
+
if (!existsSync(configPath)) {
|
|
38
|
+
return DEFAULT_CONFIG;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const content = readFileSync(configPath, "utf-8");
|
|
42
|
+
const config = yaml.load(content);
|
|
43
|
+
// Deep merge with defaults
|
|
44
|
+
return {
|
|
45
|
+
...DEFAULT_CONFIG,
|
|
46
|
+
...config,
|
|
47
|
+
modeling: { ...DEFAULT_CONFIG.modeling, ...config.modeling },
|
|
48
|
+
ai: { ...DEFAULT_CONFIG.ai, ...config.ai },
|
|
49
|
+
analysis: { ...DEFAULT_CONFIG.analysis, ...config.analysis },
|
|
50
|
+
generation: { ...DEFAULT_CONFIG.generation, ...config.generation },
|
|
51
|
+
connections: { ...DEFAULT_CONFIG.connections, ...config.connections },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return DEFAULT_CONFIG;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function saveConfig(config, projectPath = ".") {
|
|
59
|
+
const configPath = getConfigPath(projectPath);
|
|
60
|
+
writeFileSync(configPath, yaml.dump(config, { indent: 2 }));
|
|
61
|
+
}
|
|
62
|
+
export function getApiKey() {
|
|
63
|
+
const config = loadConfig(".");
|
|
64
|
+
return config.ai.apiKey || process.env.DATACHONK_API_KEY || null;
|
|
65
|
+
}
|
|
66
|
+
export function setApiKey(apiKey) {
|
|
67
|
+
const config = loadConfig(".");
|
|
68
|
+
config.ai.apiKey = apiKey;
|
|
69
|
+
config.ai.enabled = true;
|
|
70
|
+
saveConfig(config);
|
|
71
|
+
}
|
|
72
|
+
// Connection management
|
|
73
|
+
export function getConnections() {
|
|
74
|
+
const config = loadConfig(".");
|
|
75
|
+
return config.connections || {};
|
|
76
|
+
}
|
|
77
|
+
export function getConnection(name) {
|
|
78
|
+
const connections = getConnections();
|
|
79
|
+
return connections[name] || null;
|
|
80
|
+
}
|
|
81
|
+
export function saveConnection(name, connection) {
|
|
82
|
+
const config = loadConfig(".");
|
|
83
|
+
if (!config.connections) {
|
|
84
|
+
config.connections = {};
|
|
85
|
+
}
|
|
86
|
+
config.connections[name] = {
|
|
87
|
+
...connection,
|
|
88
|
+
lastUsed: new Date().toISOString(),
|
|
89
|
+
};
|
|
90
|
+
saveConfig(config);
|
|
91
|
+
}
|
|
92
|
+
export function deleteConnection(name) {
|
|
93
|
+
const config = loadConfig(".");
|
|
94
|
+
if (config.connections && config.connections[name]) {
|
|
95
|
+
delete config.connections[name];
|
|
96
|
+
saveConfig(config);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
export function listConnections() {
|
|
102
|
+
const connections = getConnections();
|
|
103
|
+
return Object.entries(connections).map(([name, connection]) => ({
|
|
104
|
+
name,
|
|
105
|
+
connection,
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function generateStagingModel(name: string, source: string, warehouse: string): string;
|
|
2
|
+
export declare function generateIntermediateModel(name: string, source: string, warehouse: string): string;
|
|
3
|
+
export declare function generateMartModel(name: string, source: string, type: "fact" | "dimension", warehouse: string): string;
|
|
4
|
+
export declare function generateSnapshot(name: string, source: string, warehouse: string): string;
|
|
5
|
+
export declare function generateSourceYaml(name: string, source: string): string;
|
|
6
|
+
export declare function generateTests(name: string, source: string): string;
|
|
7
|
+
export declare function generateDocs(name: string, type: string, source?: string): string;
|
|
8
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/utils/generators.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAwCR;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAgCR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,WAAW,EAC1B,SAAS,EAAE,MAAM,GAChB,MAAM,CAoFR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAmBR;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA8BvE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBlE;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAsBR"}
|