nx-analyze 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/cli.d.ts +9 -0
- package/cli.d.ts.map +1 -0
- package/cli.js +409 -0
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -0
- package/index.js +1 -0
- package/lib/db/project.d.ts +5 -0
- package/lib/db/project.d.ts.map +1 -0
- package/lib/db/project.js +12 -0
- package/lib/db.d.ts +57 -0
- package/lib/db.d.ts.map +1 -0
- package/lib/db.js +732 -0
- package/lib/example.d.ts +3 -0
- package/lib/example.d.ts.map +1 -0
- package/lib/example.js +81 -0
- package/lib/types.d.ts +45 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -0
- package/package.json +35 -0
- package/tsconfig.lib.tsbuildinfo +1 -0
package/cli.d.ts
ADDED
package/cli.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CACvE,GACA,OAAO,CAAC,MAAM,CAAC,CAkZjB"}
|
package/cli.js
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ProjectDatabase } from './lib/db.js';
|
|
3
|
+
import * as process from 'process';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
export async function runCLI(args, opts) {
|
|
6
|
+
const logger = opts?.logger ?? console;
|
|
7
|
+
const command = args[0];
|
|
8
|
+
if (!command) {
|
|
9
|
+
logger.log(`
|
|
10
|
+
Usage: nx-tools-db <command> [options]
|
|
11
|
+
|
|
12
|
+
Commands:
|
|
13
|
+
sync-nx [workspace-root] Sync all Nx projects to database
|
|
14
|
+
list-projects List all projects
|
|
15
|
+
list-files <project> List files in project
|
|
16
|
+
find-projects <filepath> Find projects containing file
|
|
17
|
+
dependencies <project> Show project dependencies
|
|
18
|
+
dependents <project> Show projects that depend on this project
|
|
19
|
+
|
|
20
|
+
Git Commands:
|
|
21
|
+
sync-git [commit-count] Sync git commits and touched files (default: 100 commits)
|
|
22
|
+
list-commits [limit] List recent git commits from database (default: 50)
|
|
23
|
+
touched-files [commit-hash] List files touched in commits (optionally for specific commit)
|
|
24
|
+
touched-projects [commit-count] Show projects touched by recent git changes (default: 100)
|
|
25
|
+
|
|
26
|
+
File Dependency Commands:
|
|
27
|
+
sync-file-deps [workspace-root] Sync file dependencies from Nx file-map.json
|
|
28
|
+
file-deps <file> List files that the given file depends on
|
|
29
|
+
file-dependents <file> List files that depend on the given file
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
nx-tools-db sync-nx # Sync all Nx projects
|
|
33
|
+
nx-tools-db create-project "my-app" "My application"
|
|
34
|
+
nx-tools-db add-file "my-app" "src/main.ts" "ts"
|
|
35
|
+
nx-tools-db list-files "my-app"
|
|
36
|
+
nx-tools-db dependencies "my-app" # Show what my-app depends on
|
|
37
|
+
nx-tools-db dependents "shared-lib" # Show what depends on shared-lib
|
|
38
|
+
nx-tools-db affected "src/lib/utils.ts" "package.json"
|
|
39
|
+
nx-tools-db sync-git 50 # Sync last 50 git commits
|
|
40
|
+
nx-tools-db list-commits 20 # Show last 20 commits
|
|
41
|
+
nx-tools-db touched-files abc123 # Show files touched in commit abc123
|
|
42
|
+
nx-tools-db git-affected 50 # Show projects affected by last 50 commits
|
|
43
|
+
`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const dbPath = opts?.dbPath ?? path.join(process.cwd(), 'nx-projects.db');
|
|
47
|
+
const db = new ProjectDatabase(dbPath);
|
|
48
|
+
let exitCode = 0;
|
|
49
|
+
try {
|
|
50
|
+
switch (command) {
|
|
51
|
+
case 'sync-nx': {
|
|
52
|
+
const [workspaceRoot] = args.slice(1);
|
|
53
|
+
logger.log('Syncing Nx workspace to database...');
|
|
54
|
+
const projectGraph = await db.syncWithNxWorkspace(workspaceRoot);
|
|
55
|
+
logger.log(`Successfully synced ${Object.keys(projectGraph.nodes).length} projects`);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'create-project': {
|
|
59
|
+
const [name, description] = args.slice(1);
|
|
60
|
+
if (!name) {
|
|
61
|
+
logger.error('Project name is required');
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
const id = await db.createProject(name, description);
|
|
65
|
+
logger.log(`Created project "${name}" with ID ${id}`);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case 'list-projects': {
|
|
69
|
+
const projects = await db.getAllProjects();
|
|
70
|
+
if (projects.length === 0) {
|
|
71
|
+
logger.log('No projects found');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
logger.log('Projects:');
|
|
75
|
+
projects.forEach((project) => {
|
|
76
|
+
logger.log(` ${project.name}${project.description ? ` - ${project.description}` : ''}`);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'delete-project': {
|
|
82
|
+
const [name] = args.slice(1);
|
|
83
|
+
if (!name) {
|
|
84
|
+
logger.error('Project name is required');
|
|
85
|
+
return 1;
|
|
86
|
+
}
|
|
87
|
+
const deleted = await db.deleteProject(name);
|
|
88
|
+
if (deleted) {
|
|
89
|
+
logger.log(`Deleted project "${name}"`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
logger.log(`Project "${name}" not found`);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case 'list-files': {
|
|
97
|
+
const [projectName] = args.slice(1);
|
|
98
|
+
if (!projectName) {
|
|
99
|
+
logger.error('Project name is required');
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
const files = await db.getProjectFiles(projectName);
|
|
103
|
+
if (files.length === 0) {
|
|
104
|
+
logger.log(`No files found in project "${projectName}"`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
logger.log(`Files in project "${projectName}":`);
|
|
108
|
+
files.forEach((file) => {
|
|
109
|
+
logger.log(` ${file.file_path}${file.file_type ? ` (${file.file_type})` : ''}`);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case 'find-projects': {
|
|
115
|
+
const [filePath] = args.slice(1);
|
|
116
|
+
if (!filePath) {
|
|
117
|
+
logger.error('File path is required');
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
const projects = await db.getFileProjects(filePath);
|
|
121
|
+
if (projects.length === 0) {
|
|
122
|
+
logger.log(`File "${filePath}" not found in any project`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
logger.log(`File "${filePath}" found in projects:`);
|
|
126
|
+
projects.forEach((project) => {
|
|
127
|
+
logger.log(` ${project.name}`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
case 'sync-file-deps': {
|
|
133
|
+
const [workspaceRoot] = args.slice(1);
|
|
134
|
+
logger.log('Syncing file dependencies from Nx file map...');
|
|
135
|
+
const count = await db.syncFileDependenciesFromNx(workspaceRoot);
|
|
136
|
+
logger.log(`Synced ${count} file dependency relations`);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'file-deps': {
|
|
140
|
+
const [filePath] = args.slice(1);
|
|
141
|
+
if (!filePath) {
|
|
142
|
+
logger.error('File path is required');
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
const deps = await db.getFileDependencies(filePath);
|
|
146
|
+
if (deps.length === 0) {
|
|
147
|
+
logger.log(`No dependencies recorded for "${filePath}"`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
logger.log(`Dependencies of "${filePath}":`);
|
|
151
|
+
deps.forEach((d) => logger.log(` ${d}`));
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'file-dependents': {
|
|
156
|
+
const [filePath] = args.slice(1);
|
|
157
|
+
if (!filePath) {
|
|
158
|
+
logger.error('File path is required');
|
|
159
|
+
return 1;
|
|
160
|
+
}
|
|
161
|
+
const dependents = await db.getFileDependents(filePath);
|
|
162
|
+
if (dependents.length === 0) {
|
|
163
|
+
logger.log(`No dependents recorded for "${filePath}"`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
logger.log(`Files depending on "${filePath}":`);
|
|
167
|
+
dependents.forEach((f) => logger.log(` ${f}`));
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case 'dependencies': {
|
|
172
|
+
const [projectName] = args.slice(1);
|
|
173
|
+
if (!projectName) {
|
|
174
|
+
logger.error('Project name is required');
|
|
175
|
+
return 1;
|
|
176
|
+
}
|
|
177
|
+
const dependencies = await db.getProjectDependencies(projectName);
|
|
178
|
+
if (dependencies.length === 0) {
|
|
179
|
+
logger.log(`Project "${projectName}" has no dependencies`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
logger.log(`Dependencies of "${projectName}":`);
|
|
183
|
+
dependencies.forEach((dep) => {
|
|
184
|
+
logger.log(` ${dep}`);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'dependents': {
|
|
190
|
+
const [projectName] = args.slice(1);
|
|
191
|
+
if (!projectName) {
|
|
192
|
+
logger.error('Project name is required');
|
|
193
|
+
return 1;
|
|
194
|
+
}
|
|
195
|
+
const dependents = await db.getProjectDependents(projectName);
|
|
196
|
+
if (dependents.length === 0) {
|
|
197
|
+
logger.log(`No projects depend on "${projectName}"`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
logger.log(`Projects that depend on "${projectName}":`);
|
|
201
|
+
dependents.forEach((dep) => {
|
|
202
|
+
logger.log(` ${dep}`);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case 'add-file': {
|
|
208
|
+
const [projectName, filePath, fileType] = args.slice(1);
|
|
209
|
+
if (!projectName || !filePath) {
|
|
210
|
+
logger.error('Project name and file path are required');
|
|
211
|
+
return 1;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
// fileType may be a short string like 'ts' - convert to array to match API
|
|
215
|
+
await db.addFileToProject(projectName, filePath, fileType ? [fileType] : undefined);
|
|
216
|
+
logger.log(`Added "${filePath}" to project "${projectName}"`);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
logger.error('Error:', error instanceof Error ? error.message : error);
|
|
220
|
+
return 1;
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case 'remove-file': {
|
|
225
|
+
const [projectName, filePath] = args.slice(1);
|
|
226
|
+
if (!projectName || !filePath) {
|
|
227
|
+
logger.error('Project name and file path are required');
|
|
228
|
+
return 1;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const removed = await db.removeFileFromProject(projectName, filePath);
|
|
232
|
+
if (removed) {
|
|
233
|
+
logger.log(`Removed "${filePath}" from project "${projectName}"`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
logger.log(`File "${filePath}" not found in project "${projectName}"`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
logger.error('Error:', error instanceof Error ? error.message : error);
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
case 'by-type': {
|
|
246
|
+
const [type] = args.slice(1);
|
|
247
|
+
if (!type) {
|
|
248
|
+
logger.error('Project type is required');
|
|
249
|
+
return 1;
|
|
250
|
+
}
|
|
251
|
+
const projects = await db.getProjectsByType(type);
|
|
252
|
+
if (projects.length === 0) {
|
|
253
|
+
logger.log(`No projects of type "${type}"`);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
logger.log(`Projects of type "${type}":`);
|
|
257
|
+
projects.forEach((p) => logger.log(` ${p.name}`));
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case 'by-tag': {
|
|
262
|
+
const [tag] = args.slice(1);
|
|
263
|
+
if (!tag) {
|
|
264
|
+
logger.error('Tag is required');
|
|
265
|
+
return 1;
|
|
266
|
+
}
|
|
267
|
+
const projects = await db.getProjectsByTag(tag);
|
|
268
|
+
if (projects.length === 0) {
|
|
269
|
+
logger.log(`No projects with tag "${tag}"`);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
logger.log(`Projects with tag "${tag}":`);
|
|
273
|
+
projects.forEach((p) => logger.log(` ${p.name}`));
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
case 'git-affected': {
|
|
278
|
+
const [commitCountStr] = args.slice(1);
|
|
279
|
+
const commitCount = commitCountStr ? parseInt(commitCountStr, 10) : 100;
|
|
280
|
+
if (isNaN(commitCount) || commitCount <= 0) {
|
|
281
|
+
logger.error('Commit count must be a positive number');
|
|
282
|
+
return 1;
|
|
283
|
+
}
|
|
284
|
+
const projects = await db.getProjectsTouchedByCommits(commitCount);
|
|
285
|
+
if (projects.length === 0) {
|
|
286
|
+
logger.log('No projects affected');
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
logger.log(`Projects affected by last ${commitCount} commits:`);
|
|
290
|
+
projects.forEach((p) => logger.log(` ${p}`));
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'affected': {
|
|
295
|
+
const changedFiles = args.slice(1);
|
|
296
|
+
if (changedFiles.length === 0) {
|
|
297
|
+
logger.error('At least one file path is required');
|
|
298
|
+
return 1;
|
|
299
|
+
}
|
|
300
|
+
const affectedProjects = await db.getAffectedProjects(changedFiles);
|
|
301
|
+
if (affectedProjects.length === 0) {
|
|
302
|
+
logger.log('No projects are affected by the changed files');
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
logger.log(`Projects affected by changes to: ${changedFiles.join(', ')}`);
|
|
306
|
+
affectedProjects.forEach((project) => {
|
|
307
|
+
logger.log(` ${project}`);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case 'sync-git': {
|
|
313
|
+
const [commitCountStr] = args.slice(1);
|
|
314
|
+
const commitCount = commitCountStr ? parseInt(commitCountStr, 10) : 100;
|
|
315
|
+
if (isNaN(commitCount) || commitCount <= 0) {
|
|
316
|
+
logger.error('Commit count must be a positive number');
|
|
317
|
+
return 1;
|
|
318
|
+
}
|
|
319
|
+
logger.log(`Syncing last ${commitCount} git commits...`);
|
|
320
|
+
await db.syncGitCommits(commitCount);
|
|
321
|
+
logger.log('Git sync completed successfully');
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case 'list-commits': {
|
|
325
|
+
const [limitStr] = args.slice(1);
|
|
326
|
+
const limit = limitStr ? parseInt(limitStr, 10) : 50;
|
|
327
|
+
if (isNaN(limit) || limit <= 0) {
|
|
328
|
+
logger.error('Limit must be a positive number');
|
|
329
|
+
return 1;
|
|
330
|
+
}
|
|
331
|
+
const commits = await db.getCommits(limit);
|
|
332
|
+
if (commits.length === 0) {
|
|
333
|
+
logger.log('No commits found in database');
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
logger.log(`Recent commits (last ${commits.length}):`);
|
|
337
|
+
commits.forEach((commit) => {
|
|
338
|
+
const shortHash = commit.hash.substring(0, 8);
|
|
339
|
+
const shortMessage = commit.message.length > 60
|
|
340
|
+
? commit.message.substring(0, 60) + '...'
|
|
341
|
+
: commit.message;
|
|
342
|
+
logger.log(` ${shortHash} - ${commit.author} (${commit.date}) - ${shortMessage}`);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case 'touched-files': {
|
|
348
|
+
const [commitHash] = args.slice(1);
|
|
349
|
+
const touchedFiles = await db.getTouchedFiles(commitHash);
|
|
350
|
+
if (touchedFiles.length === 0) {
|
|
351
|
+
const msg = commitHash
|
|
352
|
+
? `No files found for commit ${commitHash}`
|
|
353
|
+
: 'No touched files found in database';
|
|
354
|
+
logger.log(msg);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
const msg = commitHash
|
|
358
|
+
? `Files touched in commit ${commitHash}:`
|
|
359
|
+
: 'Recently touched files:';
|
|
360
|
+
logger.log(msg);
|
|
361
|
+
touchedFiles.forEach((file) => {
|
|
362
|
+
logger.log(` ${file.change_type} ${file.file_path}`);
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
case 'touched-projects': {
|
|
368
|
+
const [commitCountStr] = args.slice(1);
|
|
369
|
+
const commitCount = commitCountStr ? parseInt(commitCountStr, 10) : 100;
|
|
370
|
+
if (isNaN(commitCount) || commitCount <= 0) {
|
|
371
|
+
logger.error('Commit count must be a positive number');
|
|
372
|
+
return 1;
|
|
373
|
+
}
|
|
374
|
+
const touchedProjects = await db.getProjectsTouchedByCommits(commitCount);
|
|
375
|
+
if (touchedProjects.length === 0) {
|
|
376
|
+
logger.log(`No projects touched by changes in last ${commitCount} commits`);
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
logger.log(`Projects touched by changes in last ${commitCount} commits:`);
|
|
380
|
+
touchedProjects.forEach((project) => {
|
|
381
|
+
logger.log(` ${project}`);
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
default:
|
|
387
|
+
logger.error(`Unknown command: ${command}`);
|
|
388
|
+
return 1;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
logger.error('Error:', error instanceof Error ? error.message : error);
|
|
393
|
+
exitCode = 1;
|
|
394
|
+
}
|
|
395
|
+
finally {
|
|
396
|
+
await db.close();
|
|
397
|
+
}
|
|
398
|
+
return exitCode;
|
|
399
|
+
}
|
|
400
|
+
if (typeof process.env.JEST_WORKER_ID === 'undefined') {
|
|
401
|
+
async function main() {
|
|
402
|
+
const code = await runCLI(process.argv.slice(2));
|
|
403
|
+
process.exit(code);
|
|
404
|
+
}
|
|
405
|
+
main().catch((error) => {
|
|
406
|
+
console.error('Fatal error:', error);
|
|
407
|
+
process.exit(1);
|
|
408
|
+
});
|
|
409
|
+
}
|
package/index.d.ts
ADDED
package/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/db.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/lib/db/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,KAAK,aAAa,GAAG,cAAc,SAAS,CAAC,CAAC;AAE9C,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAcnH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export async function getProjectsByTag(db, tag) {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
db.all('SELECT * FROM projects WHERE tags LIKE ? ORDER BY name', [`%${tag}%`], (err, rows) => {
|
|
4
|
+
if (err) {
|
|
5
|
+
reject(err);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
resolve(rows);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
package/lib/db.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ProjectGraph } from '@nx/devkit';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { Project, ProjectFile, SymbolDefinition, GitCommit, TouchedFile } from './types.js';
|
|
4
|
+
export declare class ProjectDatabase {
|
|
5
|
+
private db;
|
|
6
|
+
private dbPath;
|
|
7
|
+
constructor(dbPath?: string);
|
|
8
|
+
private initializeDatabase;
|
|
9
|
+
private query;
|
|
10
|
+
syncWithNxWorkspace(workspaceRoot?: string): Promise<ProjectGraph>;
|
|
11
|
+
private syncNxProject;
|
|
12
|
+
createProject(name: string, description?: string): Promise<number>;
|
|
13
|
+
createProjectFromNx(name: string, nxData: {
|
|
14
|
+
description?: string;
|
|
15
|
+
project_type?: string;
|
|
16
|
+
source_root?: string;
|
|
17
|
+
root?: string;
|
|
18
|
+
tags?: string;
|
|
19
|
+
}): Promise<number>;
|
|
20
|
+
updateProject(name: string, updates: {
|
|
21
|
+
description?: string;
|
|
22
|
+
project_type?: string;
|
|
23
|
+
source_root?: string;
|
|
24
|
+
root?: string;
|
|
25
|
+
tags?: string;
|
|
26
|
+
}): Promise<boolean>;
|
|
27
|
+
getProject(name: string): Promise<Project | null>;
|
|
28
|
+
getAllProjects(): Promise<Project[]>;
|
|
29
|
+
deleteProject(name: string): Promise<boolean>;
|
|
30
|
+
getProjectsByType(projectType: string): Promise<Project[]>;
|
|
31
|
+
getProjectsByTag(tag: string): Promise<Project[]>;
|
|
32
|
+
addFileToProject(projectName: string, filePath: string, fileDeps?: string[]): Promise<void>;
|
|
33
|
+
removeFileFromProject(projectName: string, filePath: string): Promise<boolean>;
|
|
34
|
+
getProjectFiles(projectName: string): Promise<ProjectFile[]>;
|
|
35
|
+
getFileProjects(filePath: string): Promise<Project[]>;
|
|
36
|
+
getProjectDependencies(projectName: string): Promise<string[]>;
|
|
37
|
+
getProjectDependents(projectName: string): Promise<string[]>;
|
|
38
|
+
getAffectedProjects(changedFiles: string[]): Promise<string[]>;
|
|
39
|
+
clearFileDependencies(): Promise<void>;
|
|
40
|
+
findDefinition(fileName: string, targetPackage: string, program?: ts.Program, checker?: ts.TypeChecker): SymbolDefinition[];
|
|
41
|
+
addFileDependency(filePath: string, dependsOn: string): Promise<void[]>;
|
|
42
|
+
getFileDependencies(filePath: string): Promise<string[]>;
|
|
43
|
+
getFileDependents(dependsOn: string): Promise<string[]>;
|
|
44
|
+
syncFileDependenciesFromNx(workspaceRoot?: string): Promise<number>;
|
|
45
|
+
syncGitCommits(commitCount?: number): Promise<void>;
|
|
46
|
+
private saveCommitWithFiles;
|
|
47
|
+
private insertCommit;
|
|
48
|
+
private insertTouchedFile;
|
|
49
|
+
getCommits(limit?: number): Promise<GitCommit[]>;
|
|
50
|
+
getTouchedFiles(commitHash?: string): Promise<TouchedFile[]>;
|
|
51
|
+
getFilesTouchedInLastCommits(commitCount?: number): Promise<string[]>;
|
|
52
|
+
getProjectsTouchedByCommits(commitCount?: number): Promise<string[]>;
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
export declare function createDatabase(dbPath?: string): Promise<ProjectDatabase>;
|
|
56
|
+
export declare function db(): string;
|
|
57
|
+
//# sourceMappingURL=db.d.ts.map
|
package/lib/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"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"}
|