guardvibe 0.6.3 → 0.7.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 +93 -156
- package/build/data/rules/auth.d.ts +3 -0
- package/build/data/rules/auth.d.ts.map +1 -0
- package/build/data/rules/auth.js +100 -0
- package/build/data/rules/auth.js.map +1 -0
- package/build/data/rules/core.js +11 -11
- package/build/data/rules/core.js.map +1 -1
- package/build/data/rules/database.d.ts +3 -0
- package/build/data/rules/database.d.ts.map +1 -0
- package/build/data/rules/database.js +100 -0
- package/build/data/rules/database.js.map +1 -0
- package/build/data/rules/deployment.d.ts +3 -0
- package/build/data/rules/deployment.d.ts.map +1 -0
- package/build/data/rules/deployment.js +192 -0
- package/build/data/rules/deployment.js.map +1 -0
- package/build/data/rules/index.d.ts.map +1 -1
- package/build/data/rules/index.js +8 -6
- package/build/data/rules/index.js.map +1 -1
- package/build/data/rules/nextjs.d.ts +3 -0
- package/build/data/rules/nextjs.d.ts.map +1 -0
- package/build/data/rules/nextjs.js +148 -0
- package/build/data/rules/nextjs.js.map +1 -0
- package/build/index.js +36 -19
- package/build/index.js.map +1 -1
- package/build/tools/check-code.d.ts +3 -2
- package/build/tools/check-code.d.ts.map +1 -1
- package/build/tools/check-code.js +25 -4
- package/build/tools/check-code.js.map +1 -1
- package/build/tools/check-package-health.d.ts +29 -0
- package/build/tools/check-package-health.d.ts.map +1 -0
- package/build/tools/check-package-health.js +142 -0
- package/build/tools/check-package-health.js.map +1 -0
- package/build/tools/check-project.d.ts +1 -1
- package/build/tools/check-project.d.ts.map +1 -1
- package/build/tools/check-project.js +24 -5
- package/build/tools/check-project.js.map +1 -1
- package/build/tools/compliance-report.d.ts +1 -1
- package/build/tools/compliance-report.d.ts.map +1 -1
- package/build/tools/compliance-report.js +33 -9
- package/build/tools/compliance-report.js.map +1 -1
- package/build/tools/export-sarif.d.ts.map +1 -1
- package/build/tools/export-sarif.js +7 -7
- package/build/tools/export-sarif.js.map +1 -1
- package/build/tools/scan-dependencies.d.ts +1 -1
- package/build/tools/scan-dependencies.d.ts.map +1 -1
- package/build/tools/scan-dependencies.js +25 -2
- package/build/tools/scan-dependencies.js.map +1 -1
- package/build/tools/scan-directory.d.ts +1 -1
- package/build/tools/scan-directory.d.ts.map +1 -1
- package/build/tools/scan-directory.js +33 -11
- package/build/tools/scan-directory.js.map +1 -1
- package/build/tools/scan-secrets.d.ts +1 -1
- package/build/tools/scan-secrets.d.ts.map +1 -1
- package/build/tools/scan-secrets.js +110 -57
- package/build/tools/scan-secrets.js.map +1 -1
- package/build/tools/scan-staged.d.ts +1 -1
- package/build/tools/scan-staged.d.ts.map +1 -1
- package/build/tools/scan-staged.js +29 -10
- package/build/tools/scan-staged.js.map +1 -1
- package/build/utils/config.d.ts.map +1 -1
- package/build/utils/config.js +19 -11
- package/build/utils/config.js.map +1 -1
- package/build/utils/manifest-parser.d.ts.map +1 -1
- package/build/utils/manifest-parser.js +93 -68
- package/build/utils/manifest-parser.js.map +1 -1
- package/build/utils/osv-client.d.ts.map +1 -1
- package/build/utils/osv-client.js +3 -2
- package/build/utils/osv-client.js.map +1 -1
- package/build/utils/typosquat.d.ts +9 -0
- package/build/utils/typosquat.d.ts.map +1 -0
- package/build/utils/typosquat.js +101 -0
- package/build/utils/typosquat.js.map +1 -0
- package/package.json +4 -5
- package/build/data/rules/java.d.ts +0 -3
- package/build/data/rules/java.d.ts.map +0 -1
- package/build/data/rules/java.js +0 -70
- package/build/data/rules/java.js.map +0 -1
- package/build/data/rules/php.d.ts +0 -3
- package/build/data/rules/php.d.ts.map +0 -1
- package/build/data/rules/php.js +0 -59
- package/build/data/rules/php.js.map +0 -1
- package/build/data/rules/ruby.d.ts +0 -3
- package/build/data/rules/ruby.d.ts.map +0 -1
- package/build/data/rules/ruby.js +0 -59
- package/build/data/rules/ruby.js.map +0 -1
|
@@ -8,95 +8,120 @@ export function parseManifest(content, filename) {
|
|
|
8
8
|
return parseRequirementsTxt(content);
|
|
9
9
|
if (lower === "go.mod")
|
|
10
10
|
return parseGoMod(content);
|
|
11
|
-
if (lower === "gemfile.lock")
|
|
12
|
-
return parseGemfileLock(content);
|
|
13
|
-
if (lower === "cargo.lock")
|
|
14
|
-
return parseCargoLock(content);
|
|
15
11
|
throw new Error(`Unsupported manifest format: ${filename}`);
|
|
16
12
|
}
|
|
13
|
+
function addPackage(packages, pkg) {
|
|
14
|
+
const key = `${pkg.ecosystem}:${pkg.name}@${pkg.version}`;
|
|
15
|
+
packages.set(key, pkg);
|
|
16
|
+
}
|
|
17
|
+
function sanitizeVersion(rawVersion) {
|
|
18
|
+
const trimmed = rawVersion.trim();
|
|
19
|
+
if (!trimmed)
|
|
20
|
+
return null;
|
|
21
|
+
if (trimmed.startsWith("file:") ||
|
|
22
|
+
trimmed.startsWith("link:") ||
|
|
23
|
+
trimmed.startsWith("workspace:") ||
|
|
24
|
+
trimmed.startsWith("git+") ||
|
|
25
|
+
trimmed.startsWith("github:") ||
|
|
26
|
+
trimmed.startsWith("http://") ||
|
|
27
|
+
trimmed.startsWith("https://")) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const normalized = trimmed.replace(/^[\^~<>=\sv]*/g, "");
|
|
31
|
+
return normalized || null;
|
|
32
|
+
}
|
|
17
33
|
function parsePackageJson(content) {
|
|
18
34
|
const pkg = JSON.parse(content);
|
|
19
|
-
const packages =
|
|
20
|
-
for (const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (version)
|
|
28
|
-
packages.push({ name, version, ecosystem: "npm" });
|
|
35
|
+
const packages = new Map();
|
|
36
|
+
for (const section of ["dependencies", "devDependencies", "optionalDependencies"]) {
|
|
37
|
+
for (const [name, ver] of Object.entries(pkg[section] || {})) {
|
|
38
|
+
const version = sanitizeVersion(String(ver));
|
|
39
|
+
if (!version)
|
|
40
|
+
continue;
|
|
41
|
+
addPackage(packages, { name, version, ecosystem: "npm" });
|
|
42
|
+
}
|
|
29
43
|
}
|
|
30
|
-
return packages;
|
|
44
|
+
return [...packages.values()];
|
|
31
45
|
}
|
|
32
46
|
function parsePackageLock(content) {
|
|
33
47
|
const lock = JSON.parse(content);
|
|
34
|
-
const packages =
|
|
35
|
-
if (lock.packages) {
|
|
36
|
-
for (const [
|
|
37
|
-
if (
|
|
48
|
+
const packages = new Map();
|
|
49
|
+
if (lock.packages && typeof lock.packages === "object") {
|
|
50
|
+
for (const [pkgPath, info] of Object.entries(lock.packages)) {
|
|
51
|
+
if (pkgPath === "")
|
|
38
52
|
continue;
|
|
39
53
|
const pkg = info;
|
|
40
54
|
if (!pkg.version)
|
|
41
55
|
continue;
|
|
42
|
-
const name =
|
|
43
|
-
|
|
56
|
+
const name = pkgPath.split("node_modules/").filter(Boolean).at(-1);
|
|
57
|
+
if (!name)
|
|
58
|
+
continue;
|
|
59
|
+
addPackage(packages, { name, version: pkg.version, ecosystem: "npm" });
|
|
44
60
|
}
|
|
45
61
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
function parseRequirementsTxt(content) {
|
|
49
|
-
return content.split("\n")
|
|
50
|
-
.map(line => line.trim())
|
|
51
|
-
.filter(line => line && !line.startsWith("#") && !line.startsWith("-"))
|
|
52
|
-
.map(line => {
|
|
53
|
-
const match = line.match(/^([a-zA-Z0-9_.-]+)==([a-zA-Z0-9_.]+)/);
|
|
54
|
-
if (!match)
|
|
55
|
-
return null;
|
|
56
|
-
return { name: match[1], version: match[2], ecosystem: "PyPI" };
|
|
57
|
-
})
|
|
58
|
-
.filter((p) => p !== null);
|
|
59
|
-
}
|
|
60
|
-
function parseGoMod(content) {
|
|
61
|
-
const packages = [];
|
|
62
|
-
const requireBlock = content.match(/require\s*\(([\s\S]*?)\)/);
|
|
63
|
-
const lines = requireBlock ? requireBlock[1].split("\n") : [];
|
|
64
|
-
const singleRequires = content.matchAll(/require\s+(\S+)\s+v?(\S+)/g);
|
|
65
|
-
for (const m of singleRequires) {
|
|
66
|
-
packages.push({ name: m[1], version: m[2].replace(/^v/, ""), ecosystem: "Go" });
|
|
62
|
+
if (packages.size === 0 && lock.dependencies && typeof lock.dependencies === "object") {
|
|
63
|
+
walkPackageLockDependencies(lock.dependencies, packages);
|
|
67
64
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
return [...packages.values()];
|
|
66
|
+
}
|
|
67
|
+
function walkPackageLockDependencies(dependencies, packages) {
|
|
68
|
+
for (const [name, info] of Object.entries(dependencies)) {
|
|
69
|
+
if (!info || typeof info !== "object")
|
|
70
|
+
continue;
|
|
71
|
+
const pkg = info;
|
|
72
|
+
if (pkg.version) {
|
|
73
|
+
addPackage(packages, { name, version: pkg.version, ecosystem: "npm" });
|
|
74
|
+
}
|
|
75
|
+
if (pkg.dependencies) {
|
|
76
|
+
walkPackageLockDependencies(pkg.dependencies, packages);
|
|
72
77
|
}
|
|
73
78
|
}
|
|
74
|
-
return packages;
|
|
75
79
|
}
|
|
76
|
-
function
|
|
77
|
-
const packages =
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
function parseRequirementsTxt(content) {
|
|
81
|
+
const packages = new Map();
|
|
82
|
+
for (const line of content.split("\n")) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("-"))
|
|
85
|
+
continue;
|
|
86
|
+
const match = trimmed.match(/^([a-zA-Z0-9_.-]+)==([a-zA-Z0-9_.+-]+)/);
|
|
87
|
+
if (!match)
|
|
88
|
+
continue;
|
|
89
|
+
addPackage(packages, {
|
|
90
|
+
name: match[1],
|
|
91
|
+
version: match[2],
|
|
92
|
+
ecosystem: "PyPI",
|
|
93
|
+
});
|
|
87
94
|
}
|
|
88
|
-
return packages;
|
|
95
|
+
return [...packages.values()];
|
|
89
96
|
}
|
|
90
|
-
function
|
|
91
|
-
const packages =
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
|
|
97
|
+
function parseGoMod(content) {
|
|
98
|
+
const packages = new Map();
|
|
99
|
+
const lines = content.split("\n");
|
|
100
|
+
let inRequireBlock = false;
|
|
101
|
+
for (const rawLine of lines) {
|
|
102
|
+
const line = rawLine.trim();
|
|
103
|
+
if (!line || line.startsWith("//"))
|
|
104
|
+
continue;
|
|
105
|
+
if (line.startsWith("require (")) {
|
|
106
|
+
inRequireBlock = true;
|
|
107
|
+
continue;
|
|
98
108
|
}
|
|
109
|
+
if (inRequireBlock && line === ")") {
|
|
110
|
+
inRequireBlock = false;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const candidate = inRequireBlock ? line : line.startsWith("require ") ? line.slice("require ".length).trim() : "";
|
|
114
|
+
if (!candidate)
|
|
115
|
+
continue;
|
|
116
|
+
const match = candidate.match(/^(\S+)\s+v?([^\s]+)(?:\s+\/\/.*)?$/);
|
|
117
|
+
if (!match)
|
|
118
|
+
continue;
|
|
119
|
+
addPackage(packages, {
|
|
120
|
+
name: match[1],
|
|
121
|
+
version: match[2].replace(/^v/, ""),
|
|
122
|
+
ecosystem: "Go",
|
|
123
|
+
});
|
|
99
124
|
}
|
|
100
|
-
return packages;
|
|
125
|
+
return [...packages.values()];
|
|
101
126
|
}
|
|
102
127
|
//# sourceMappingURL=manifest-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-parser.js","sourceRoot":"","sources":["../../src/utils/manifest-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manifest-parser.js","sourceRoot":"","sources":["../../src/utils/manifest-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"osv-client.d.ts","sourceRoot":"","sources":["../../src/utils/osv-client.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,KAAK,CAAC;gBAAE,UAAU,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACxD,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAMD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiB7B;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"osv-client.d.ts","sourceRoot":"","sources":["../../src/utils/osv-client.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,KAAK,CAAC;gBAAE,UAAU,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACxD,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAMD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiB7B;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAmD1C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,GAAG,GAAG,MAAM,CAmDtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA4BlE"}
|
|
@@ -26,8 +26,9 @@ export async function queryOsvBatch(packages) {
|
|
|
26
26
|
signal: AbortSignal.timeout(10000),
|
|
27
27
|
});
|
|
28
28
|
const results = new Map();
|
|
29
|
-
if (!response.ok)
|
|
30
|
-
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`OSV batch API error: ${response.status} ${response.statusText}`);
|
|
31
|
+
}
|
|
31
32
|
const data = await response.json();
|
|
32
33
|
// Batch API returns minimal vuln info (just id). Fetch full details for each.
|
|
33
34
|
for (let i = 0; i < packages.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"osv-client.js","sourceRoot":"","sources":["../../src/utils/osv-client.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAAe,EACf,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,EAAE;QAC3D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC7B,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KAClC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC1B,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAsB;IAEtB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;QACrD,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mCAAmC,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;QACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"osv-client.js","sourceRoot":"","sources":["../../src/utils/osv-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const POPULAR_PACKAGES: string[];
|
|
2
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
3
|
+
interface TyposquatResult {
|
|
4
|
+
similarTo: string;
|
|
5
|
+
confidence: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function detectTyposquat(name: string): TyposquatResult | null;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=typosquat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typosquat.d.ts","sourceRoot":"","sources":["../../src/utils/typosquat.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,UAoD5B,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBxD;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgCpE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Popular npm packages for typosquat detection
|
|
2
|
+
export const POPULAR_PACKAGES = [
|
|
3
|
+
// React ecosystem
|
|
4
|
+
"react", "react-dom", "react-router", "react-router-dom", "react-hook-form",
|
|
5
|
+
"@tanstack/react-query", "react-icons", "react-select",
|
|
6
|
+
// Next.js
|
|
7
|
+
"next", "@next/font", "@next/mdx",
|
|
8
|
+
// Vue / Svelte / Angular
|
|
9
|
+
"vue", "svelte", "nuxt", "@angular/core",
|
|
10
|
+
// State management
|
|
11
|
+
"zustand", "jotai", "redux", "@reduxjs/toolkit", "mobx", "valtio",
|
|
12
|
+
// Styling
|
|
13
|
+
"tailwindcss", "postcss", "autoprefixer", "sass", "styled-components",
|
|
14
|
+
"@emotion/react", "@emotion/styled", "clsx", "tailwind-merge",
|
|
15
|
+
// UI frameworks
|
|
16
|
+
"@radix-ui/react-dialog", "@radix-ui/react-popover", "@radix-ui/react-select",
|
|
17
|
+
"@radix-ui/react-tooltip", "@radix-ui/react-dropdown-menu",
|
|
18
|
+
"class-variance-authority", "lucide-react",
|
|
19
|
+
// Build tools
|
|
20
|
+
"typescript", "vite", "esbuild", "webpack", "turbo", "tsup", "tsx",
|
|
21
|
+
// Testing
|
|
22
|
+
"vitest", "jest", "@testing-library/react", "playwright", "cypress",
|
|
23
|
+
// HTTP / API
|
|
24
|
+
"axios", "ky", "got", "node-fetch", "undici",
|
|
25
|
+
// Validation
|
|
26
|
+
"zod", "yup", "joi", "valibot", "ajv",
|
|
27
|
+
// Database / ORM
|
|
28
|
+
"prisma", "@prisma/client", "drizzle-orm", "drizzle-kit",
|
|
29
|
+
"mongoose", "typeorm", "knex", "pg", "mysql2", "better-sqlite3",
|
|
30
|
+
// Auth
|
|
31
|
+
"@clerk/nextjs", "@clerk/clerk-sdk-node", "next-auth", "@auth/core",
|
|
32
|
+
"passport", "jsonwebtoken", "bcrypt", "bcryptjs",
|
|
33
|
+
// Supabase
|
|
34
|
+
"@supabase/supabase-js", "@supabase/ssr",
|
|
35
|
+
// Payments
|
|
36
|
+
"stripe", "@stripe/stripe-js",
|
|
37
|
+
// Email
|
|
38
|
+
"resend", "nodemailer", "@sendgrid/mail",
|
|
39
|
+
// AI
|
|
40
|
+
"ai", "@ai-sdk/react", "@ai-sdk/openai", "@ai-sdk/anthropic", "@ai-sdk/google",
|
|
41
|
+
"openai", "@anthropic-ai/sdk",
|
|
42
|
+
// Server frameworks
|
|
43
|
+
"express", "fastify", "hono", "koa",
|
|
44
|
+
// Utilities
|
|
45
|
+
"lodash", "lodash-es", "date-fns", "dayjs", "uuid", "nanoid",
|
|
46
|
+
"dotenv", "chalk", "commander", "inquirer", "ora", "execa",
|
|
47
|
+
"fs-extra", "glob", "minimatch", "semver", "debug",
|
|
48
|
+
// File handling
|
|
49
|
+
"sharp", "multer", "formidable",
|
|
50
|
+
// Logging / monitoring
|
|
51
|
+
"winston", "pino", "@sentry/nextjs",
|
|
52
|
+
// MCP
|
|
53
|
+
"@modelcontextprotocol/sdk",
|
|
54
|
+
];
|
|
55
|
+
export function levenshtein(a, b) {
|
|
56
|
+
const m = a.length;
|
|
57
|
+
const n = b.length;
|
|
58
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
59
|
+
for (let i = 0; i <= m; i++)
|
|
60
|
+
dp[i][0] = i;
|
|
61
|
+
for (let j = 0; j <= n; j++)
|
|
62
|
+
dp[0][j] = j;
|
|
63
|
+
for (let i = 1; i <= m; i++) {
|
|
64
|
+
for (let j = 1; j <= n; j++) {
|
|
65
|
+
if (a[i - 1] === b[j - 1]) {
|
|
66
|
+
dp[i][j] = dp[i - 1][j - 1];
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return dp[m][n];
|
|
74
|
+
}
|
|
75
|
+
export function detectTyposquat(name) {
|
|
76
|
+
const lower = name.toLowerCase();
|
|
77
|
+
// Exact match = not a typosquat
|
|
78
|
+
if (POPULAR_PACKAGES.includes(lower))
|
|
79
|
+
return null;
|
|
80
|
+
// Strip scope for comparison
|
|
81
|
+
const bareName = lower.startsWith("@") ? lower.split("/").pop() ?? lower : lower;
|
|
82
|
+
let bestMatch = null;
|
|
83
|
+
let bestDistance = Infinity;
|
|
84
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
85
|
+
const popularBare = popular.startsWith("@") ? popular.split("/").pop() ?? popular : popular;
|
|
86
|
+
// Only compare if lengths are within 2 chars
|
|
87
|
+
if (Math.abs(bareName.length - popularBare.length) > 2)
|
|
88
|
+
continue;
|
|
89
|
+
const dist = levenshtein(bareName, popularBare);
|
|
90
|
+
if (dist > 0 && dist <= 2 && dist < bestDistance) {
|
|
91
|
+
bestDistance = dist;
|
|
92
|
+
bestMatch = popular;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!bestMatch)
|
|
96
|
+
return null;
|
|
97
|
+
// Confidence: distance 1 = 0.9, distance 2 = 0.7
|
|
98
|
+
const confidence = bestDistance === 1 ? 0.9 : 0.7;
|
|
99
|
+
return { similarTo: bestMatch, confidence };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=typosquat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typosquat.js","sourceRoot":"","sources":["../../src/utils/typosquat.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "guardvibe",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "GokLab <info@goklab.com>",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Local-first security MCP for vibe coding. Focused on TypeScript, JavaScript, Python, Go, Dockerfile, YAML, and Terraform.",
|
|
6
5
|
"type": "module",
|
|
7
6
|
"bin": {
|
|
8
|
-
"guardvibe": "
|
|
9
|
-
"guardvibe-init": "
|
|
7
|
+
"guardvibe": "build/index.js",
|
|
8
|
+
"guardvibe-init": "build/cli.js"
|
|
10
9
|
},
|
|
11
10
|
"files": [
|
|
12
11
|
"build"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/data/rules/java.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,SAAS,EAAE,YAAY,EAyEnC,CAAC"}
|
package/build/data/rules/java.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
// === Java-specific rules ===
|
|
2
|
-
export const javaRules = [
|
|
3
|
-
{
|
|
4
|
-
id: "VG120",
|
|
5
|
-
name: "Java SQL injection via string concat",
|
|
6
|
-
severity: "critical",
|
|
7
|
-
owasp: "A02:2025 Injection",
|
|
8
|
-
description: "String concatenation in SQL queries allows SQL injection attacks.",
|
|
9
|
-
pattern: /(?:executeQuery|executeUpdate|prepareStatement|createQuery|createNativeQuery)\s*\(\s*['"][^'"]*['"]\s*\+/gi,
|
|
10
|
-
languages: ["java"],
|
|
11
|
-
fix: "Use PreparedStatement with parameter binding: stmt.setString(1, userInput). Never concatenate strings into SQL.",
|
|
12
|
-
fixCode: "// Use PreparedStatement\nPreparedStatement stmt = conn.prepareStatement(\"SELECT * FROM users WHERE id = ?\");\nstmt.setString(1, userId);",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
id: "VG121",
|
|
16
|
-
name: "Java command injection",
|
|
17
|
-
severity: "critical",
|
|
18
|
-
owasp: "A02:2025 Injection",
|
|
19
|
-
description: "User input passed to Runtime.exec() allows arbitrary command execution.",
|
|
20
|
-
pattern: /Runtime\.getRuntime\(\)\.exec\s*\(\s*(?:[^")]*\+|.*(?:request|param|input|args))/gi,
|
|
21
|
-
languages: ["java"],
|
|
22
|
-
fix: "Use ProcessBuilder with a list of arguments. Validate input against an allowlist.",
|
|
23
|
-
fixCode: "// Use ProcessBuilder with list args\nProcessBuilder pb = new ProcessBuilder(\"ls\", \"-la\", dir);\nProcess p = pb.start();",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
id: "VG122",
|
|
27
|
-
name: "Java XSS via JSP",
|
|
28
|
-
severity: "high",
|
|
29
|
-
owasp: "A02:2025 Injection",
|
|
30
|
-
description: "Unescaped output in JSP pages enables Cross-Site Scripting attacks.",
|
|
31
|
-
pattern: /<%=\s*(?:request\.getParameter|session\.getAttribute)/gi,
|
|
32
|
-
languages: ["java"],
|
|
33
|
-
fix: "Use JSTL <c:out> tag or fn:escapeXml() for output encoding. Never use <%= with user input.",
|
|
34
|
-
fixCode: "<!-- Use JSTL c:out for auto-escaping -->\n<c:out value=\"${param.name}\" />",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
id: "VG123",
|
|
38
|
-
name: "Java endpoint without auth annotation",
|
|
39
|
-
severity: "high",
|
|
40
|
-
owasp: "A01:2025 Broken Access Control",
|
|
41
|
-
description: "Spring endpoint without security annotation may be publicly accessible.",
|
|
42
|
-
pattern: /@(?:RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping)\s*\([^)]*(?:\/api|\/admin|\/users|\/account)/gi,
|
|
43
|
-
languages: ["java"],
|
|
44
|
-
fix: "Add @PreAuthorize, @Secured, or @RolesAllowed annotation to protect endpoints.",
|
|
45
|
-
fixCode: "// Add Spring Security annotation\n@PreAuthorize(\"hasRole('USER')\")\n@GetMapping(\"/api/data\")\npublic ResponseEntity<?> getData() { }",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: "VG124",
|
|
49
|
-
name: "Java weak hashing",
|
|
50
|
-
severity: "critical",
|
|
51
|
-
owasp: "A07:2025 Auth Failures",
|
|
52
|
-
description: "Using MessageDigest with MD5 or SHA-1. These are cryptographically weak for passwords.",
|
|
53
|
-
pattern: /MessageDigest\.getInstance\s*\(\s*['"](?:MD5|SHA-?1)['"]\s*\)/gi,
|
|
54
|
-
languages: ["java"],
|
|
55
|
-
fix: "Use BCryptPasswordEncoder or Argon2PasswordEncoder for password hashing.",
|
|
56
|
-
fixCode: "// Use BCrypt for passwords\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nBCryptPasswordEncoder encoder = new BCryptPasswordEncoder();\nString hash = encoder.encode(password);",
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: "VG125",
|
|
60
|
-
name: "Java CORS wildcard",
|
|
61
|
-
severity: "high",
|
|
62
|
-
owasp: "A05:2025 Security Misconfiguration",
|
|
63
|
-
description: "Spring @CrossOrigin with wildcard allows any website to access your API.",
|
|
64
|
-
pattern: /@CrossOrigin\s*\(\s*(?:origins\s*=\s*)?['"]?\s*\*/gi,
|
|
65
|
-
languages: ["java"],
|
|
66
|
-
fix: "Set specific allowed origins in @CrossOrigin annotation.",
|
|
67
|
-
fixCode: "// Specify allowed origins\n@CrossOrigin(origins = \"https://myapp.com\")\n@GetMapping(\"/api/data\")",
|
|
68
|
-
},
|
|
69
|
-
];
|
|
70
|
-
//# sourceMappingURL=java.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/data/rules/java.ts"],"names":[],"mappings":"AAEA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,sCAAsC;QAC5C,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,mEAAmE;QACrE,OAAO,EAAE,4GAA4G;QACrH,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,iHAAiH;QACtH,OAAO,EAAE,6IAA6I;KACvJ;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,wBAAwB;QAC9B,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,yEAAyE;QAC3E,OAAO,EAAE,oFAAoF;QAC7F,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,mFAAmF;QACxF,OAAO,EAAE,8HAA8H;KACxI;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,qEAAqE;QACvE,OAAO,EAAE,yDAAyD;QAClE,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,4FAA4F;QACjG,OAAO,EAAE,8EAA8E;KACxF;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,uCAAuC;QAC7C,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,yEAAyE;QAC3E,OAAO,EAAE,oHAAoH;QAC7H,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,gFAAgF;QACrF,OAAO,EAAE,2IAA2I;KACrJ;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,wFAAwF;QAC1F,OAAO,EAAE,iEAAiE;QAC1E,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,0EAA0E;QAC/E,OAAO,EAAE,8MAA8M;KACxN;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EACT,0EAA0E;QAC5E,OAAO,EAAE,qDAAqD;QAC9D,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,0DAA0D;QAC/D,OAAO,EAAE,uGAAuG;KACjH;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/data/rules/php.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,QAAQ,EAAE,YAAY,EA6DlC,CAAC"}
|
package/build/data/rules/php.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// === PHP-specific rules ===
|
|
2
|
-
export const phpRules = [
|
|
3
|
-
{
|
|
4
|
-
id: "VG130",
|
|
5
|
-
name: "PHP SQL injection via user input",
|
|
6
|
-
severity: "critical",
|
|
7
|
-
owasp: "A02:2025 Injection",
|
|
8
|
-
description: "User input ($_GET, $_POST, $_REQUEST) directly used in SQL queries enables SQL injection.",
|
|
9
|
-
pattern: /(?:mysql_query|mysqli_query|->query|->exec)\s*\([^)]*(?:\$_GET|\$_POST|\$_REQUEST|\$_COOKIE)/gi,
|
|
10
|
-
languages: ["php"],
|
|
11
|
-
fix: "Use prepared statements: $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]);",
|
|
12
|
-
fixCode: "// Use prepared statements\n$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n$stmt->execute([$_GET['id']]);",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
id: "VG131",
|
|
16
|
-
name: "PHP command injection",
|
|
17
|
-
severity: "critical",
|
|
18
|
-
owasp: "A02:2025 Injection",
|
|
19
|
-
description: "User input passed to shell execution functions allows arbitrary command execution.",
|
|
20
|
-
pattern: /(?:shell_exec|passthru|popen|proc_open)\s*\([^)]*(?:\$_GET|\$_POST|\$_REQUEST|\$_COOKIE|\$(?:input|cmd|command))/gi,
|
|
21
|
-
languages: ["php"],
|
|
22
|
-
fix: "Use escapeshellarg() and escapeshellcmd() for any shell input. Prefer built-in PHP functions over shell commands.",
|
|
23
|
-
fixCode: "// Escape shell arguments\n$safe = escapeshellarg($input);\n$output = shell_exec('ls ' . $safe);",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
id: "VG132",
|
|
27
|
-
name: "PHP XSS via echo",
|
|
28
|
-
severity: "high",
|
|
29
|
-
owasp: "A02:2025 Injection",
|
|
30
|
-
description: "Echoing user input without escaping enables Cross-Site Scripting.",
|
|
31
|
-
pattern: /(?:echo|print)\s+(?:\$_GET|\$_POST|\$_REQUEST|\$_COOKIE)/gi,
|
|
32
|
-
languages: ["php"],
|
|
33
|
-
fix: "Use htmlspecialchars($input, ENT_QUOTES, 'UTF-8') before outputting user data.",
|
|
34
|
-
fixCode: "// Escape output\necho htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
id: "VG133",
|
|
38
|
-
name: "PHP weak hashing",
|
|
39
|
-
severity: "critical",
|
|
40
|
-
owasp: "A07:2025 Auth Failures",
|
|
41
|
-
description: "Using md5() or sha1() for password hashing. These are not secure for passwords.",
|
|
42
|
-
pattern: /(?:md5|sha1)\s*\(\s*\$/gi,
|
|
43
|
-
languages: ["php"],
|
|
44
|
-
fix: "Use password_hash($password, PASSWORD_BCRYPT) and password_verify() for passwords.",
|
|
45
|
-
fixCode: "// Use password_hash\n$hash = password_hash($password, PASSWORD_BCRYPT);\n$valid = password_verify($input, $hash);",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: "VG134",
|
|
49
|
-
name: "PHP dynamic code execution",
|
|
50
|
-
severity: "critical",
|
|
51
|
-
owasp: "A02:2025 Injection",
|
|
52
|
-
description: "eval() with user input allows arbitrary code execution.",
|
|
53
|
-
pattern: /eval\s*\([^)]*(?:\$_GET|\$_POST|\$_REQUEST|\$_COOKIE|\$(?:input|data|code))/gi,
|
|
54
|
-
languages: ["php"],
|
|
55
|
-
fix: "Never use eval() with user input. Refactor to use safe alternatives.",
|
|
56
|
-
fixCode: "// Avoid eval entirely\n// Use JSON for data: $data = json_decode($input, true);\n// Use match/switch for dynamic behavior",
|
|
57
|
-
},
|
|
58
|
-
];
|
|
59
|
-
//# sourceMappingURL=php.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/data/rules/php.ts"],"names":[],"mappings":"AAEA,6BAA6B;AAC7B,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kCAAkC;QACxC,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,2FAA2F;QAC7F,OAAO,EAAE,gGAAgG;QACzG,SAAS,EAAE,CAAC,KAAK,CAAC;QAClB,GAAG,EAAE,4GAA4G;QACjH,OAAO,EAAE,wHAAwH;KAClI;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,oFAAoF;QACtF,OAAO,EAAE,oHAAoH;QAC7H,SAAS,EAAE,CAAC,KAAK,CAAC;QAClB,GAAG,EAAE,mHAAmH;QACxH,OAAO,EAAE,kGAAkG;KAC5G;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,mEAAmE;QACrE,OAAO,EAAE,4DAA4D;QACrE,SAAS,EAAE,CAAC,KAAK,CAAC;QAClB,GAAG,EAAE,gFAAgF;QACrF,OAAO,EAAE,8EAA8E;KACxF;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,iFAAiF;QACnF,OAAO,EAAE,0BAA0B;QACnC,SAAS,EAAE,CAAC,KAAK,CAAC;QAClB,GAAG,EAAE,oFAAoF;QACzF,OAAO,EAAE,oHAAoH;KAC9H;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,yDAAyD;QAC3D,OAAO,EAAE,+EAA+E;QACxF,SAAS,EAAE,CAAC,KAAK,CAAC;QAClB,GAAG,EAAE,sEAAsE;QAC3E,OAAO,EAAE,4HAA4H;KACtI;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ruby.d.ts","sourceRoot":"","sources":["../../../src/data/rules/ruby.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,SAAS,EAAE,YAAY,EA6DnC,CAAC"}
|