port-doctor-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/bin/port-doctor.js +8 -0
- package/dist/cli/commands/free.d.ts +3 -0
- package/dist/cli/commands/free.d.ts.map +1 -0
- package/dist/cli/commands/free.js +120 -0
- package/dist/cli/commands/free.js.map +1 -0
- package/dist/cli/commands/overview.d.ts +3 -0
- package/dist/cli/commands/overview.d.ts.map +1 -0
- package/dist/cli/commands/overview.js +19 -0
- package/dist/cli/commands/overview.js.map +1 -0
- package/dist/cli/commands/run.d.ts +4 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +133 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/why.d.ts +3 -0
- package/dist/cli/commands/why.d.ts.map +1 -0
- package/dist/cli/commands/why.js +24 -0
- package/dist/cli/commands/why.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +200 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/formatter.d.ts +6 -0
- package/dist/cli/output/formatter.d.ts.map +1 -0
- package/dist/cli/output/formatter.js +177 -0
- package/dist/cli/output/formatter.js.map +1 -0
- package/dist/cli/output/json.d.ts +2 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +6 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/tree.d.ts +3 -0
- package/dist/cli/output/tree.d.ts.map +1 -0
- package/dist/cli/output/tree.js +19 -0
- package/dist/cli/output/tree.js.map +1 -0
- package/dist/cli/prompts/confirm.d.ts +3 -0
- package/dist/cli/prompts/confirm.d.ts.map +1 -0
- package/dist/cli/prompts/confirm.js +53 -0
- package/dist/cli/prompts/confirm.js.map +1 -0
- package/dist/core/diagnosis/index.d.ts +4 -0
- package/dist/core/diagnosis/index.d.ts.map +1 -0
- package/dist/core/diagnosis/index.js +109 -0
- package/dist/core/diagnosis/index.js.map +1 -0
- package/dist/core/framework/index.d.ts +5 -0
- package/dist/core/framework/index.d.ts.map +1 -0
- package/dist/core/framework/index.js +211 -0
- package/dist/core/framework/index.js.map +1 -0
- package/dist/core/git/index.d.ts +3 -0
- package/dist/core/git/index.d.ts.map +1 -0
- package/dist/core/git/index.js +56 -0
- package/dist/core/git/index.js.map +1 -0
- package/dist/core/lifecycle/index.d.ts +8 -0
- package/dist/core/lifecycle/index.d.ts.map +1 -0
- package/dist/core/lifecycle/index.js +175 -0
- package/dist/core/lifecycle/index.js.map +1 -0
- package/dist/core/process/index.d.ts +9 -0
- package/dist/core/process/index.d.ts.map +1 -0
- package/dist/core/process/index.js +94 -0
- package/dist/core/process/index.js.map +1 -0
- package/dist/core/project/index.d.ts +3 -0
- package/dist/core/project/index.d.ts.map +1 -0
- package/dist/core/project/index.js +84 -0
- package/dist/core/project/index.js.map +1 -0
- package/dist/core/scanner/index.d.ts +5 -0
- package/dist/core/scanner/index.d.ts.map +1 -0
- package/dist/core/scanner/index.js +71 -0
- package/dist/core/scanner/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/darwin.d.ts +27 -0
- package/dist/platform/darwin.d.ts.map +1 -0
- package/dist/platform/darwin.js +268 -0
- package/dist/platform/darwin.js.map +1 -0
- package/dist/platform/index.d.ts +4 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +26 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/linux.d.ts +22 -0
- package/dist/platform/linux.d.ts.map +1 -0
- package/dist/platform/linux.js +217 -0
- package/dist/platform/linux.js.map +1 -0
- package/dist/platform/types.d.ts +40 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform/windows.d.ts +17 -0
- package/dist/platform/windows.d.ts.map +1 -0
- package/dist/platform/windows.js +138 -0
- package/dist/platform/windows.js.map +1 -0
- package/dist/types/index.d.ts +101 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/exec.d.ts +16 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +51 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +60 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/redaction.d.ts +5 -0
- package/dist/utils/redaction.d.ts.map +1 -0
- package/dist/utils/redaction.js +31 -0
- package/dist/utils/redaction.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ExecResult {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
exitCode: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function safeExec(command: string, options?: {
|
|
7
|
+
timeout?: number;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
maxBuffer?: number;
|
|
10
|
+
}): Promise<ExecResult>;
|
|
11
|
+
export declare function safeExecFile(file: string, args: string[], options?: {
|
|
12
|
+
timeout?: number;
|
|
13
|
+
cwd?: string;
|
|
14
|
+
maxBuffer?: number;
|
|
15
|
+
}): Promise<ExecResult>;
|
|
16
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { exec, execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
export async function safeExec(command, options = {}) {
|
|
6
|
+
const { timeout = 5000, cwd, maxBuffer = 10 * 1024 * 1024 } = options;
|
|
7
|
+
try {
|
|
8
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
9
|
+
timeout,
|
|
10
|
+
cwd,
|
|
11
|
+
maxBuffer,
|
|
12
|
+
windowsHide: true,
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
stdout: stdout.trim(),
|
|
16
|
+
stderr: stderr.trim(),
|
|
17
|
+
exitCode: 0,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return {
|
|
22
|
+
stdout: (err.stdout || '').toString().trim(),
|
|
23
|
+
stderr: (err.stderr || err.message || '').toString().trim(),
|
|
24
|
+
exitCode: typeof err.code === 'number' ? err.code : 1,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function safeExecFile(file, args, options = {}) {
|
|
29
|
+
const { timeout = 5000, cwd, maxBuffer = 10 * 1024 * 1024 } = options;
|
|
30
|
+
try {
|
|
31
|
+
const { stdout, stderr } = await execFileAsync(file, args, {
|
|
32
|
+
timeout,
|
|
33
|
+
cwd,
|
|
34
|
+
maxBuffer,
|
|
35
|
+
windowsHide: true,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
stdout: stdout.trim(),
|
|
39
|
+
stderr: stderr.trim(),
|
|
40
|
+
exitCode: 0,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return {
|
|
45
|
+
stdout: (err.stdout || '').toString().trim(),
|
|
46
|
+
stderr: (err.stderr || err.message || '').toString().trim(),
|
|
47
|
+
exitCode: typeof err.code === 'number' ? err.code : 1,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAClC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAe,EACf,UAAkE,EAAE;IAEpE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;YAClD,OAAO;YACP,GAAG;YACH,SAAS;YACT,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC5C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC3D,QAAQ,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACtD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,IAAc,EACd,UAAkE,EAAE;IAEpE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;YACzD,OAAO;YACP,GAAG;YACH,SAAS;YACT,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC5C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC3D,QAAQ,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACtD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time, size, and text formatting helpers
|
|
3
|
+
*/
|
|
4
|
+
export declare function formatDuration(seconds: number): string;
|
|
5
|
+
export declare function formatBytes(bytes: number): string;
|
|
6
|
+
export declare function shortenPath(fullPath: string, maxLength?: number): string;
|
|
7
|
+
export declare function stripAnsi(str: string): string;
|
|
8
|
+
export declare function visibleWidth(str: string): number;
|
|
9
|
+
export declare function pad(str: string, length: number, align?: 'left' | 'right'): string;
|
|
10
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAapE;AAKD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,OAAgB,GAAG,MAAM,CAKzF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time, size, and text formatting helpers
|
|
3
|
+
*/
|
|
4
|
+
export function formatDuration(seconds) {
|
|
5
|
+
if (seconds < 0)
|
|
6
|
+
return 'unknown';
|
|
7
|
+
if (seconds < 60)
|
|
8
|
+
return `${Math.floor(seconds)}s`;
|
|
9
|
+
const minutes = Math.floor(seconds / 60);
|
|
10
|
+
if (minutes < 60) {
|
|
11
|
+
const sec = Math.floor(seconds % 60);
|
|
12
|
+
return sec > 0 ? `${minutes}m ${sec}s` : `${minutes}m`;
|
|
13
|
+
}
|
|
14
|
+
const hours = Math.floor(minutes / 60);
|
|
15
|
+
const remainingMins = minutes % 60;
|
|
16
|
+
if (hours < 24) {
|
|
17
|
+
return remainingMins > 0 ? `${hours}h ${remainingMins}m` : `${hours}h`;
|
|
18
|
+
}
|
|
19
|
+
const days = Math.floor(hours / 24);
|
|
20
|
+
const remainingHours = hours % 24;
|
|
21
|
+
return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days}d`;
|
|
22
|
+
}
|
|
23
|
+
export function formatBytes(bytes) {
|
|
24
|
+
if (bytes <= 0)
|
|
25
|
+
return '0 B';
|
|
26
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
27
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
28
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;
|
|
29
|
+
}
|
|
30
|
+
export function shortenPath(fullPath, maxLength = 35) {
|
|
31
|
+
if (!fullPath)
|
|
32
|
+
return '';
|
|
33
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
34
|
+
let p = fullPath;
|
|
35
|
+
if (home && p.startsWith(home)) {
|
|
36
|
+
p = '~' + p.slice(home.length);
|
|
37
|
+
}
|
|
38
|
+
if (p.length <= maxLength)
|
|
39
|
+
return p;
|
|
40
|
+
const parts = p.split('/');
|
|
41
|
+
if (parts.length <= 3)
|
|
42
|
+
return p;
|
|
43
|
+
return `${parts[0]}/${parts[1]}/.../${parts[parts.length - 1]}`;
|
|
44
|
+
}
|
|
45
|
+
// ANSI escape code regular expression
|
|
46
|
+
const ANSI_REGEX = /\x1b\[[0-9;]*m/g;
|
|
47
|
+
export function stripAnsi(str) {
|
|
48
|
+
return str.replace(ANSI_REGEX, '');
|
|
49
|
+
}
|
|
50
|
+
export function visibleWidth(str) {
|
|
51
|
+
return stripAnsi(str).length;
|
|
52
|
+
}
|
|
53
|
+
export function pad(str, length, align = 'left') {
|
|
54
|
+
const visible = visibleWidth(str);
|
|
55
|
+
if (visible >= length)
|
|
56
|
+
return str;
|
|
57
|
+
const padding = ' '.repeat(length - visible);
|
|
58
|
+
return align === 'left' ? str + padding : padding + str;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACrC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,OAAO,GAAG,EAAE,CAAC;IACnC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACzE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,KAAK,GAAG,EAAE,CAAC;IAClC,OAAO,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,cAAc,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAS,GAAG,EAAE;IAC1D,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,IAAI,CAAC,GAAG,QAAQ,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,MAAc,EAAE,QAA0B,MAAM;IAC/E,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,GAAG,CAAC;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC7C,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/utils/redaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBzD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sensitive token and credential redaction utilities
|
|
3
|
+
*/
|
|
4
|
+
const SENSITIVE_PATTERNS = [
|
|
5
|
+
/(?:password|passwd|secret|token|api[_-]?key|apikey|auth[_-]?token|access[_-]?token|bearer|private[_-]?key|client[_-]?secret)[=\s]+([^\s&"']+)/gi,
|
|
6
|
+
/(?:--password|--token|--secret|--key|--api-key|--auth-token|--client-secret)[=\s]+([^\s"']+)/gi,
|
|
7
|
+
/(?:mongodb(?:\+srv)?|postgres(?:ql)?|mysql|redis|amqp(?:s)?):\/\/(?:[^:@\s"']+):([^@\s"']+)@/gi,
|
|
8
|
+
/Bearer\s+([a-zA-Z0-9_\-\.]{15,})/gi,
|
|
9
|
+
/eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, // JWTs
|
|
10
|
+
];
|
|
11
|
+
export function redactSensitiveData(input) {
|
|
12
|
+
if (!input)
|
|
13
|
+
return input;
|
|
14
|
+
let redacted = input;
|
|
15
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
16
|
+
redacted = redacted.replace(pattern, (match, ...groups) => {
|
|
17
|
+
// Find the secret group if captured
|
|
18
|
+
if (groups.length > 0 && typeof groups[0] === 'string') {
|
|
19
|
+
const secret = groups[0];
|
|
20
|
+
if (secret.length <= 4) {
|
|
21
|
+
return match.replace(secret, '***');
|
|
22
|
+
}
|
|
23
|
+
const masked = `${secret.slice(0, 2)}***${secret.slice(-2)}`;
|
|
24
|
+
return match.replace(secret, masked);
|
|
25
|
+
}
|
|
26
|
+
return '[REDACTED]';
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return redacted;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/utils/redaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,kBAAkB,GAAG;IACzB,iJAAiJ;IACjJ,gGAAgG;IAChG,gGAAgG;IAChG,oCAAoC;IACpC,gEAAgE,EAAE,OAAO;CAC1E,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE;YACxD,oCAAoC;YACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACvB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACtC,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "port-doctor-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Developer-first diagnostic, troubleshooting, and forensic CLI for local development ports",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"port-doctor": "./bin/port-doctor.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"bin",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18.0.0"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"watch": "tsc --watch",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"prepack": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"port",
|
|
35
|
+
"port-doctor",
|
|
36
|
+
"port-doctor-cli",
|
|
37
|
+
"port-killer",
|
|
38
|
+
"diagnostics",
|
|
39
|
+
"developer-tools",
|
|
40
|
+
"eaddrinuse",
|
|
41
|
+
"troubleshooting",
|
|
42
|
+
"process",
|
|
43
|
+
"git",
|
|
44
|
+
"cli"
|
|
45
|
+
],
|
|
46
|
+
"author": "Gaurav Singh Negi",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"picocolors": "^1.1.1"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/node": "^20.17.0",
|
|
53
|
+
"typescript": "^5.6.3",
|
|
54
|
+
"vitest": "^2.1.8"
|
|
55
|
+
}
|
|
56
|
+
}
|