guardrail-cli 1.0.5 → 2.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/README.md +483 -10
- package/dist/commands/baseline.d.ts +7 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +79 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/cache.d.ts +13 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +165 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/evidence.d.ts +45 -0
- package/dist/commands/evidence.d.ts.map +1 -0
- package/dist/commands/evidence.js +197 -0
- package/dist/commands/evidence.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +15 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/scan-secrets.d.ts +47 -0
- package/dist/commands/scan-secrets.d.ts.map +1 -0
- package/dist/commands/scan-secrets.js +225 -0
- package/dist/commands/scan-secrets.js.map +1 -0
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts +41 -0
- package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities-enhanced.js +368 -0
- package/dist/commands/scan-vulnerabilities-enhanced.js.map +1 -0
- package/dist/commands/scan-vulnerabilities-osv.d.ts +58 -0
- package/dist/commands/scan-vulnerabilities-osv.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities-osv.js +716 -0
- package/dist/commands/scan-vulnerabilities-osv.js.map +1 -0
- package/dist/commands/scan-vulnerabilities.d.ts +32 -0
- package/dist/commands/scan-vulnerabilities.d.ts.map +1 -0
- package/dist/commands/scan-vulnerabilities.js +283 -0
- package/dist/commands/scan-vulnerabilities.js.map +1 -0
- package/dist/commands/secrets-allowlist.d.ts +7 -0
- package/dist/commands/secrets-allowlist.d.ts.map +1 -0
- package/dist/commands/secrets-allowlist.js +85 -0
- package/dist/commands/secrets-allowlist.js.map +1 -0
- package/dist/fix/applicator.d.ts +44 -0
- package/dist/fix/applicator.d.ts.map +1 -0
- package/dist/fix/applicator.js +144 -0
- package/dist/fix/applicator.js.map +1 -0
- package/dist/fix/backup.d.ts +38 -0
- package/dist/fix/backup.d.ts.map +1 -0
- package/dist/fix/backup.js +154 -0
- package/dist/fix/backup.js.map +1 -0
- package/dist/fix/engine.d.ts +55 -0
- package/dist/fix/engine.d.ts.map +1 -0
- package/dist/fix/engine.js +285 -0
- package/dist/fix/engine.js.map +1 -0
- package/dist/fix/index.d.ts +5 -0
- package/dist/fix/index.d.ts.map +1 -0
- package/dist/fix/index.js +12 -0
- package/dist/fix/index.js.map +1 -0
- package/dist/fix/interactive.d.ts +22 -0
- package/dist/fix/interactive.d.ts.map +1 -0
- package/dist/fix/interactive.js +172 -0
- package/dist/fix/interactive.js.map +1 -0
- package/dist/formatters/index.d.ts +6 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +11 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/sarif-enhanced.d.ts +78 -0
- package/dist/formatters/sarif-enhanced.d.ts.map +1 -0
- package/dist/formatters/sarif-enhanced.js +144 -0
- package/dist/formatters/sarif-enhanced.js.map +1 -0
- package/dist/formatters/sarif-v2.d.ts +121 -0
- package/dist/formatters/sarif-v2.d.ts.map +1 -0
- package/dist/formatters/sarif-v2.js +356 -0
- package/dist/formatters/sarif-v2.js.map +1 -0
- package/dist/formatters/sarif.d.ts +72 -0
- package/dist/formatters/sarif.d.ts.map +1 -0
- package/dist/formatters/sarif.js +146 -0
- package/dist/formatters/sarif.js.map +1 -0
- package/dist/index.js +3362 -1397
- package/dist/index.js.map +1 -1
- package/dist/init/ci-generator.d.ts +18 -0
- package/dist/init/ci-generator.d.ts.map +1 -0
- package/dist/init/ci-generator.js +251 -0
- package/dist/init/ci-generator.js.map +1 -0
- package/dist/init/detect-framework.d.ts +15 -0
- package/dist/init/detect-framework.d.ts.map +1 -0
- package/dist/init/detect-framework.js +299 -0
- package/dist/init/detect-framework.js.map +1 -0
- package/dist/init/hooks-installer.d.ts +22 -0
- package/dist/init/hooks-installer.d.ts.map +1 -0
- package/dist/init/hooks-installer.js +302 -0
- package/dist/init/hooks-installer.js.map +1 -0
- package/dist/init/index.d.ts +8 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +22 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +401 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +240 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/reality/reality-runner.d.ts +76 -0
- package/dist/reality/reality-runner.d.ts.map +1 -0
- package/dist/reality/reality-runner.js +454 -0
- package/dist/reality/reality-runner.js.map +1 -0
- package/dist/runtime/auth-utils.d.ts +43 -0
- package/dist/runtime/auth-utils.d.ts.map +1 -0
- package/dist/runtime/auth-utils.js +126 -0
- package/dist/runtime/auth-utils.js.map +1 -0
- package/dist/runtime/client.d.ts +74 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +222 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/creds.d.ts +48 -0
- package/dist/runtime/creds.d.ts.map +1 -0
- package/dist/runtime/creds.js +245 -0
- package/dist/runtime/creds.js.map +1 -0
- package/dist/runtime/exit-codes.d.ts +47 -0
- package/dist/runtime/exit-codes.d.ts.map +1 -0
- package/dist/runtime/exit-codes.js +91 -0
- package/dist/runtime/exit-codes.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +25 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/semver.d.ts +37 -0
- package/dist/runtime/semver.d.ts.map +1 -0
- package/dist/runtime/semver.js +110 -0
- package/dist/runtime/semver.js.map +1 -0
- package/dist/scanner/baseline.d.ts +52 -0
- package/dist/scanner/baseline.d.ts.map +1 -0
- package/dist/scanner/baseline.js +85 -0
- package/dist/scanner/baseline.js.map +1 -0
- package/dist/scanner/incremental.d.ts +30 -0
- package/dist/scanner/incremental.d.ts.map +1 -0
- package/dist/scanner/incremental.js +82 -0
- package/dist/scanner/incremental.js.map +1 -0
- package/dist/scanner/parallel.d.ts +43 -0
- package/dist/scanner/parallel.d.ts.map +1 -0
- package/dist/scanner/parallel.js +99 -0
- package/dist/scanner/parallel.js.map +1 -0
- package/dist/ui/frame.d.ts +68 -0
- package/dist/ui/frame.d.ts.map +1 -0
- package/dist/ui/frame.js +165 -0
- package/dist/ui/frame.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +16 -0
- package/dist/ui/index.js.map +1 -0
- package/package.json +42 -9
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enterprise Credential Store
|
|
4
|
+
* - OS keychain first (Keychain/Windows Credential Manager/libsecret)
|
|
5
|
+
* - Secure fallback with 0600 perms + atomic writes
|
|
6
|
+
* - Token-first model (short-lived tokens preferred over static API keys)
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.loadAuthState = loadAuthState;
|
|
46
|
+
exports.saveAuthState = saveAuthState;
|
|
47
|
+
exports.clearAuthState = clearAuthState;
|
|
48
|
+
exports.isCacheValid = isCacheValid;
|
|
49
|
+
exports.shouldUseCachedEntitlements = shouldUseCachedEntitlements;
|
|
50
|
+
exports.getConfigPath = getConfigPath;
|
|
51
|
+
const os_1 = __importDefault(require("os"));
|
|
52
|
+
const path_1 = __importDefault(require("path"));
|
|
53
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
54
|
+
const fs_1 = require("fs");
|
|
55
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
56
|
+
const SERVICE = 'guardrail-cli';
|
|
57
|
+
const ACCOUNT = 'default';
|
|
58
|
+
function getConfigDir() {
|
|
59
|
+
if (process.platform === 'win32') {
|
|
60
|
+
return path_1.default.join(process.env.APPDATA || path_1.default.join(os_1.default.homedir(), 'AppData', 'Roaming'), 'guardrail');
|
|
61
|
+
}
|
|
62
|
+
if (process.platform === 'darwin') {
|
|
63
|
+
return path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', 'guardrail');
|
|
64
|
+
}
|
|
65
|
+
return path_1.default.join(process.env.XDG_CONFIG_HOME || path_1.default.join(os_1.default.homedir(), '.config'), 'guardrail');
|
|
66
|
+
}
|
|
67
|
+
const CONFIG_DIR = getConfigDir();
|
|
68
|
+
const CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'state.json');
|
|
69
|
+
/**
|
|
70
|
+
* Try to load keytar for OS keychain access
|
|
71
|
+
* Returns null if keytar is not available
|
|
72
|
+
*/
|
|
73
|
+
async function tryKeytar() {
|
|
74
|
+
try {
|
|
75
|
+
return require('keytar');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Atomic write with restrictive permissions
|
|
83
|
+
* Prevents partial writes and race conditions
|
|
84
|
+
* Security: 0600 on Unix, NTFS ACL restriction on Windows (best effort)
|
|
85
|
+
*/
|
|
86
|
+
async function atomicWrite(filePath, data) {
|
|
87
|
+
await promises_1.default.mkdir(path_1.default.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
88
|
+
const tmp = `${filePath}.${crypto_1.default.randomBytes(6).toString('hex')}.tmp`;
|
|
89
|
+
// Write with restrictive mode on Unix
|
|
90
|
+
await promises_1.default.writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });
|
|
91
|
+
// Lock down permissions
|
|
92
|
+
if (process.platform !== 'win32') {
|
|
93
|
+
// Unix: 0600 = owner read/write only
|
|
94
|
+
await promises_1.default.chmod(tmp, 0o600);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Windows: Best effort - use icacls to restrict access
|
|
98
|
+
// This is a no-op if it fails, as Windows file permissions are complex
|
|
99
|
+
try {
|
|
100
|
+
const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
101
|
+
const username = process.env.USERNAME || process.env.USER;
|
|
102
|
+
if (username) {
|
|
103
|
+
await new Promise((resolve) => {
|
|
104
|
+
exec(`icacls "${tmp}" /inheritance:r /grant:r "${username}:F"`, { windowsHide: true }, () => resolve() // Ignore errors
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Windows permission setting failed - continue anyway
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await promises_1.default.rename(tmp, filePath);
|
|
114
|
+
// Also secure the directory on Unix
|
|
115
|
+
if (process.platform !== 'win32') {
|
|
116
|
+
await promises_1.default.chmod(path_1.default.dirname(filePath), 0o700).catch(() => { });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Load authentication state
|
|
121
|
+
* Prefers keychain for sensitive tokens, falls back to disk
|
|
122
|
+
*/
|
|
123
|
+
async function loadAuthState() {
|
|
124
|
+
try {
|
|
125
|
+
if (!(0, fs_1.existsSync)(CONFIG_FILE))
|
|
126
|
+
return {};
|
|
127
|
+
const raw = await promises_1.default.readFile(CONFIG_FILE, 'utf8');
|
|
128
|
+
const state = JSON.parse(raw);
|
|
129
|
+
// If keychain is available, prefer tokens from there
|
|
130
|
+
const keytar = await tryKeytar();
|
|
131
|
+
if (keytar) {
|
|
132
|
+
try {
|
|
133
|
+
const secret = await keytar.getPassword(SERVICE, ACCOUNT);
|
|
134
|
+
if (secret) {
|
|
135
|
+
const fromKeychain = JSON.parse(secret);
|
|
136
|
+
return { ...state, ...fromKeychain };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Keychain access failed, use disk state
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return state;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return {};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Save authentication state
|
|
151
|
+
* Stores sensitive tokens in keychain when available, non-sensitive data on disk
|
|
152
|
+
*/
|
|
153
|
+
async function saveAuthState(next) {
|
|
154
|
+
// Separate sensitive from non-sensitive data
|
|
155
|
+
const { accessToken, refreshToken, apiKey, ...diskSafe } = next;
|
|
156
|
+
const keytar = await tryKeytar();
|
|
157
|
+
if (keytar) {
|
|
158
|
+
try {
|
|
159
|
+
const secretPayload = { accessToken, refreshToken, apiKey };
|
|
160
|
+
await keytar.setPassword(SERVICE, ACCOUNT, JSON.stringify(secretPayload));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Keychain save failed, store everything on disk
|
|
164
|
+
diskSafe.apiKey = apiKey;
|
|
165
|
+
diskSafe.accessToken = accessToken;
|
|
166
|
+
diskSafe.refreshToken = refreshToken;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// No keychain available: fall back to disk with tight perms
|
|
171
|
+
diskSafe.apiKey = apiKey;
|
|
172
|
+
diskSafe.accessToken = accessToken;
|
|
173
|
+
diskSafe.refreshToken = refreshToken;
|
|
174
|
+
}
|
|
175
|
+
await atomicWrite(CONFIG_FILE, JSON.stringify(diskSafe, null, 2));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Clear all authentication state (logout)
|
|
179
|
+
*/
|
|
180
|
+
async function clearAuthState() {
|
|
181
|
+
const keytar = await tryKeytar();
|
|
182
|
+
if (keytar) {
|
|
183
|
+
try {
|
|
184
|
+
await keytar.deletePassword(SERVICE, ACCOUNT);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Keychain delete failed, continue anyway
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
await atomicWrite(CONFIG_FILE, JSON.stringify({}, null, 2));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if cached entitlements are still valid
|
|
194
|
+
* Uses the shorter of cacheUntil (local) or expiresAt (server)
|
|
195
|
+
*/
|
|
196
|
+
function isCacheValid(state) {
|
|
197
|
+
if (!state.tier)
|
|
198
|
+
return false;
|
|
199
|
+
const now = new Date();
|
|
200
|
+
// Check local cache expiry
|
|
201
|
+
if (state.cacheUntil) {
|
|
202
|
+
const cacheExpiry = new Date(state.cacheUntil);
|
|
203
|
+
if (cacheExpiry <= now)
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// Check server-issued expiry
|
|
207
|
+
if (state.expiresAt) {
|
|
208
|
+
const serverExpiry = new Date(state.expiresAt);
|
|
209
|
+
if (serverExpiry <= now)
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// At least one expiry must be set
|
|
213
|
+
return Boolean(state.cacheUntil || state.expiresAt);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Check if entitlements should be reused from cache
|
|
217
|
+
* Returns true only if cache is valid AND has > 5 minutes remaining
|
|
218
|
+
*/
|
|
219
|
+
function shouldUseCachedEntitlements(state) {
|
|
220
|
+
if (!state.tier)
|
|
221
|
+
return false;
|
|
222
|
+
const now = new Date();
|
|
223
|
+
const fiveMinutesFromNow = new Date(now.getTime() + 5 * 60 * 1000);
|
|
224
|
+
// Check if local cache has > 5 min remaining
|
|
225
|
+
if (state.cacheUntil) {
|
|
226
|
+
const cacheExpiry = new Date(state.cacheUntil);
|
|
227
|
+
if (cacheExpiry <= fiveMinutesFromNow)
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
// Check if server expiry has > 5 min remaining
|
|
231
|
+
if (state.expiresAt) {
|
|
232
|
+
const serverExpiry = new Date(state.expiresAt);
|
|
233
|
+
if (serverExpiry <= fiveMinutesFromNow)
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
// At least one expiry must be set and valid
|
|
237
|
+
return Boolean(state.cacheUntil || state.expiresAt);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get config directory path (for display purposes)
|
|
241
|
+
*/
|
|
242
|
+
function getConfigPath() {
|
|
243
|
+
return CONFIG_FILE;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=creds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creds.js","sourceRoot":"","sources":["../../src/runtime/creds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Exit Codes
|
|
3
|
+
* Consistent, meaningful exit codes for CI/CD integration
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* process.exit(ExitCode.POLICY_FAIL)
|
|
7
|
+
* exitWith(ExitCode.AUTH_FAILURE, 'Invalid API key')
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ExitCode {
|
|
10
|
+
/** Scan passed, no policy violations */
|
|
11
|
+
SUCCESS = 0,
|
|
12
|
+
/** Findings above threshold (policy fail) - actionable by user */
|
|
13
|
+
POLICY_FAIL = 1,
|
|
14
|
+
/** User error: invalid args, bad config, missing required options */
|
|
15
|
+
USER_ERROR = 2,
|
|
16
|
+
/** System error: crash, filesystem issues, unexpected exceptions */
|
|
17
|
+
SYSTEM_ERROR = 3,
|
|
18
|
+
/** Auth/entitlement failure: invalid key, expired token, insufficient tier */
|
|
19
|
+
AUTH_FAILURE = 4,
|
|
20
|
+
/** Network/backend failure: API unreachable, timeout */
|
|
21
|
+
NETWORK_FAILURE = 5
|
|
22
|
+
}
|
|
23
|
+
export declare const EXIT_CODE_DESCRIPTIONS: Record<ExitCode, string>;
|
|
24
|
+
/**
|
|
25
|
+
* Exit with code and optional message
|
|
26
|
+
* Logs the exit reason for debugging
|
|
27
|
+
*/
|
|
28
|
+
export declare function exitWith(code: ExitCode, message?: string): never;
|
|
29
|
+
/**
|
|
30
|
+
* Map error types to exit codes
|
|
31
|
+
*/
|
|
32
|
+
export declare function getExitCodeForError(err: Error): ExitCode;
|
|
33
|
+
/**
|
|
34
|
+
* Determine exit code based on scan results and policy
|
|
35
|
+
*/
|
|
36
|
+
export declare function getExitCodeForFindings(findings: {
|
|
37
|
+
critical?: number;
|
|
38
|
+
high?: number;
|
|
39
|
+
medium?: number;
|
|
40
|
+
low?: number;
|
|
41
|
+
}, policy: {
|
|
42
|
+
failOnCritical?: boolean;
|
|
43
|
+
failOnHigh?: boolean;
|
|
44
|
+
failOnMedium?: boolean;
|
|
45
|
+
failOnAny?: boolean;
|
|
46
|
+
}): ExitCode;
|
|
47
|
+
//# sourceMappingURL=exit-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/runtime/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAY,QAAQ;IAClB,wCAAwC;IACxC,OAAO,IAAI;IAEX,kEAAkE;IAClE,WAAW,IAAI;IAEf,qEAAqE;IACrE,UAAU,IAAI;IAEd,oEAAoE;IACpE,YAAY,IAAI;IAEhB,8EAA8E;IAC9E,YAAY,IAAI;IAEhB,wDAAwD;IACxD,eAAe,IAAI;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAO3D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAShE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,QAAQ,CAiBxD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,EAAE,MAAM,EAAE;IACT,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,QAAQ,CAiBX"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enterprise Exit Codes
|
|
4
|
+
* Consistent, meaningful exit codes for CI/CD integration
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* process.exit(ExitCode.POLICY_FAIL)
|
|
8
|
+
* exitWith(ExitCode.AUTH_FAILURE, 'Invalid API key')
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.EXIT_CODE_DESCRIPTIONS = exports.ExitCode = void 0;
|
|
12
|
+
exports.exitWith = exitWith;
|
|
13
|
+
exports.getExitCodeForError = getExitCodeForError;
|
|
14
|
+
exports.getExitCodeForFindings = getExitCodeForFindings;
|
|
15
|
+
var ExitCode;
|
|
16
|
+
(function (ExitCode) {
|
|
17
|
+
/** Scan passed, no policy violations */
|
|
18
|
+
ExitCode[ExitCode["SUCCESS"] = 0] = "SUCCESS";
|
|
19
|
+
/** Findings above threshold (policy fail) - actionable by user */
|
|
20
|
+
ExitCode[ExitCode["POLICY_FAIL"] = 1] = "POLICY_FAIL";
|
|
21
|
+
/** User error: invalid args, bad config, missing required options */
|
|
22
|
+
ExitCode[ExitCode["USER_ERROR"] = 2] = "USER_ERROR";
|
|
23
|
+
/** System error: crash, filesystem issues, unexpected exceptions */
|
|
24
|
+
ExitCode[ExitCode["SYSTEM_ERROR"] = 3] = "SYSTEM_ERROR";
|
|
25
|
+
/** Auth/entitlement failure: invalid key, expired token, insufficient tier */
|
|
26
|
+
ExitCode[ExitCode["AUTH_FAILURE"] = 4] = "AUTH_FAILURE";
|
|
27
|
+
/** Network/backend failure: API unreachable, timeout */
|
|
28
|
+
ExitCode[ExitCode["NETWORK_FAILURE"] = 5] = "NETWORK_FAILURE";
|
|
29
|
+
})(ExitCode || (exports.ExitCode = ExitCode = {}));
|
|
30
|
+
exports.EXIT_CODE_DESCRIPTIONS = {
|
|
31
|
+
[ExitCode.SUCCESS]: 'Scan completed successfully with no policy violations',
|
|
32
|
+
[ExitCode.POLICY_FAIL]: 'Findings exceed configured thresholds',
|
|
33
|
+
[ExitCode.USER_ERROR]: 'Invalid arguments or configuration',
|
|
34
|
+
[ExitCode.SYSTEM_ERROR]: 'Internal error or filesystem issue',
|
|
35
|
+
[ExitCode.AUTH_FAILURE]: 'Authentication or authorization failed',
|
|
36
|
+
[ExitCode.NETWORK_FAILURE]: 'Network or API communication failed',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Exit with code and optional message
|
|
40
|
+
* Logs the exit reason for debugging
|
|
41
|
+
*/
|
|
42
|
+
function exitWith(code, message) {
|
|
43
|
+
if (message) {
|
|
44
|
+
if (code === ExitCode.SUCCESS) {
|
|
45
|
+
console.log(message);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.error(`[exit:${code}] ${message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
process.exit(code);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Map error types to exit codes
|
|
55
|
+
*/
|
|
56
|
+
function getExitCodeForError(err) {
|
|
57
|
+
const msg = err.message.toLowerCase();
|
|
58
|
+
if (msg.includes('enoent') || msg.includes('permission denied') || msg.includes('eacces')) {
|
|
59
|
+
return ExitCode.SYSTEM_ERROR;
|
|
60
|
+
}
|
|
61
|
+
if (msg.includes('network') || msg.includes('timeout') || msg.includes('fetch')) {
|
|
62
|
+
return ExitCode.NETWORK_FAILURE;
|
|
63
|
+
}
|
|
64
|
+
if (msg.includes('auth') || msg.includes('unauthorized') || msg.includes('forbidden')) {
|
|
65
|
+
return ExitCode.AUTH_FAILURE;
|
|
66
|
+
}
|
|
67
|
+
if (msg.includes('invalid') || msg.includes('missing') || msg.includes('required')) {
|
|
68
|
+
return ExitCode.USER_ERROR;
|
|
69
|
+
}
|
|
70
|
+
return ExitCode.SYSTEM_ERROR;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Determine exit code based on scan results and policy
|
|
74
|
+
*/
|
|
75
|
+
function getExitCodeForFindings(findings, policy) {
|
|
76
|
+
const { critical = 0, high = 0, medium = 0, low = 0 } = findings;
|
|
77
|
+
if (policy.failOnAny && (critical + high + medium + low) > 0) {
|
|
78
|
+
return ExitCode.POLICY_FAIL;
|
|
79
|
+
}
|
|
80
|
+
if (policy.failOnCritical && critical > 0) {
|
|
81
|
+
return ExitCode.POLICY_FAIL;
|
|
82
|
+
}
|
|
83
|
+
if (policy.failOnHigh && (critical + high) > 0) {
|
|
84
|
+
return ExitCode.POLICY_FAIL;
|
|
85
|
+
}
|
|
86
|
+
if (policy.failOnMedium && (critical + high + medium) > 0) {
|
|
87
|
+
return ExitCode.POLICY_FAIL;
|
|
88
|
+
}
|
|
89
|
+
return ExitCode.SUCCESS;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=exit-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/runtime/exit-codes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enterprise Runtime Modules
|
|
4
|
+
* Re-exports all runtime utilities for clean imports
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./creds"), exports);
|
|
22
|
+
__exportStar(require("./client"), exports);
|
|
23
|
+
__exportStar(require("./exit-codes"), exports);
|
|
24
|
+
__exportStar(require("./semver"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight Semver Utilities
|
|
3
|
+
* Proper version comparison for vulnerability checking
|
|
4
|
+
* (Avoids incorrect lexicographic comparison like "10.0.0" < "2.0.0")
|
|
5
|
+
*/
|
|
6
|
+
export interface SemverParts {
|
|
7
|
+
major: number;
|
|
8
|
+
minor: number;
|
|
9
|
+
patch: number;
|
|
10
|
+
prerelease?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse a semver string into components
|
|
14
|
+
* Handles formats: 1.2.3, 1.2.3-beta.1, ^1.2.3, ~1.2.3
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseSemver(version: string): SemverParts | null;
|
|
17
|
+
/**
|
|
18
|
+
* Compare two semver versions
|
|
19
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
20
|
+
*/
|
|
21
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
22
|
+
/**
|
|
23
|
+
* Check if version is less than target
|
|
24
|
+
* Enterprise-grade: "10.0.0" is NOT less than "2.0.0"
|
|
25
|
+
*/
|
|
26
|
+
export declare function isVersionLessThan(version: string, target: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if version satisfies a range expression
|
|
29
|
+
* Supports: <1.2.3, <=1.2.3, >1.2.3, >=1.2.3, 1.2.3 (exact)
|
|
30
|
+
*/
|
|
31
|
+
export declare function satisfiesRange(version: string, range: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if version is affected by vulnerability
|
|
34
|
+
* affectedVersions format: "<4.17.21" or ">=1.0.0 <2.0.0"
|
|
35
|
+
*/
|
|
36
|
+
export declare function isAffected(version: string, affectedVersions: string): boolean;
|
|
37
|
+
//# sourceMappingURL=semver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/runtime/semver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAyB/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAkBtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAM7E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight Semver Utilities
|
|
4
|
+
* Proper version comparison for vulnerability checking
|
|
5
|
+
* (Avoids incorrect lexicographic comparison like "10.0.0" < "2.0.0")
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.parseSemver = parseSemver;
|
|
9
|
+
exports.compareSemver = compareSemver;
|
|
10
|
+
exports.isVersionLessThan = isVersionLessThan;
|
|
11
|
+
exports.satisfiesRange = satisfiesRange;
|
|
12
|
+
exports.isAffected = isAffected;
|
|
13
|
+
/**
|
|
14
|
+
* Parse a semver string into components
|
|
15
|
+
* Handles formats: 1.2.3, 1.2.3-beta.1, ^1.2.3, ~1.2.3
|
|
16
|
+
*/
|
|
17
|
+
function parseSemver(version) {
|
|
18
|
+
// Strip range prefixes
|
|
19
|
+
const cleaned = version.replace(/^[\^~>=<]+/, '').trim();
|
|
20
|
+
// Match semver pattern
|
|
21
|
+
const match = cleaned.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
|
|
22
|
+
if (!match) {
|
|
23
|
+
// Try partial versions (1.2, 1)
|
|
24
|
+
const partial = cleaned.match(/^(\d+)(?:\.(\d+))?$/);
|
|
25
|
+
if (partial) {
|
|
26
|
+
return {
|
|
27
|
+
major: parseInt(partial[1], 10),
|
|
28
|
+
minor: partial[2] ? parseInt(partial[2], 10) : 0,
|
|
29
|
+
patch: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
major: parseInt(match[1], 10),
|
|
36
|
+
minor: parseInt(match[2], 10),
|
|
37
|
+
patch: parseInt(match[3], 10),
|
|
38
|
+
prerelease: match[4],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Compare two semver versions
|
|
43
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
44
|
+
*/
|
|
45
|
+
function compareSemver(a, b) {
|
|
46
|
+
const parsedA = parseSemver(a);
|
|
47
|
+
const parsedB = parseSemver(b);
|
|
48
|
+
if (!parsedA || !parsedB) {
|
|
49
|
+
// Fallback to string comparison if parsing fails
|
|
50
|
+
return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
|
|
51
|
+
}
|
|
52
|
+
// Compare major.minor.patch
|
|
53
|
+
if (parsedA.major !== parsedB.major) {
|
|
54
|
+
return parsedA.major < parsedB.major ? -1 : 1;
|
|
55
|
+
}
|
|
56
|
+
if (parsedA.minor !== parsedB.minor) {
|
|
57
|
+
return parsedA.minor < parsedB.minor ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
if (parsedA.patch !== parsedB.patch) {
|
|
60
|
+
return parsedA.patch < parsedB.patch ? -1 : 1;
|
|
61
|
+
}
|
|
62
|
+
// Handle prerelease (1.0.0-alpha < 1.0.0)
|
|
63
|
+
if (parsedA.prerelease && !parsedB.prerelease)
|
|
64
|
+
return -1;
|
|
65
|
+
if (!parsedA.prerelease && parsedB.prerelease)
|
|
66
|
+
return 1;
|
|
67
|
+
if (parsedA.prerelease && parsedB.prerelease) {
|
|
68
|
+
return parsedA.prerelease.localeCompare(parsedB.prerelease);
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if version is less than target
|
|
74
|
+
* Enterprise-grade: "10.0.0" is NOT less than "2.0.0"
|
|
75
|
+
*/
|
|
76
|
+
function isVersionLessThan(version, target) {
|
|
77
|
+
return compareSemver(version, target) < 0;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if version satisfies a range expression
|
|
81
|
+
* Supports: <1.2.3, <=1.2.3, >1.2.3, >=1.2.3, 1.2.3 (exact)
|
|
82
|
+
*/
|
|
83
|
+
function satisfiesRange(version, range) {
|
|
84
|
+
const trimmed = range.trim();
|
|
85
|
+
if (trimmed.startsWith('<=')) {
|
|
86
|
+
return compareSemver(version, trimmed.slice(2)) <= 0;
|
|
87
|
+
}
|
|
88
|
+
if (trimmed.startsWith('<')) {
|
|
89
|
+
return compareSemver(version, trimmed.slice(1)) < 0;
|
|
90
|
+
}
|
|
91
|
+
if (trimmed.startsWith('>=')) {
|
|
92
|
+
return compareSemver(version, trimmed.slice(2)) >= 0;
|
|
93
|
+
}
|
|
94
|
+
if (trimmed.startsWith('>')) {
|
|
95
|
+
return compareSemver(version, trimmed.slice(1)) > 0;
|
|
96
|
+
}
|
|
97
|
+
// Exact match
|
|
98
|
+
return compareSemver(version, trimmed) === 0;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if version is affected by vulnerability
|
|
102
|
+
* affectedVersions format: "<4.17.21" or ">=1.0.0 <2.0.0"
|
|
103
|
+
*/
|
|
104
|
+
function isAffected(version, affectedVersions) {
|
|
105
|
+
// Split on spaces for compound ranges
|
|
106
|
+
const parts = affectedVersions.split(/\s+/).filter(Boolean);
|
|
107
|
+
// All conditions must be satisfied
|
|
108
|
+
return parts.every(part => satisfiesRange(version, part));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=semver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/runtime/semver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline support for suppressing known findings
|
|
3
|
+
*/
|
|
4
|
+
export interface BaselineFinding {
|
|
5
|
+
fingerprint: string;
|
|
6
|
+
category: string;
|
|
7
|
+
title: string;
|
|
8
|
+
file: string;
|
|
9
|
+
line: number;
|
|
10
|
+
suppressedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Baseline {
|
|
13
|
+
version: string;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
findings: BaselineFinding[];
|
|
16
|
+
}
|
|
17
|
+
export interface Finding {
|
|
18
|
+
type?: string;
|
|
19
|
+
category?: string;
|
|
20
|
+
title: string;
|
|
21
|
+
file: string;
|
|
22
|
+
line: number;
|
|
23
|
+
match?: string;
|
|
24
|
+
snippet?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class BaselineManager {
|
|
27
|
+
/**
|
|
28
|
+
* Generate stable fingerprint for a finding
|
|
29
|
+
* fingerprint = sha256(category + title + file + line + snippetNormalized)
|
|
30
|
+
*/
|
|
31
|
+
static generateFingerprint(finding: Finding): string;
|
|
32
|
+
/**
|
|
33
|
+
* Load baseline from file
|
|
34
|
+
*/
|
|
35
|
+
static loadBaseline(path: string): Baseline | null;
|
|
36
|
+
/**
|
|
37
|
+
* Save baseline to file
|
|
38
|
+
*/
|
|
39
|
+
static saveBaseline(path: string, findings: Finding[]): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a finding is suppressed by baseline
|
|
42
|
+
*/
|
|
43
|
+
static isSuppressed(finding: Finding, baseline: Baseline | null): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Filter findings by baseline
|
|
46
|
+
*/
|
|
47
|
+
static filterFindings<T extends Finding>(findings: T[], baselinePath?: string): {
|
|
48
|
+
filtered: T[];
|
|
49
|
+
suppressed: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/scanner/baseline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAcpD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAalD;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAiB5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO;IASzE;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAetH"}
|