tangkal 1.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.
Files changed (46) hide show
  1. package/README.md +62 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +4 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/analyzers/dependencies.d.ts +4 -0
  7. package/dist/src/analyzers/dependencies.d.ts.map +1 -0
  8. package/dist/src/analyzers/dependencies.js +79 -0
  9. package/dist/src/analyzers/dependencies.js.map +1 -0
  10. package/dist/src/analyzers/network.d.ts +17 -0
  11. package/dist/src/analyzers/network.d.ts.map +1 -0
  12. package/dist/src/analyzers/network.js +203 -0
  13. package/dist/src/analyzers/network.js.map +1 -0
  14. package/dist/src/analyzers/static-analysis.d.ts +18 -0
  15. package/dist/src/analyzers/static-analysis.d.ts.map +1 -0
  16. package/dist/src/analyzers/static-analysis.js +246 -0
  17. package/dist/src/analyzers/static-analysis.js.map +1 -0
  18. package/dist/src/cli.d.ts +2 -0
  19. package/dist/src/cli.d.ts.map +1 -0
  20. package/dist/src/cli.js +112 -0
  21. package/dist/src/cli.js.map +1 -0
  22. package/dist/src/config.d.ts +9 -0
  23. package/dist/src/config.d.ts.map +1 -0
  24. package/dist/src/config.js +40 -0
  25. package/dist/src/config.js.map +1 -0
  26. package/dist/src/scanner.d.ts +8 -0
  27. package/dist/src/scanner.d.ts.map +1 -0
  28. package/dist/src/scanner.js +115 -0
  29. package/dist/src/scanner.js.map +1 -0
  30. package/dist/src/utils/entropy.d.ts +7 -0
  31. package/dist/src/utils/entropy.d.ts.map +1 -0
  32. package/dist/src/utils/entropy.js +25 -0
  33. package/dist/src/utils/entropy.js.map +1 -0
  34. package/dist/src/utils/ignore.d.ts +3 -0
  35. package/dist/src/utils/ignore.d.ts.map +1 -0
  36. package/dist/src/utils/ignore.js +18 -0
  37. package/dist/src/utils/ignore.js.map +1 -0
  38. package/dist/src/utils/lockfile.d.ts +9 -0
  39. package/dist/src/utils/lockfile.d.ts.map +1 -0
  40. package/dist/src/utils/lockfile.js +143 -0
  41. package/dist/src/utils/lockfile.js.map +1 -0
  42. package/dist/src/utils/popular-packages.d.ts +2 -0
  43. package/dist/src/utils/popular-packages.d.ts.map +1 -0
  44. package/dist/src/utils/popular-packages.js +22 -0
  45. package/dist/src/utils/popular-packages.js.map +1 -0
  46. package/package.json +53 -0
@@ -0,0 +1,18 @@
1
+ import ignore from 'ignore';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ export async function loadIgnore(dir) {
5
+ const ig = ignore();
6
+ const ignorePath = path.join(dir, '.tangkalignore');
7
+ try {
8
+ const content = await fs.readFile(ignorePath, 'utf-8');
9
+ ig.add(content);
10
+ }
11
+ catch (e) {
12
+ // If file doesn't exist, we just return the empty ignore instance
13
+ }
14
+ // Always ignore common noise
15
+ ig.add(['node_modules', '.git', 'dist', 'build', 'coverage', '*.min.js', '*.map']);
16
+ return ig;
17
+ }
18
+ //# sourceMappingURL=ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../src/utils/ignore.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kEAAkE;IACpE,CAAC;IAED,6BAA6B;IAC7B,EAAE,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnF,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface Dependency {
2
+ name: string;
3
+ version: string;
4
+ }
5
+ /**
6
+ * Parses lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) to get a flat list of dependencies.
7
+ */
8
+ export declare function parsePackageLock(dir: string): Promise<Dependency[] | null>;
9
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../../src/utils/lockfile.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAmIhF"}
@@ -0,0 +1,143 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import * as yarnLockfile from '@yarnpkg/lockfile';
4
+ import yaml from 'yaml';
5
+ /**
6
+ * Parses lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) to get a flat list of dependencies.
7
+ */
8
+ export async function parsePackageLock(dir) {
9
+ // 1. Try package-lock.json
10
+ try {
11
+ const lockPath = path.join(dir, 'package-lock.json');
12
+ const content = await fs.readFile(lockPath, 'utf-8');
13
+ const lock = JSON.parse(content);
14
+ const dependencies = [];
15
+ if (lock.packages) {
16
+ for (const [key, val] of Object.entries(lock.packages)) {
17
+ if (key === '')
18
+ continue;
19
+ const name = key.split('node_modules/').pop();
20
+ if (name && typeof val.version === 'string') {
21
+ dependencies.push({ name, version: val.version });
22
+ }
23
+ }
24
+ }
25
+ else if (lock.dependencies) {
26
+ // v1 recursive
27
+ const traverse = (deps) => {
28
+ for (const [name, val] of Object.entries(deps)) {
29
+ if (typeof val.version === 'string') {
30
+ dependencies.push({ name, version: val.version });
31
+ }
32
+ if (val.dependencies)
33
+ traverse(val.dependencies);
34
+ }
35
+ };
36
+ traverse(lock.dependencies);
37
+ }
38
+ return deduplicate(dependencies);
39
+ }
40
+ catch (e) { }
41
+ // 2. Try yarn.lock
42
+ try {
43
+ const lockPath = path.join(dir, 'yarn.lock');
44
+ const content = await fs.readFile(lockPath, 'utf-8');
45
+ const parsed = yarnLockfile.parse(content);
46
+ if (parsed.type === 'success' && parsed.object) {
47
+ const dependencies = [];
48
+ for (const [key, val] of Object.entries(parsed.object)) {
49
+ const nameMatch = key.match(/^(@?[^@]+)@/);
50
+ const name = nameMatch ? nameMatch[1] : key;
51
+ if (name && typeof val.version === 'string') {
52
+ dependencies.push({ name, version: val.version });
53
+ }
54
+ }
55
+ return deduplicate(dependencies);
56
+ }
57
+ }
58
+ catch (e) { }
59
+ // 3. Try pnpm-lock.yaml
60
+ try {
61
+ const lockPath = path.join(dir, 'pnpm-lock.yaml');
62
+ const content = await fs.readFile(lockPath, 'utf-8');
63
+ const parsed = yaml.parse(content);
64
+ const dependencies = [];
65
+ if (parsed.packages) {
66
+ for (const key of Object.keys(parsed.packages)) {
67
+ let cleanKey = key.startsWith('/') ? key.substring(1) : key;
68
+ if (cleanKey.includes('(')) {
69
+ cleanKey = cleanKey.split('(')[0] ?? cleanKey;
70
+ }
71
+ const parts = cleanKey.split('/');
72
+ if (parts.length >= 2) {
73
+ const version = parts.pop();
74
+ const name = parts.join('/');
75
+ if (name && typeof version === 'string') {
76
+ dependencies.push({ name, version });
77
+ }
78
+ }
79
+ else if (cleanKey.includes('@')) {
80
+ const lastAt = cleanKey.lastIndexOf('@');
81
+ const name = cleanKey.substring(0, lastAt);
82
+ const version = cleanKey.substring(lastAt + 1);
83
+ if (name && typeof version === 'string') {
84
+ dependencies.push({ name, version });
85
+ }
86
+ }
87
+ }
88
+ return deduplicate(dependencies);
89
+ }
90
+ }
91
+ catch (e) { }
92
+ // 4. Try bun.lock (Text format)
93
+ try {
94
+ const lockPath = path.join(dir, 'bun.lock');
95
+ const content = await fs.readFile(lockPath, 'utf-8');
96
+ if (content.trim().startsWith('#') || content.includes('lockfile v1')) {
97
+ const parsed = yarnLockfile.parse(content);
98
+ if (parsed.type === 'success' && parsed.object) {
99
+ const dependencies = [];
100
+ for (const [key, val] of Object.entries(parsed.object)) {
101
+ const nameMatch = key.match(/^(@?[^@]+)@/);
102
+ const name = nameMatch ? nameMatch[1] : key;
103
+ if (name && typeof val.version === 'string') {
104
+ dependencies.push({ name, version: val.version });
105
+ }
106
+ }
107
+ return deduplicate(dependencies);
108
+ }
109
+ }
110
+ }
111
+ catch (e) { }
112
+ // 5. Try deno.lock (JSON)
113
+ try {
114
+ const lockPath = path.join(dir, 'deno.lock');
115
+ const content = await fs.readFile(lockPath, 'utf-8');
116
+ const lock = JSON.parse(content);
117
+ const dependencies = [];
118
+ if (lock.packages && lock.packages.specifiers) {
119
+ for (const key of Object.keys(lock.packages.specifiers)) {
120
+ if (key.startsWith('npm:')) {
121
+ const resolved = lock.packages.specifiers[key];
122
+ if (typeof resolved === 'string' && resolved.startsWith('npm:')) {
123
+ const parts = resolved.replace('npm:', '').split('@');
124
+ const version = parts.pop();
125
+ const name = parts.join('@');
126
+ if (name && typeof version === 'string') {
127
+ dependencies.push({ name, version });
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return deduplicate(dependencies);
134
+ }
135
+ catch (e) { }
136
+ return null;
137
+ }
138
+ function deduplicate(deps) {
139
+ const unique = new Map();
140
+ deps.forEach(d => unique.set(`${d.name}@${d.version}`, d));
141
+ return Array.from(unique.values());
142
+ }
143
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../src/utils/lockfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getPopularPackages(): Promise<string[]>;
2
+ //# sourceMappingURL=popular-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popular-packages.d.ts","sourceRoot":"","sources":["../../../src/utils/popular-packages.ts"],"names":[],"mappings":"AAMA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAe5D"}
@@ -0,0 +1,22 @@
1
+ import axios from 'axios';
2
+ import { POPULAR_PACKAGES as FALLBACK_PACKAGES } from '../config.js';
3
+ const LIST_URL = 'https://raw.githubusercontent.com/wooorm/npm-high-impact/main/data.json';
4
+ let cachedPackages = null;
5
+ export async function getPopularPackages() {
6
+ if (cachedPackages)
7
+ return cachedPackages;
8
+ try {
9
+ const { data } = await axios.get(LIST_URL, { timeout: 5000 });
10
+ if (Array.isArray(data)) {
11
+ cachedPackages = [...new Set([...data, ...FALLBACK_PACKAGES])];
12
+ }
13
+ else {
14
+ cachedPackages = FALLBACK_PACKAGES;
15
+ }
16
+ }
17
+ catch (e) {
18
+ cachedPackages = FALLBACK_PACKAGES;
19
+ }
20
+ return cachedPackages;
21
+ }
22
+ //# sourceMappingURL=popular-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popular-packages.js","sourceRoot":"","sources":["../../../src/utils/popular-packages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,QAAQ,GAAG,yEAAyE,CAAC;AAC3F,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,iBAAiB,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,GAAG,iBAAiB,CAAC;IACrC,CAAC;IAED,OAAO,cAAe,CAAC;AACzB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "tangkal",
3
+ "version": "1.1.0",
4
+ "description": "Preventive security scanner for cloned repositories. Detects malicious AST patterns, vulnerable dependencies, and typosquatting.",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "tangkal": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "pnpm build",
17
+ "test": "echo \"Error: no test specified\" && exit 1"
18
+ },
19
+ "keywords": [
20
+ "security",
21
+ "scanner",
22
+ "malware",
23
+ "static-analysis",
24
+ "vulnerability",
25
+ "typosquatting",
26
+ "ast"
27
+ ],
28
+ "author": "Andrew Virya Victorio",
29
+ "license": "ISC",
30
+ "dependencies": {
31
+ "@babel/parser": "^7.28.6",
32
+ "@babel/traverse": "^7.28.6",
33
+ "@yarnpkg/lockfile": "^1.1.0",
34
+ "axios": "^1.13.3",
35
+ "chalk": "^5.6.2",
36
+ "commander": "^14.0.2",
37
+ "fast-glob": "^3.3.3",
38
+ "fast-levenshtein": "^3.0.0",
39
+ "ignore": "^7.0.5",
40
+ "inquirer": "^13.2.1",
41
+ "ora": "^9.1.0",
42
+ "p-limit": "^7.2.0",
43
+ "shannon-entropy": "^0.0.3",
44
+ "yaml": "^2.7.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/fast-levenshtein": "^0.0.4",
48
+ "@types/inquirer": "^9.0.9",
49
+ "@types/node": "^25.0.10",
50
+ "ts-node": "^10.9.2",
51
+ "typescript": "^5.9.3"
52
+ }
53
+ }