commit-cop 1.1.0 → 1.1.2

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.
Files changed (130) hide show
  1. package/README.md +72 -15
  2. package/dist/brand.d.ts +4 -0
  3. package/dist/brand.d.ts.map +1 -0
  4. package/{src/brand.ts → dist/brand.js} +4 -3
  5. package/dist/brand.js.map +1 -0
  6. package/dist/checks/binaryFileCheck.js +2 -2
  7. package/dist/checks/binaryFileCheck.js.map +1 -1
  8. package/dist/checks/consoleLogCheck.d.ts.map +1 -1
  9. package/dist/checks/consoleLogCheck.js +2 -2
  10. package/dist/checks/consoleLogCheck.js.map +1 -1
  11. package/dist/checks/debuggerCheck.d.ts.map +1 -1
  12. package/dist/checks/debuggerCheck.js +2 -2
  13. package/dist/checks/debuggerCheck.js.map +1 -1
  14. package/dist/checks/envFileCheck.d.ts.map +1 -1
  15. package/dist/checks/envFileCheck.js +2 -2
  16. package/dist/checks/envFileCheck.js.map +1 -1
  17. package/dist/checks/focusedTestCheck.js +2 -2
  18. package/dist/checks/focusedTestCheck.js.map +1 -1
  19. package/dist/checks/generatedFolderCheck.js +2 -2
  20. package/dist/checks/generatedFolderCheck.js.map +1 -1
  21. package/dist/checks/junkFileCheck.d.ts.map +1 -1
  22. package/dist/checks/junkFileCheck.js +2 -2
  23. package/dist/checks/junkFileCheck.js.map +1 -1
  24. package/dist/checks/largeFileCheck.js +2 -2
  25. package/dist/checks/largeFileCheck.js.map +1 -1
  26. package/dist/checks/localHostCheck.js +2 -2
  27. package/dist/checks/localHostCheck.js.map +1 -1
  28. package/dist/checks/lockfileDriftCheck.d.ts.map +1 -1
  29. package/dist/checks/lockfileDriftCheck.js +4 -4
  30. package/dist/checks/lockfileDriftCheck.js.map +1 -1
  31. package/dist/checks/mergeConflictCheck.d.ts.map +1 -1
  32. package/dist/checks/mergeConflictCheck.js +2 -2
  33. package/dist/checks/mergeConflictCheck.js.map +1 -1
  34. package/dist/checks/secretCheck.js +19 -19
  35. package/dist/checks/secretCheck.js.map +1 -1
  36. package/dist/checks/sensitiveFilenameCheck.d.ts.map +1 -1
  37. package/dist/checks/sensitiveFilenameCheck.js +2 -2
  38. package/dist/checks/sensitiveFilenameCheck.js.map +1 -1
  39. package/dist/fix/debugCode.d.ts +3 -0
  40. package/dist/fix/debugCode.d.ts.map +1 -0
  41. package/dist/fix/debugCode.js +55 -0
  42. package/dist/fix/debugCode.js.map +1 -0
  43. package/dist/fix/focusedTests.d.ts +2 -0
  44. package/dist/fix/focusedTests.d.ts.map +1 -0
  45. package/dist/fix/focusedTests.js +22 -0
  46. package/dist/fix/focusedTests.js.map +1 -0
  47. package/dist/fix/gitignore.d.ts +2 -0
  48. package/dist/fix/gitignore.d.ts.map +1 -0
  49. package/dist/fix/gitignore.js +82 -0
  50. package/dist/fix/gitignore.js.map +1 -0
  51. package/dist/fix/junkFiles.d.ts +2 -0
  52. package/dist/fix/junkFiles.d.ts.map +1 -0
  53. package/dist/fix/junkFiles.js +14 -0
  54. package/dist/fix/junkFiles.js.map +1 -0
  55. package/dist/fix/lockfile.d.ts +2 -0
  56. package/dist/fix/lockfile.d.ts.map +1 -0
  57. package/dist/fix/lockfile.js +18 -0
  58. package/dist/fix/lockfile.js.map +1 -0
  59. package/dist/fix/matchers.d.ts +9 -0
  60. package/dist/fix/matchers.d.ts.map +1 -0
  61. package/dist/fix/matchers.js +118 -0
  62. package/dist/fix/matchers.js.map +1 -0
  63. package/dist/fix/runFix.d.ts +3 -0
  64. package/dist/fix/runFix.d.ts.map +1 -0
  65. package/dist/fix/runFix.js +82 -0
  66. package/dist/fix/runFix.js.map +1 -0
  67. package/dist/fix/unstage.d.ts +2 -0
  68. package/dist/fix/unstage.d.ts.map +1 -0
  69. package/dist/fix/unstage.js +22 -0
  70. package/dist/fix/unstage.js.map +1 -0
  71. package/dist/fix/utils.d.ts +4 -0
  72. package/dist/fix/utils.d.ts.map +1 -0
  73. package/dist/fix/utils.js +39 -0
  74. package/dist/fix/utils.js.map +1 -0
  75. package/dist/git.d.ts.map +1 -1
  76. package/dist/git.js +2 -1
  77. package/dist/git.js.map +1 -1
  78. package/dist/hook.d.ts +3 -0
  79. package/dist/hook.d.ts.map +1 -0
  80. package/dist/hook.js +87 -0
  81. package/dist/hook.js.map +1 -0
  82. package/dist/index.js +38 -21
  83. package/dist/index.js.map +1 -1
  84. package/dist/reporter.d.ts +1 -1
  85. package/dist/reporter.d.ts.map +1 -1
  86. package/dist/reporter.js +86 -28
  87. package/dist/reporter.js.map +1 -1
  88. package/dist/runScan.d.ts +2 -0
  89. package/dist/runScan.d.ts.map +1 -0
  90. package/dist/runScan.js +18 -0
  91. package/dist/runScan.js.map +1 -0
  92. package/dist/scanner.d.ts.map +1 -1
  93. package/dist/scanner.js +4 -1
  94. package/dist/scanner.js.map +1 -1
  95. package/dist/types.d.ts +4 -0
  96. package/dist/types.d.ts.map +1 -1
  97. package/package.json +7 -2
  98. package/src/checks/binaryFileCheck.ts +0 -64
  99. package/src/checks/consoleLogCheck.ts +0 -40
  100. package/src/checks/debuggerCheck.ts +0 -33
  101. package/src/checks/envFileCheck.ts +0 -26
  102. package/src/checks/focusedTestCheck.ts +0 -41
  103. package/src/checks/generatedFolderCheck.ts +0 -45
  104. package/src/checks/junkFileCheck.ts +0 -40
  105. package/src/checks/largeFileCheck.ts +0 -31
  106. package/src/checks/localHostCheck.ts +0 -40
  107. package/src/checks/lockfileDriftCheck.ts +0 -40
  108. package/src/checks/mergeConflictCheck.ts +0 -41
  109. package/src/checks/secretCheck.ts +0 -60
  110. package/src/checks/sensitiveFilenameCheck.ts +0 -51
  111. package/src/checks/utils.ts +0 -62
  112. package/src/fix/debugCode.ts +0 -74
  113. package/src/fix/focusedTests.ts +0 -26
  114. package/src/fix/gitignore.ts +0 -108
  115. package/src/fix/junkFiles.ts +0 -16
  116. package/src/fix/lockfile.ts +0 -23
  117. package/src/fix/matchers.ts +0 -141
  118. package/src/fix/runFix.ts +0 -96
  119. package/src/fix/unstage.ts +0 -25
  120. package/src/fix/utils.ts +0 -50
  121. package/src/git.ts +0 -17
  122. package/src/hook.ts +0 -98
  123. package/src/index.ts +0 -59
  124. package/src/reporter.ts +0 -88
  125. package/src/runScan.ts +0 -35
  126. package/src/scanner.ts +0 -44
  127. package/src/types.ts +0 -25
  128. package/test.ts +0 -6
  129. package/testing.ts +0 -3
  130. package/tsconfig.json +0 -44
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugCode.js","sourceRoot":"","sources":["../../src/fix/debugCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAC3D,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAE3C,SAAS,eAAe,CACtB,OAAe,EACf,OAA+D;IAE/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,IACE,CAAC,OAAO,CAAC,gBAAgB,IAAI,YAAY,CAAC;YAC1C,CAAC,OAAO,CAAC,cAAc,IAAI,UAAU,CAAC,EACtC,CAAC;YACD,OAAO,IAAI,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAAyB,EAAE;IAE3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC;IAE5B,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,WAAqB,CAAC;IAE1B,IAAI,CAAC;QACH,WAAW,GAAG,cAAc,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAE3C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE;YACpD,gBAAgB;YAChB,cAAc;SACf,CAAC,CAAC;QACH,IAAI,OAAO,KAAK,CAAC;YAAE,SAAS;QAE5B,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fixFocusedTests(cwd?: string): string[];
2
+ //# sourceMappingURL=focusedTests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedTests.d.ts","sourceRoot":"","sources":["../../src/fix/focusedTests.ts"],"names":[],"mappings":"AAUA,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CAe7D"}
@@ -0,0 +1,22 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { walkCodeFiles } from "./utils.js";
4
+ const FOCUSED_TEST_PATTERN = /\b(test|it|describe)\.only\b/g;
5
+ function isTestFile(filePath) {
6
+ return filePath.includes("test") || filePath.includes("spec");
7
+ }
8
+ export function fixFocusedTests(cwd = process.cwd()) {
9
+ const files = walkCodeFiles(cwd, isTestFile);
10
+ const fixed = [];
11
+ for (const absolutePath of files) {
12
+ const content = fs.readFileSync(absolutePath, "utf-8");
13
+ if (!FOCUSED_TEST_PATTERN.test(content))
14
+ continue;
15
+ FOCUSED_TEST_PATTERN.lastIndex = 0;
16
+ const updated = content.replace(FOCUSED_TEST_PATTERN, "$1");
17
+ fs.writeFileSync(absolutePath, updated, "utf-8");
18
+ fixed.push(path.relative(cwd, absolutePath));
19
+ }
20
+ return fixed;
21
+ }
22
+ //# sourceMappingURL=focusedTests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedTests.js","sourceRoot":"","sources":["../../src/fix/focusedTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAE7D,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAElD,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fixGitignore(cwd?: string): string[];
2
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/fix/gitignore.ts"],"names":[],"mappings":"AA+EA,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CA4B1D"}
@@ -0,0 +1,82 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const GITIGNORE_PATH = ".gitignore";
4
+ const entries = [
5
+ {
6
+ line: ".env",
7
+ isPresent: (lines) => lines.some((line) => line === ".env" || line.startsWith(".env")),
8
+ },
9
+ {
10
+ line: "node_modules/",
11
+ isPresent: (lines) => lines.some((line) => line === "node_modules" || line === "node_modules/"),
12
+ },
13
+ {
14
+ line: "dist/",
15
+ isPresent: (lines) => lines.some((line) => line === "dist" || line === "dist/"),
16
+ },
17
+ {
18
+ line: "build/",
19
+ isPresent: (lines) => lines.some((line) => line === "build" || line === "build/"),
20
+ },
21
+ {
22
+ line: ".next/",
23
+ isPresent: (lines) => lines.some((line) => line === ".next" || line === ".next/"),
24
+ },
25
+ {
26
+ line: "coverage/",
27
+ isPresent: (lines) => lines.some((line) => line === "coverage" || line === "coverage/"),
28
+ },
29
+ {
30
+ line: ".DS_Store",
31
+ isPresent: (lines) => lines.some((line) => line.toLowerCase() === ".ds_store"),
32
+ },
33
+ {
34
+ line: "Thumbs.db",
35
+ isPresent: (lines) => lines.some((line) => line.toLowerCase() === "thumbs.db"),
36
+ },
37
+ {
38
+ line: "desktop.ini",
39
+ isPresent: (lines) => lines.some((line) => line.toLowerCase() === "desktop.ini"),
40
+ },
41
+ {
42
+ line: "*.swp",
43
+ isPresent: (lines) => lines.includes("*.swp"),
44
+ },
45
+ {
46
+ line: "*.bak",
47
+ isPresent: (lines) => lines.includes("*.bak"),
48
+ },
49
+ {
50
+ line: "*.tmp",
51
+ isPresent: (lines) => lines.includes("*.tmp"),
52
+ },
53
+ ];
54
+ function parseGitignoreLines(content) {
55
+ return content
56
+ .split("\n")
57
+ .map((line) => line.trim())
58
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
59
+ }
60
+ export function fixGitignore(cwd = process.cwd()) {
61
+ const filePath = path.join(cwd, GITIGNORE_PATH);
62
+ const applied = [];
63
+ const existingContent = fs.existsSync(filePath)
64
+ ? fs.readFileSync(filePath, "utf-8")
65
+ : "";
66
+ const existingLines = parseGitignoreLines(existingContent);
67
+ const missing = entries.filter((entry) => !entry.isPresent(existingLines));
68
+ if (missing.length === 0) {
69
+ return applied;
70
+ }
71
+ const additions = missing.map((entry) => entry.line);
72
+ const needsLeadingNewline = existingContent.length > 0 && !existingContent.endsWith("\n");
73
+ const block = (needsLeadingNewline ? "\n" : "") +
74
+ (existingContent.length > 0 ? "\n" : "") +
75
+ "# Added by commit-cop wip-fix\n" +
76
+ additions.join("\n") +
77
+ "\n";
78
+ fs.writeFileSync(filePath, existingContent + block, "utf-8");
79
+ applied.push(...additions);
80
+ return applied;
81
+ }
82
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/fix/gitignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function fixJunkFiles(cwd?: string): string[];
2
+ //# sourceMappingURL=junkFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junkFiles.d.ts","sourceRoot":"","sources":["../../src/fix/junkFiles.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CAW1D"}
@@ -0,0 +1,14 @@
1
+ import fs from "node:fs";
2
+ import { isJunkFile } from "./matchers.js";
3
+ import { walkRepo } from "./utils.js";
4
+ export function fixJunkFiles(cwd = process.cwd()) {
5
+ const removed = [];
6
+ walkRepo(cwd, (absolutePath, relativePath) => {
7
+ if (!isJunkFile(relativePath))
8
+ return;
9
+ fs.unlinkSync(absolutePath);
10
+ removed.push(relativePath);
11
+ });
12
+ return removed;
13
+ }
14
+ //# sourceMappingURL=junkFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junkFiles.js","sourceRoot":"","sources":["../../src/fix/junkFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE;QAC3C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO;QAEtC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fixLockfile(cwd?: string): boolean;
2
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/fix/lockfile.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,GAAG,SAAgB,GAAG,OAAO,CAkBxD"}
@@ -0,0 +1,18 @@
1
+ import { execSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export function fixLockfile(cwd = process.cwd()) {
5
+ const packageJson = path.join(cwd, "package.json");
6
+ const packageLock = path.join(cwd, "package-lock.json");
7
+ if (!fs.existsSync(packageJson)) {
8
+ return false;
9
+ }
10
+ const needsInstall = !fs.existsSync(packageLock) ||
11
+ fs.statSync(packageJson).mtimeMs > fs.statSync(packageLock).mtimeMs;
12
+ if (!needsInstall) {
13
+ return false;
14
+ }
15
+ execSync("npm install", { cwd, stdio: "inherit" });
16
+ return true;
17
+ }
18
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/fix/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAChB,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAC3B,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;IAEtE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const GENERATED_FOLDERS: string[];
2
+ export declare function isEnvFile(file: string): boolean;
3
+ export declare function isSensitiveFile(file: string): boolean;
4
+ export declare function isGeneratedPath(file: string): boolean;
5
+ export declare function isJunkFile(file: string): boolean;
6
+ export declare function isBinaryFile(file: string): boolean;
7
+ export declare function isLargeFile(file: string): boolean;
8
+ export declare function shouldUnstage(file: string): string | null;
9
+ //# sourceMappingURL=matchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.d.ts","sourceRoot":"","sources":["../../src/fix/matchers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,UAM7B,CAAC;AAkDF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWrD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhD;AAeD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAelD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQzD"}
@@ -0,0 +1,118 @@
1
+ import fs from "node:fs";
2
+ import { getBaseName, matchesAnyPattern, normalizePath, } from "../checks/utils.js";
3
+ export const GENERATED_FOLDERS = [
4
+ "node_modules/",
5
+ "dist/",
6
+ "build/",
7
+ ".next/",
8
+ "coverage/",
9
+ ];
10
+ const junkExactNames = new Set([
11
+ ".ds_store",
12
+ "thumbs.db",
13
+ "desktop.ini",
14
+ ]);
15
+ const junkNamePatterns = [/\.swp$/i, /\.bak$/i, /\.tmp$/i, /~$/];
16
+ const sensitiveExactNames = new Set([
17
+ "id_rsa",
18
+ "id_ed25519",
19
+ "credentials.json",
20
+ "serviceaccountkey.json",
21
+ ".npmrc",
22
+ ".pypirc",
23
+ ]);
24
+ const sensitiveNamePatterns = [
25
+ /\.pem$/i,
26
+ /\.p12$/i,
27
+ /\.key$/i,
28
+ /^firebase-adminsdk.*\.json$/i,
29
+ ];
30
+ const binaryExtensions = new Set([
31
+ ".zip",
32
+ ".exe",
33
+ ".dll",
34
+ ".mp4",
35
+ ".mov",
36
+ ".sqlite",
37
+ ".db",
38
+ ]);
39
+ const MAX_SIZE_MB = 5;
40
+ function matchesGeneratedFolder(normalizedPath) {
41
+ for (const folder of GENERATED_FOLDERS) {
42
+ if (normalizedPath.startsWith(folder) ||
43
+ normalizedPath.includes(`/${folder}`)) {
44
+ return folder;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ export function isEnvFile(file) {
50
+ const baseName = getBaseName(file);
51
+ return baseName === ".env" || baseName.startsWith(".env.");
52
+ }
53
+ export function isSensitiveFile(file) {
54
+ const baseName = getBaseName(file);
55
+ const normalizedBaseName = baseName.toLowerCase();
56
+ const normalizedPath = normalizePath(file).toLowerCase();
57
+ return (sensitiveExactNames.has(normalizedBaseName) ||
58
+ matchesAnyPattern(baseName, sensitiveNamePatterns) ||
59
+ normalizedPath.endsWith("/credentials.json") ||
60
+ normalizedPath.includes("serviceaccountkey.json"));
61
+ }
62
+ export function isGeneratedPath(file) {
63
+ return matchesGeneratedFolder(normalizePath(file)) !== null;
64
+ }
65
+ export function isJunkFile(file) {
66
+ const baseName = getBaseName(file);
67
+ const normalizedBaseName = baseName.toLowerCase();
68
+ return (junkExactNames.has(normalizedBaseName) ||
69
+ matchesAnyPattern(baseName, junkNamePatterns));
70
+ }
71
+ function hasNullBytes(file) {
72
+ const buffer = fs.readFileSync(file);
73
+ const sampleSize = Math.min(buffer.length, 8192);
74
+ for (let index = 0; index < sampleSize; index += 1) {
75
+ if (buffer[index] === 0) {
76
+ return true;
77
+ }
78
+ }
79
+ return false;
80
+ }
81
+ export function isBinaryFile(file) {
82
+ if (!fs.existsSync(file))
83
+ return false;
84
+ const baseName = getBaseName(file);
85
+ const extension = baseName.includes(".")
86
+ ? baseName.slice(baseName.lastIndexOf(".")).toLowerCase()
87
+ : "";
88
+ if (binaryExtensions.has(extension))
89
+ return true;
90
+ try {
91
+ return hasNullBytes(file);
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ export function isLargeFile(file) {
98
+ if (!fs.existsSync(file))
99
+ return false;
100
+ const sizeMb = fs.statSync(file).size / 1024 / 1024;
101
+ return sizeMb > MAX_SIZE_MB;
102
+ }
103
+ export function shouldUnstage(file) {
104
+ if (isEnvFile(file))
105
+ return "environment file";
106
+ if (isSensitiveFile(file))
107
+ return "sensitive file";
108
+ if (isGeneratedPath(file))
109
+ return "generated path";
110
+ if (isJunkFile(file))
111
+ return "junk file";
112
+ if (isBinaryFile(file))
113
+ return "binary file";
114
+ if (isLargeFile(file))
115
+ return "large file";
116
+ return null;
117
+ }
118
+ //# sourceMappingURL=matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/fix/matchers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WipFixOptions } from "../types.js";
2
+ export declare function runWipFix(options?: WipFixOptions): void;
3
+ //# sourceMappingURL=runFix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFix.d.ts","sourceRoot":"","sources":["../../src/fix/runFix.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoBjD,wBAAgB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CA0E3D"}
@@ -0,0 +1,82 @@
1
+ import chalk from "chalk";
2
+ import { fixDebugCode } from "./debugCode.js";
3
+ import { fixFocusedTests } from "./focusedTests.js";
4
+ import { fixGitignore } from "./gitignore.js";
5
+ import { fixJunkFiles } from "./junkFiles.js";
6
+ import { fixLockfile } from "./lockfile.js";
7
+ import { fixUnstageRiskyFiles } from "./unstage.js";
8
+ function printSection(title, items) {
9
+ if (items.length === 0)
10
+ return;
11
+ console.log(chalk.green(`\n${title}`));
12
+ for (const item of items) {
13
+ console.log(` ${item}`);
14
+ }
15
+ }
16
+ function printSkipped(message) {
17
+ console.log(chalk.dim(`\n${message}`));
18
+ }
19
+ export function runWipFix(options = {}) {
20
+ const fixConsoleLog = Boolean(options.fixConsoleLog);
21
+ console.log(chalk.bold("commit-cop wip-fix"));
22
+ console.log(chalk.dim("(work in progress — more fixes may be added later)\n"));
23
+ const gitignoreAdded = fixGitignore();
24
+ const testsFixed = fixFocusedTests();
25
+ const debugFixed = fixDebugCode(process.cwd(), { fixConsoleLog });
26
+ const junkRemoved = fixJunkFiles();
27
+ const unstaged = fixUnstageRiskyFiles();
28
+ const lockfileSynced = fixLockfile();
29
+ if (gitignoreAdded.length > 0) {
30
+ console.log(chalk.green("Updated .gitignore:"));
31
+ for (const entry of gitignoreAdded) {
32
+ console.log(` + ${entry}`);
33
+ }
34
+ }
35
+ else {
36
+ console.log(chalk.dim(".gitignore already includes expected entries from checks"));
37
+ }
38
+ printSection("Replaced focused test (.only) calls in:", testsFixed);
39
+ if (testsFixed.length === 0) {
40
+ printSkipped("No test.only / it.only / describe.only in test files");
41
+ }
42
+ if (fixConsoleLog) {
43
+ printSection("Removed debug lines from staged files:", debugFixed);
44
+ if (debugFixed.length === 0) {
45
+ printSkipped("No staged standalone console.log or debugger lines");
46
+ }
47
+ }
48
+ else {
49
+ printSkipped("Skipped console.log removal (use --fix-console-log to enable)");
50
+ if (debugFixed.length > 0) {
51
+ printSection("Removed debugger lines from staged files:", debugFixed);
52
+ }
53
+ else {
54
+ printSkipped("No staged debugger lines");
55
+ }
56
+ }
57
+ printSection("Deleted junk files:", junkRemoved);
58
+ if (junkRemoved.length === 0) {
59
+ printSkipped("No junk files found on disk");
60
+ }
61
+ printSection("Unstaged risky files:", unstaged);
62
+ if (unstaged.length === 0) {
63
+ printSkipped("No staged env, sensitive, generated, junk, binary, or large files");
64
+ }
65
+ if (lockfileSynced) {
66
+ console.log(chalk.green("\nRan npm install to sync package-lock.json"));
67
+ }
68
+ else {
69
+ printSkipped("package-lock.json is up to date (or no package.json)");
70
+ }
71
+ printSkipped("Cannot auto-fix: merge conflicts, secrets, or localhost URLs — resolve those manually");
72
+ const changed = gitignoreAdded.length > 0 ||
73
+ testsFixed.length > 0 ||
74
+ debugFixed.length > 0 ||
75
+ junkRemoved.length > 0 ||
76
+ unstaged.length > 0 ||
77
+ lockfileSynced;
78
+ if (!changed) {
79
+ console.log(chalk.dim("\nNothing to fix."));
80
+ }
81
+ }
82
+ //# sourceMappingURL=runFix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runFix.js","sourceRoot":"","sources":["../../src/fix/runFix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function fixUnstageRiskyFiles(): string[];
2
+ //# sourceMappingURL=unstage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unstage.d.ts","sourceRoot":"","sources":["../../src/fix/unstage.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAoB/C"}
@@ -0,0 +1,22 @@
1
+ import { execSync } from "node:child_process";
2
+ import { getStagedFiles } from "../git.js";
3
+ import { shouldUnstage } from "./matchers.js";
4
+ export function fixUnstageRiskyFiles() {
5
+ let stagedFiles;
6
+ try {
7
+ stagedFiles = getStagedFiles();
8
+ }
9
+ catch {
10
+ return [];
11
+ }
12
+ const unstaged = [];
13
+ for (const file of stagedFiles) {
14
+ const reason = shouldUnstage(file);
15
+ if (!reason)
16
+ continue;
17
+ execSync(`git restore --staged -- "${file}"`, { stdio: "pipe" });
18
+ unstaged.push(`${file} (${reason})`);
19
+ }
20
+ return unstaged;
21
+ }
22
+ //# sourceMappingURL=unstage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unstage.js","sourceRoot":"","sources":["../../src/fix/unstage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,oBAAoB;IAClC,IAAI,WAAqB,CAAC;IAE1B,IAAI,CAAC;QACH,WAAW,GAAG,cAAc,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,QAAQ,CAAC,4BAA4B,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const SKIP_DIRS: Set<string>;
2
+ export declare function walkRepo(cwd: string, onFile: (absolutePath: string, relativePath: string) => void): void;
3
+ export declare function walkCodeFiles(cwd: string, predicate: (relativePath: string) => boolean, files?: string[]): string[];
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/fix/utils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,aAOpB,CAAC;AAEH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAC3D,IAAI,CAoBN;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,EAC5C,KAAK,GAAE,MAAM,EAAO,GACnB,MAAM,EAAE,CAQV"}
@@ -0,0 +1,39 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const SKIP_DIRS = new Set([
4
+ "node_modules",
5
+ "dist",
6
+ "build",
7
+ ".next",
8
+ "coverage",
9
+ ".git",
10
+ ]);
11
+ export function walkRepo(cwd, onFile) {
12
+ function walk(dir) {
13
+ if (!fs.existsSync(dir))
14
+ return;
15
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
16
+ if (SKIP_DIRS.has(entry.name))
17
+ continue;
18
+ const absolutePath = path.join(dir, entry.name);
19
+ const relativePath = path.relative(cwd, absolutePath);
20
+ if (entry.isDirectory()) {
21
+ walk(absolutePath);
22
+ continue;
23
+ }
24
+ onFile(absolutePath, relativePath);
25
+ }
26
+ }
27
+ walk(cwd);
28
+ }
29
+ export function walkCodeFiles(cwd, predicate, files = []) {
30
+ walkRepo(cwd, (absolutePath, relativePath) => {
31
+ if (!/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(relativePath))
32
+ return;
33
+ if (!predicate(relativePath))
34
+ return;
35
+ files.push(absolutePath);
36
+ });
37
+ return files;
38
+ }
39
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/fix/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CACtB,GAAW,EACX,MAA4D;IAE5D,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO;QAEhC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjE,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAExC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEtD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,SAA4C,EAC5C,QAAkB,EAAE;IAEpB,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE;QAC3C,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO;QAC7D,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YAAE,OAAO;QACrC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/git.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAazC"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAazC"}
package/dist/git.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { execSync } from "node:child_process";
2
+ import { PRODUCT_NAME } from "./brand.js";
2
3
  export function getStagedFiles() {
3
4
  try {
4
5
  const output = execSync("git diff --cached --name-only", {
@@ -10,7 +11,7 @@ export function getStagedFiles() {
10
11
  .filter(Boolean);
11
12
  }
12
13
  catch {
13
- throw new Error("CommitClean must be run inside a Git repository.");
14
+ throw new Error(`${PRODUCT_NAME} must be run inside a Git repository.`);
14
15
  }
15
16
  }
16
17
  //# sourceMappingURL=git.js.map
package/dist/git.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,+BAA+B,EAAE;YACvD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,+BAA+B,EAAE;YACvD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,uCAAuC,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
package/dist/hook.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function installHook(strict?: boolean): void;
2
+ export declare function uninstallHook(): void;
3
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AA8CA,wBAAgB,WAAW,CAAC,MAAM,UAAQ,GAAG,IAAI,CA6BhD;AAED,wBAAgB,aAAa,IAAI,IAAI,CA4BpC"}