@emaenriquez/projectmanager-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 +98 -0
- package/dist/application/ConfigManager.d.ts +73 -0
- package/dist/application/ConfigManager.d.ts.map +1 -0
- package/dist/application/ConfigManager.js +253 -0
- package/dist/application/ConfigManager.js.map +1 -0
- package/dist/application/errors/ErrorHandler.d.ts +27 -0
- package/dist/application/errors/ErrorHandler.d.ts.map +1 -0
- package/dist/application/errors/ErrorHandler.js +88 -0
- package/dist/application/errors/ErrorHandler.js.map +1 -0
- package/dist/application/state/StateManager.d.ts +26 -0
- package/dist/application/state/StateManager.d.ts.map +1 -0
- package/dist/application/state/StateManager.js +114 -0
- package/dist/application/state/StateManager.js.map +1 -0
- package/dist/application/use_cases/AddProjectUseCase.d.ts +9 -0
- package/dist/application/use_cases/AddProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/AddProjectUseCase.js +85 -0
- package/dist/application/use_cases/AddProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/ListProjectsUseCase.d.ts +7 -0
- package/dist/application/use_cases/ListProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/ListProjectsUseCase.js +14 -0
- package/dist/application/use_cases/ListProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/OpenProjectUseCase.d.ts +10 -0
- package/dist/application/use_cases/OpenProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/OpenProjectUseCase.js +168 -0
- package/dist/application/use_cases/OpenProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/RemoveProjectUseCase.d.ts +7 -0
- package/dist/application/use_cases/RemoveProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/RemoveProjectUseCase.js +24 -0
- package/dist/application/use_cases/RemoveProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/ScanProjectsUseCase.d.ts +13 -0
- package/dist/application/use_cases/ScanProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/ScanProjectsUseCase.js +57 -0
- package/dist/application/use_cases/ScanProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/SyncProjectsUseCase.d.ts +12 -0
- package/dist/application/use_cases/SyncProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/SyncProjectsUseCase.js +74 -0
- package/dist/application/use_cases/SyncProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/SystemDiagnostics.d.ts +16 -0
- package/dist/application/use_cases/SystemDiagnostics.d.ts.map +1 -0
- package/dist/application/use_cases/SystemDiagnostics.js +35 -0
- package/dist/application/use_cases/SystemDiagnostics.js.map +1 -0
- package/dist/application/use_cases/TagProjectUseCase.d.ts +9 -0
- package/dist/application/use_cases/TagProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/TagProjectUseCase.js +41 -0
- package/dist/application/use_cases/TagProjectUseCase.js.map +1 -0
- package/dist/domain/patterns/ProjectPatterns.d.ts +47 -0
- package/dist/domain/patterns/ProjectPatterns.d.ts.map +1 -0
- package/dist/domain/patterns/ProjectPatterns.js +200 -0
- package/dist/domain/patterns/ProjectPatterns.js.map +1 -0
- package/dist/domain/services/GitService.d.ts +23 -0
- package/dist/domain/services/GitService.d.ts.map +1 -0
- package/dist/domain/services/GitService.js +155 -0
- package/dist/domain/services/GitService.js.map +1 -0
- package/dist/domain/services/IgnoreFileParser.d.ts +55 -0
- package/dist/domain/services/IgnoreFileParser.d.ts.map +1 -0
- package/dist/domain/services/IgnoreFileParser.js +200 -0
- package/dist/domain/services/IgnoreFileParser.js.map +1 -0
- package/dist/domain/services/ProjectScanner.d.ts +65 -0
- package/dist/domain/services/ProjectScanner.d.ts.map +1 -0
- package/dist/domain/services/ProjectScanner.js +207 -0
- package/dist/domain/services/ProjectScanner.js.map +1 -0
- package/dist/domain/services/TechnologyDetector.d.ts +78 -0
- package/dist/domain/services/TechnologyDetector.d.ts.map +1 -0
- package/dist/domain/services/TechnologyDetector.js +633 -0
- package/dist/domain/services/TechnologyDetector.js.map +1 -0
- package/dist/domain/services/ToolDetector.d.ts +74 -0
- package/dist/domain/services/ToolDetector.d.ts.map +1 -0
- package/dist/domain/services/ToolDetector.js +344 -0
- package/dist/domain/services/ToolDetector.js.map +1 -0
- package/dist/domain/services/index.d.ts +5 -0
- package/dist/domain/services/index.d.ts.map +1 -0
- package/dist/domain/services/index.js +12 -0
- package/dist/domain/services/index.js.map +1 -0
- package/dist/domain/types/Config.d.ts +37 -0
- package/dist/domain/types/Config.d.ts.map +1 -0
- package/dist/domain/types/Config.js +6 -0
- package/dist/domain/types/Config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/database/DatabaseConnection.d.ts +88 -0
- package/dist/infrastructure/database/DatabaseConnection.d.ts.map +1 -0
- package/dist/infrastructure/database/DatabaseConnection.js +318 -0
- package/dist/infrastructure/database/DatabaseConnection.js.map +1 -0
- package/dist/infrastructure/database/DatabaseValidator.d.ts +154 -0
- package/dist/infrastructure/database/DatabaseValidator.d.ts.map +1 -0
- package/dist/infrastructure/database/DatabaseValidator.js +583 -0
- package/dist/infrastructure/database/DatabaseValidator.js.map +1 -0
- package/dist/infrastructure/database/index.d.ts +8 -0
- package/dist/infrastructure/database/index.d.ts.map +1 -0
- package/dist/infrastructure/database/index.js +14 -0
- package/dist/infrastructure/database/index.js.map +1 -0
- package/dist/infrastructure/database/migrations/001_initial.d.ts +24 -0
- package/dist/infrastructure/database/migrations/001_initial.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/001_initial.js +109 -0
- package/dist/infrastructure/database/migrations/001_initial.js.map +1 -0
- package/dist/infrastructure/database/migrations/Migration.d.ts +27 -0
- package/dist/infrastructure/database/migrations/Migration.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/Migration.js +3 -0
- package/dist/infrastructure/database/migrations/Migration.js.map +1 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.d.ts +52 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.js +167 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.js.map +1 -0
- package/dist/infrastructure/database/migrations/index.d.ts +10 -0
- package/dist/infrastructure/database/migrations/index.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/index.js +22 -0
- package/dist/infrastructure/database/migrations/index.js.map +1 -0
- package/dist/infrastructure/filesystem/DirectoryManager.d.ts +50 -0
- package/dist/infrastructure/filesystem/DirectoryManager.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/DirectoryManager.js +143 -0
- package/dist/infrastructure/filesystem/DirectoryManager.js.map +1 -0
- package/dist/infrastructure/filesystem/index.d.ts +2 -0
- package/dist/infrastructure/filesystem/index.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/index.js +6 -0
- package/dist/infrastructure/filesystem/index.js.map +1 -0
- package/dist/infrastructure/logging/LogRotator.d.ts +43 -0
- package/dist/infrastructure/logging/LogRotator.d.ts.map +1 -0
- package/dist/infrastructure/logging/LogRotator.js +172 -0
- package/dist/infrastructure/logging/LogRotator.js.map +1 -0
- package/dist/infrastructure/logging/Logger.d.ts +59 -0
- package/dist/infrastructure/logging/Logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/Logger.js +182 -0
- package/dist/infrastructure/logging/Logger.js.map +1 -0
- package/dist/infrastructure/logging/index.d.ts +3 -0
- package/dist/infrastructure/logging/index.d.ts.map +1 -0
- package/dist/infrastructure/logging/index.js +8 -0
- package/dist/infrastructure/logging/index.js.map +1 -0
- package/dist/infrastructure/repositories/ProjectRepository.d.ts +20 -0
- package/dist/infrastructure/repositories/ProjectRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/ProjectRepository.js +61 -0
- package/dist/infrastructure/repositories/ProjectRepository.js.map +1 -0
- package/dist/infrastructure/repositories/QueryBuilder.d.ts +24 -0
- package/dist/infrastructure/repositories/QueryBuilder.d.ts.map +1 -0
- package/dist/infrastructure/repositories/QueryBuilder.js +92 -0
- package/dist/infrastructure/repositories/QueryBuilder.js.map +1 -0
- package/dist/infrastructure/repositories/TagRepository.d.ts +18 -0
- package/dist/infrastructure/repositories/TagRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TagRepository.js +66 -0
- package/dist/infrastructure/repositories/TagRepository.js.map +1 -0
- package/dist/infrastructure/repositories/TechnologyRepository.d.ts +16 -0
- package/dist/infrastructure/repositories/TechnologyRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TechnologyRepository.js +46 -0
- package/dist/infrastructure/repositories/TechnologyRepository.js.map +1 -0
- package/dist/infrastructure/repositories/TransactionManager.d.ts +11 -0
- package/dist/infrastructure/repositories/TransactionManager.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TransactionManager.js +21 -0
- package/dist/infrastructure/repositories/TransactionManager.js.map +1 -0
- package/dist/infrastructure/ui/ScreenManager.d.ts +11 -0
- package/dist/infrastructure/ui/ScreenManager.d.ts.map +1 -0
- package/dist/infrastructure/ui/ScreenManager.js +69 -0
- package/dist/infrastructure/ui/ScreenManager.js.map +1 -0
- package/dist/ui/cli/CLI.d.ts +9 -0
- package/dist/ui/cli/CLI.d.ts.map +1 -0
- package/dist/ui/cli/CLI.js +211 -0
- package/dist/ui/cli/CLI.js.map +1 -0
- package/dist/ui/components/DetailsPanel.d.ts +11 -0
- package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
- package/dist/ui/components/DetailsPanel.js +181 -0
- package/dist/ui/components/DetailsPanel.js.map +1 -0
- package/dist/ui/components/ProjectListView.d.ts +15 -0
- package/dist/ui/components/ProjectListView.d.ts.map +1 -0
- package/dist/ui/components/ProjectListView.js +122 -0
- package/dist/ui/components/ProjectListView.js.map +1 -0
- package/dist/ui/tui/TUIApplication.d.ts +17 -0
- package/dist/ui/tui/TUIApplication.d.ts.map +1 -0
- package/dist/ui/tui/TUIApplication.js +532 -0
- package/dist/ui/tui/TUIApplication.js.map +1 -0
- package/dist/ui/tui/Theme.d.ts +25 -0
- package/dist/ui/tui/Theme.d.ts.map +1 -0
- package/dist/ui/tui/Theme.js +62 -0
- package/dist/ui/tui/Theme.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DatabaseConnection = void 0;
|
|
40
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
/**
|
|
45
|
+
* DatabaseConnection manages SQLite database connectivity for Project Hub
|
|
46
|
+
* Implements connection pooling and provides core database operations
|
|
47
|
+
*/
|
|
48
|
+
class DatabaseConnection {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.db = null;
|
|
51
|
+
this.connectionPool = [];
|
|
52
|
+
this.poolSize = 5;
|
|
53
|
+
this.isOpen = false;
|
|
54
|
+
// Expand home directory and create path to projects.db
|
|
55
|
+
const homeDir = os.homedir();
|
|
56
|
+
const projectHubDir = path.join(homeDir, '.project-hub');
|
|
57
|
+
this.dbPath = path.join(projectHubDir, 'projects.db');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get singleton instance of DatabaseConnection
|
|
61
|
+
*/
|
|
62
|
+
static getInstance() {
|
|
63
|
+
if (!DatabaseConnection.instance) {
|
|
64
|
+
DatabaseConnection.instance = new DatabaseConnection();
|
|
65
|
+
}
|
|
66
|
+
return DatabaseConnection.instance;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reset instance for testing purposes
|
|
70
|
+
*/
|
|
71
|
+
static resetInstanceForTesting() {
|
|
72
|
+
if (DatabaseConnection.instance && DatabaseConnection.instance.isOpen) {
|
|
73
|
+
DatabaseConnection.instance.close();
|
|
74
|
+
}
|
|
75
|
+
DatabaseConnection.instance = undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Set database path for testing
|
|
79
|
+
*/
|
|
80
|
+
setTestDatabasePath(dbPath) {
|
|
81
|
+
if (this.isOpen) {
|
|
82
|
+
this.close();
|
|
83
|
+
}
|
|
84
|
+
this.dbPath = dbPath;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Open database connection
|
|
88
|
+
* Creates directory structure if it doesn't exist
|
|
89
|
+
* Initializes connection pool
|
|
90
|
+
*/
|
|
91
|
+
open() {
|
|
92
|
+
try {
|
|
93
|
+
if (this.isOpen && this.db) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Ensure ~/.project-hub directory exists
|
|
97
|
+
const homeDir = os.homedir();
|
|
98
|
+
const projectHubDir = path.join(homeDir, '.project-hub');
|
|
99
|
+
if (!fs.existsSync(projectHubDir)) {
|
|
100
|
+
fs.mkdirSync(projectHubDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Create logs directory for future use
|
|
103
|
+
const logsDir = path.join(projectHubDir, 'logs');
|
|
104
|
+
if (!fs.existsSync(logsDir)) {
|
|
105
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
// Open main database connection
|
|
108
|
+
this.db = new better_sqlite3_1.default(this.dbPath);
|
|
109
|
+
// Enable foreign keys
|
|
110
|
+
this.db.pragma('foreign_keys = ON');
|
|
111
|
+
// Set journal mode for better concurrent access
|
|
112
|
+
this.db.pragma('journal_mode = WAL');
|
|
113
|
+
// Initialize connection pool
|
|
114
|
+
this.initializeConnectionPool();
|
|
115
|
+
this.isOpen = true;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
throw new Error(`Failed to open database at ${this.dbPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Initialize connection pool for concurrent operations
|
|
123
|
+
*/
|
|
124
|
+
initializeConnectionPool() {
|
|
125
|
+
try {
|
|
126
|
+
for (let i = 0; i < this.poolSize; i++) {
|
|
127
|
+
const poolDb = new better_sqlite3_1.default(this.dbPath);
|
|
128
|
+
poolDb.pragma('foreign_keys = ON');
|
|
129
|
+
this.connectionPool.push(poolDb);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new Error(`Failed to initialize connection pool: ${error instanceof Error ? error.message : String(error)}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get a connection from the pool
|
|
138
|
+
*/
|
|
139
|
+
getPoolConnection() {
|
|
140
|
+
if (this.connectionPool.length === 0) {
|
|
141
|
+
// Create a new connection if pool is exhausted
|
|
142
|
+
const newDb = new better_sqlite3_1.default(this.dbPath);
|
|
143
|
+
newDb.pragma('foreign_keys = ON');
|
|
144
|
+
return newDb;
|
|
145
|
+
}
|
|
146
|
+
const db = this.connectionPool.pop();
|
|
147
|
+
if (!db) {
|
|
148
|
+
throw new Error('Failed to retrieve connection from pool');
|
|
149
|
+
}
|
|
150
|
+
return db;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Return a connection to the pool
|
|
154
|
+
*/
|
|
155
|
+
returnPoolConnection(db) {
|
|
156
|
+
if (this.connectionPool.length < this.poolSize) {
|
|
157
|
+
this.connectionPool.push(db);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
db.close();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Close database connection and clean up resources
|
|
165
|
+
*/
|
|
166
|
+
close() {
|
|
167
|
+
try {
|
|
168
|
+
// Close all pooled connections
|
|
169
|
+
for (const poolDb of this.connectionPool) {
|
|
170
|
+
try {
|
|
171
|
+
poolDb.close();
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
// Ignore errors during pool cleanup
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
this.connectionPool = [];
|
|
178
|
+
// Close main connection
|
|
179
|
+
if (this.db) {
|
|
180
|
+
this.db.close();
|
|
181
|
+
this.db = null;
|
|
182
|
+
}
|
|
183
|
+
this.isOpen = false;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw new Error(`Failed to close database: ${error instanceof Error ? error.message : String(error)}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Execute a SQL statement without returning results
|
|
191
|
+
* Used for INSERT, UPDATE, DELETE operations
|
|
192
|
+
*/
|
|
193
|
+
execute(sql, params) {
|
|
194
|
+
this.ensureOpen();
|
|
195
|
+
try {
|
|
196
|
+
if (!this.db) {
|
|
197
|
+
throw new Error('Database connection is not initialized');
|
|
198
|
+
}
|
|
199
|
+
const stmt = this.db.prepare(sql);
|
|
200
|
+
if (params && params.length > 0) {
|
|
201
|
+
stmt.run(...params);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
stmt.run();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
throw new Error(`Failed to execute SQL: ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Prepare a SQL statement for reuse
|
|
213
|
+
* Returns a prepared statement object
|
|
214
|
+
*/
|
|
215
|
+
prepare(sql) {
|
|
216
|
+
this.ensureOpen();
|
|
217
|
+
try {
|
|
218
|
+
if (!this.db) {
|
|
219
|
+
throw new Error('Database connection is not initialized');
|
|
220
|
+
}
|
|
221
|
+
return this.db.prepare(sql);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
throw new Error(`Failed to prepare statement: ${error instanceof Error ? error.message : String(error)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Execute a SELECT query and return all results
|
|
229
|
+
*/
|
|
230
|
+
query(sql, params) {
|
|
231
|
+
this.ensureOpen();
|
|
232
|
+
try {
|
|
233
|
+
if (!this.db) {
|
|
234
|
+
throw new Error('Database connection is not initialized');
|
|
235
|
+
}
|
|
236
|
+
const stmt = this.db.prepare(sql);
|
|
237
|
+
if (params && params.length > 0) {
|
|
238
|
+
return stmt.all(...params);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
return stmt.all();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
throw new Error(`Failed to query: ${error instanceof Error ? error.message : String(error)}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Execute a SELECT query and return first result
|
|
250
|
+
*/
|
|
251
|
+
queryOne(sql, params) {
|
|
252
|
+
this.ensureOpen();
|
|
253
|
+
try {
|
|
254
|
+
if (!this.db) {
|
|
255
|
+
throw new Error('Database connection is not initialized');
|
|
256
|
+
}
|
|
257
|
+
const stmt = this.db.prepare(sql);
|
|
258
|
+
if (params && params.length > 0) {
|
|
259
|
+
return stmt.get(...params);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
return stmt.get();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
throw new Error(`Failed to query one: ${error instanceof Error ? error.message : String(error)}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Execute a transaction
|
|
271
|
+
* All operations within the callback must succeed or all will rollback
|
|
272
|
+
*/
|
|
273
|
+
transaction(callback) {
|
|
274
|
+
this.ensureOpen();
|
|
275
|
+
try {
|
|
276
|
+
if (!this.db) {
|
|
277
|
+
throw new Error('Database connection is not initialized');
|
|
278
|
+
}
|
|
279
|
+
const transaction = this.db.transaction(callback);
|
|
280
|
+
return transaction();
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
throw new Error(`Transaction failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Verify database connection is open
|
|
288
|
+
*/
|
|
289
|
+
ensureOpen() {
|
|
290
|
+
if (!this.isOpen || !this.db) {
|
|
291
|
+
throw new Error('Database connection is not open. Call open() first.');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get the database path
|
|
296
|
+
*/
|
|
297
|
+
getDbPath() {
|
|
298
|
+
return this.dbPath;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Check if database connection is open
|
|
302
|
+
*/
|
|
303
|
+
isConnected() {
|
|
304
|
+
return this.isOpen;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get raw database instance (use with caution)
|
|
308
|
+
*/
|
|
309
|
+
getRawDatabase() {
|
|
310
|
+
this.ensureOpen();
|
|
311
|
+
if (!this.db) {
|
|
312
|
+
throw new Error('Database connection is not initialized');
|
|
313
|
+
}
|
|
314
|
+
return this.db;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.DatabaseConnection = DatabaseConnection;
|
|
318
|
+
//# sourceMappingURL=DatabaseConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseConnection.js","sourceRoot":"","sources":["../../../src/infrastructure/database/DatabaseConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation report structure
|
|
3
|
+
*/
|
|
4
|
+
export interface ValidationReport {
|
|
5
|
+
isValid: boolean;
|
|
6
|
+
schema: SchemaValidationResult;
|
|
7
|
+
constraints: ConstraintValidationResult;
|
|
8
|
+
errors: string[];
|
|
9
|
+
warnings: string[];
|
|
10
|
+
repairAttempted: boolean;
|
|
11
|
+
repairSuccessful: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Schema validation result
|
|
15
|
+
*/
|
|
16
|
+
export interface SchemaValidationResult {
|
|
17
|
+
isValid: boolean;
|
|
18
|
+
missingTables: string[];
|
|
19
|
+
invalidColumns: ColumnValidationResult[];
|
|
20
|
+
invalidIndexes: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Column validation result
|
|
24
|
+
*/
|
|
25
|
+
export interface ColumnValidationResult {
|
|
26
|
+
table: string;
|
|
27
|
+
column: string;
|
|
28
|
+
expectedType: string;
|
|
29
|
+
actualType: string;
|
|
30
|
+
issue: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Constraint validation result
|
|
34
|
+
*/
|
|
35
|
+
export interface ConstraintValidationResult {
|
|
36
|
+
isValid: boolean;
|
|
37
|
+
orphanRecords: OrphanRecord[];
|
|
38
|
+
violatedConstraints: ConstraintViolation[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Orphan record structure
|
|
42
|
+
*/
|
|
43
|
+
export interface OrphanRecord {
|
|
44
|
+
table: string;
|
|
45
|
+
foreignKeyColumn: string;
|
|
46
|
+
recordCount: number;
|
|
47
|
+
referencedTable: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Constraint violation structure
|
|
51
|
+
*/
|
|
52
|
+
export interface ConstraintViolation {
|
|
53
|
+
table: string;
|
|
54
|
+
constraint: string;
|
|
55
|
+
description: string;
|
|
56
|
+
severity: 'critical' | 'warning';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* DatabaseValidator provides comprehensive database integrity checking and repair capabilities
|
|
60
|
+
* Validates schema consistency, foreign key constraints, and data integrity
|
|
61
|
+
*/
|
|
62
|
+
export declare class DatabaseValidator {
|
|
63
|
+
private db;
|
|
64
|
+
/**
|
|
65
|
+
* Expected database schema definition
|
|
66
|
+
*/
|
|
67
|
+
private expectedSchema;
|
|
68
|
+
/**
|
|
69
|
+
* Expected indexes
|
|
70
|
+
*/
|
|
71
|
+
private expectedIndexes;
|
|
72
|
+
constructor();
|
|
73
|
+
/**
|
|
74
|
+
* Run comprehensive database validation
|
|
75
|
+
* @returns ValidationReport with complete validation results
|
|
76
|
+
*/
|
|
77
|
+
validate(): ValidationReport;
|
|
78
|
+
/**
|
|
79
|
+
* Validate database schema
|
|
80
|
+
* Checks that all required tables exist with correct columns and structure
|
|
81
|
+
*/
|
|
82
|
+
private validateSchema;
|
|
83
|
+
/**
|
|
84
|
+
* Validate database constraints
|
|
85
|
+
* Checks for orphan records and constraint violations
|
|
86
|
+
*/
|
|
87
|
+
private validateConstraints;
|
|
88
|
+
/**
|
|
89
|
+
* Attempt to repair database integrity issues
|
|
90
|
+
* Returns report of repair attempts
|
|
91
|
+
*/
|
|
92
|
+
repair(): ValidationReport;
|
|
93
|
+
/**
|
|
94
|
+
* Recreate missing tables
|
|
95
|
+
*/
|
|
96
|
+
private repairMissingTables;
|
|
97
|
+
/**
|
|
98
|
+
* Add missing columns to tables
|
|
99
|
+
*/
|
|
100
|
+
private repairInvalidColumns;
|
|
101
|
+
/**
|
|
102
|
+
* Recreate missing indexes
|
|
103
|
+
*/
|
|
104
|
+
private repairMissingIndexes;
|
|
105
|
+
/**
|
|
106
|
+
* Remove orphan records
|
|
107
|
+
*/
|
|
108
|
+
private repairOrphanRecords;
|
|
109
|
+
/**
|
|
110
|
+
* Repair constraint violations
|
|
111
|
+
*/
|
|
112
|
+
private repairConstraintViolations;
|
|
113
|
+
/**
|
|
114
|
+
* Helper: Check if table exists
|
|
115
|
+
*/
|
|
116
|
+
private tableExists;
|
|
117
|
+
/**
|
|
118
|
+
* Helper: Get table info (columns)
|
|
119
|
+
*/
|
|
120
|
+
private getTableInfo;
|
|
121
|
+
/**
|
|
122
|
+
* Helper: Get existing indexes
|
|
123
|
+
*/
|
|
124
|
+
private getExistingIndexes;
|
|
125
|
+
/**
|
|
126
|
+
* Helper: Check for orphan records
|
|
127
|
+
*/
|
|
128
|
+
private checkOrphanRecords;
|
|
129
|
+
/**
|
|
130
|
+
* Helper: Check for duplicate unique constraint values
|
|
131
|
+
*/
|
|
132
|
+
private checkDuplicateUniqueConstraint;
|
|
133
|
+
/**
|
|
134
|
+
* Helper: Check for NULL values in columns
|
|
135
|
+
*/
|
|
136
|
+
private checkNullConstraints;
|
|
137
|
+
/**
|
|
138
|
+
* Helper: Get default value for a column type
|
|
139
|
+
*/
|
|
140
|
+
private getDefaultValueForType;
|
|
141
|
+
/**
|
|
142
|
+
* Helper: Remove duplicate unique values (keep first, delete rest)
|
|
143
|
+
*/
|
|
144
|
+
private removeDuplicateUniqueValues;
|
|
145
|
+
/**
|
|
146
|
+
* Helper: Remove records with NULL in specified column
|
|
147
|
+
*/
|
|
148
|
+
private removeRecordsWithNullColumn;
|
|
149
|
+
/**
|
|
150
|
+
* Get a detailed validation summary as formatted string
|
|
151
|
+
*/
|
|
152
|
+
getValidationSummary(report: ValidationReport): string;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=DatabaseValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseValidator.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/DatabaseValidator.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,WAAW,EAAE,0BAA0B,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAqB;IAE/B;;OAEG;IACH,OAAO,CAAC,cAAc,CAgDpB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAOrB;;IAMF;;;OAGG;IACI,QAAQ,IAAI,gBAAgB;IAmDnC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAqDtB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAuF3B;;;OAGG;IACI,MAAM,IAAI,gBAAgB;IA+CjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkD3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAoBlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAatC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAOnC;;OAEG;IACI,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;CA8B9D"}
|