@skip-ai/scanner 0.5.0 → 0.6.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/dist/artifacts.d.ts +41 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +109 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/cli.d.ts +7 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.js +234 -131
- package/dist/index.js.map +1 -1
- package/dist/reporter.d.ts +19 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +1 -1
- package/dist/reporter.js.map +1 -1
- package/dist/sam.d.ts +120 -0
- package/dist/sam.d.ts.map +1 -0
- package/dist/sam.js +361 -0
- package/dist/sam.js.map +1 -0
- package/dist/uploader.d.ts +19 -0
- package/dist/uploader.d.ts.map +1 -1
- package/dist/uploader.js +68 -0
- package/dist/uploader.js.map +1 -1
- package/package.json +8 -2
- package/scripts/validate-artifact.js +66 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type ArtifactType = 'report' | 'semantic-map' | 'wcag-audit' | 'file-manifest' | 'upload-manifest' | 'validation' | 'source-files' | 'diagnostics' | 'scanner-log';
|
|
2
|
+
export interface FileManifestEntry {
|
|
3
|
+
path: string;
|
|
4
|
+
sizeBytes: number;
|
|
5
|
+
sha256: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ScanArtifact {
|
|
8
|
+
artifactId: string;
|
|
9
|
+
artifactType: ArtifactType;
|
|
10
|
+
filename: string;
|
|
11
|
+
relativePath: string;
|
|
12
|
+
required: boolean;
|
|
13
|
+
scanId: string;
|
|
14
|
+
sizeBytes: number;
|
|
15
|
+
sha256: string;
|
|
16
|
+
schemaVersion: string;
|
|
17
|
+
validationStatus: 'valid' | 'invalid' | 'pending';
|
|
18
|
+
uploadStatus: 'pending' | 'uploaded' | 'failed';
|
|
19
|
+
absolutePath: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ArtifactValidationResult {
|
|
22
|
+
valid: boolean;
|
|
23
|
+
errors: string[];
|
|
24
|
+
warnings: string[];
|
|
25
|
+
artifactType: ArtifactType;
|
|
26
|
+
}
|
|
27
|
+
export declare function sha256Buffer(buffer: Buffer): string;
|
|
28
|
+
export declare function sha256File(filePath: string): string;
|
|
29
|
+
export declare function sha256Json(value: unknown): string;
|
|
30
|
+
export declare function toPosixPath(value: string): string;
|
|
31
|
+
export declare function detectArtifactType(filename: string, payload?: Record<string, unknown>): ArtifactType;
|
|
32
|
+
export declare function loadJsonFile(filePath: string): Record<string, unknown>;
|
|
33
|
+
export declare function validateReportArtifact(payload: Record<string, unknown>): ArtifactValidationResult;
|
|
34
|
+
export declare function validateWcagAuditArtifact(payload: Record<string, unknown>): ArtifactValidationResult;
|
|
35
|
+
export declare function validateFileManifestArtifact(payload: Record<string, unknown>): ArtifactValidationResult;
|
|
36
|
+
export declare function validateUploadManifestArtifact(payload: Record<string, unknown>): ArtifactValidationResult;
|
|
37
|
+
export declare function validateValidationArtifact(payload: Record<string, unknown>): ArtifactValidationResult;
|
|
38
|
+
export declare function validateSourceFilesArtifact(): ArtifactValidationResult;
|
|
39
|
+
export declare function validateDiagnosticsArtifact(): ArtifactValidationResult;
|
|
40
|
+
export declare function buildScanArtifact(rootDir: string, relativePath: string, artifactType: ArtifactType, scanId: string): ScanArtifact;
|
|
41
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,cAAc,GACd,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAoBpG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtE;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAMjG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAMpG;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAKvG;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAIzG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAIrG;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAiBjI"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
export function sha256Buffer(buffer) {
|
|
5
|
+
return crypto.createHash('sha256').update(buffer).digest('hex');
|
|
6
|
+
}
|
|
7
|
+
export function sha256File(filePath) {
|
|
8
|
+
return sha256Buffer(fs.readFileSync(filePath));
|
|
9
|
+
}
|
|
10
|
+
export function sha256Json(value) {
|
|
11
|
+
return crypto.createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
12
|
+
}
|
|
13
|
+
export function toPosixPath(value) {
|
|
14
|
+
return value.replace(/\\/g, '/');
|
|
15
|
+
}
|
|
16
|
+
export function detectArtifactType(filename, payload) {
|
|
17
|
+
const base = path.basename(filename);
|
|
18
|
+
if (base === '.skip-sam.json' ||
|
|
19
|
+
payload?.artifactType === 'semantic-map' ||
|
|
20
|
+
(Array.isArray(payload?.entities) && Array.isArray(payload?.relationships))) {
|
|
21
|
+
return 'semantic-map';
|
|
22
|
+
}
|
|
23
|
+
if (base === '.skip-report.json' || payload?.navigationMap || payload?.briefing || payload?.routes)
|
|
24
|
+
return 'report';
|
|
25
|
+
if (base === '.skip-wcag-audit.json' || payload?.artifactType === 'wcag-audit' || payload?.violations || payload?.score) {
|
|
26
|
+
return 'wcag-audit';
|
|
27
|
+
}
|
|
28
|
+
if (base === 'scan-file-manifest.json' || payload?.artifactType === 'file-manifest')
|
|
29
|
+
return 'file-manifest';
|
|
30
|
+
if (base === 'upload-manifest.json' || payload?.artifactType === 'upload-manifest')
|
|
31
|
+
return 'upload-manifest';
|
|
32
|
+
if (base === 'scan-validation.json' || payload?.artifactType === 'validation')
|
|
33
|
+
return 'validation';
|
|
34
|
+
if (base === 'scan-source-files.json' || base.startsWith('scan-source-files.part-'))
|
|
35
|
+
return 'source-files';
|
|
36
|
+
if (base === 'scanner-diagnostics.json')
|
|
37
|
+
return 'diagnostics';
|
|
38
|
+
if (base === 'scanner.log')
|
|
39
|
+
return 'scanner-log';
|
|
40
|
+
return 'report';
|
|
41
|
+
}
|
|
42
|
+
export function loadJsonFile(filePath) {
|
|
43
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
function ok(type) {
|
|
46
|
+
return { valid: true, errors: [], warnings: [], artifactType: type };
|
|
47
|
+
}
|
|
48
|
+
export function validateReportArtifact(payload) {
|
|
49
|
+
const errors = [];
|
|
50
|
+
if (!payload.navigationMap && !payload.routes && !payload.wcag) {
|
|
51
|
+
errors.push('O payload não contém navigationMap, routes nem wcag.');
|
|
52
|
+
}
|
|
53
|
+
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'report' };
|
|
54
|
+
}
|
|
55
|
+
export function validateWcagAuditArtifact(payload) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
if (payload.artifactType && payload.artifactType !== 'wcag-audit')
|
|
58
|
+
errors.push('artifactType inválido para auditoria WCAG.');
|
|
59
|
+
if (!Array.isArray(payload.violations))
|
|
60
|
+
errors.push('violations deve ser array.');
|
|
61
|
+
if (typeof payload.score !== 'number')
|
|
62
|
+
errors.push('score deve ser number.');
|
|
63
|
+
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'wcag-audit' };
|
|
64
|
+
}
|
|
65
|
+
export function validateFileManifestArtifact(payload) {
|
|
66
|
+
const errors = [];
|
|
67
|
+
if (!Array.isArray(payload.files))
|
|
68
|
+
errors.push('files deve ser array.');
|
|
69
|
+
if (typeof payload.sha256 !== 'string')
|
|
70
|
+
errors.push('sha256 deve existir.');
|
|
71
|
+
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'file-manifest' };
|
|
72
|
+
}
|
|
73
|
+
export function validateUploadManifestArtifact(payload) {
|
|
74
|
+
const errors = [];
|
|
75
|
+
if (!Array.isArray(payload.artifacts))
|
|
76
|
+
errors.push('artifacts deve ser array.');
|
|
77
|
+
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'upload-manifest' };
|
|
78
|
+
}
|
|
79
|
+
export function validateValidationArtifact(payload) {
|
|
80
|
+
const errors = [];
|
|
81
|
+
if (typeof payload.valid !== 'boolean')
|
|
82
|
+
errors.push('valid deve ser boolean.');
|
|
83
|
+
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'validation' };
|
|
84
|
+
}
|
|
85
|
+
export function validateSourceFilesArtifact() {
|
|
86
|
+
return ok('source-files');
|
|
87
|
+
}
|
|
88
|
+
export function validateDiagnosticsArtifact() {
|
|
89
|
+
return ok('diagnostics');
|
|
90
|
+
}
|
|
91
|
+
export function buildScanArtifact(rootDir, relativePath, artifactType, scanId) {
|
|
92
|
+
const absolutePath = path.join(rootDir, relativePath);
|
|
93
|
+
const stat = fs.statSync(absolutePath);
|
|
94
|
+
return {
|
|
95
|
+
artifactId: artifactType,
|
|
96
|
+
artifactType,
|
|
97
|
+
filename: path.basename(relativePath),
|
|
98
|
+
relativePath: toPosixPath(relativePath),
|
|
99
|
+
required: ['report', 'semantic-map', 'wcag-audit', 'file-manifest', 'upload-manifest', 'validation'].includes(artifactType),
|
|
100
|
+
scanId,
|
|
101
|
+
sizeBytes: stat.size,
|
|
102
|
+
sha256: sha256File(absolutePath),
|
|
103
|
+
schemaVersion: '1.0.0',
|
|
104
|
+
validationStatus: 'valid',
|
|
105
|
+
uploadStatus: 'pending',
|
|
106
|
+
absolutePath,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/** Máscara um token pra nunca imprimir completo em logs/erros: 2ef0...79fb. */
|
|
2
1
|
export declare function maskToken(token: string): string;
|
|
3
|
-
/** Resolve o token: prioriza --token, depois SKIP_TOKEN env var. */
|
|
4
2
|
export declare function resolveToken(cliToken: string | undefined): string;
|
|
5
3
|
export interface SendOptions {
|
|
6
|
-
file: string;
|
|
4
|
+
file: string[];
|
|
5
|
+
type?: string;
|
|
6
|
+
scanId?: string;
|
|
7
7
|
token: string;
|
|
8
8
|
url: string;
|
|
9
9
|
verbose: boolean;
|
|
@@ -16,6 +16,10 @@ export interface ScanOptions {
|
|
|
16
16
|
ignore: string[];
|
|
17
17
|
verbose: boolean;
|
|
18
18
|
dryRun: boolean;
|
|
19
|
+
generateSam: boolean;
|
|
20
|
+
validateSam: boolean;
|
|
21
|
+
send: boolean;
|
|
22
|
+
outputDir?: string;
|
|
19
23
|
}
|
|
20
24
|
export declare const DEFAULT_BASE_URL = "https://app.goskip.dev";
|
|
21
25
|
export declare function parseCli(argv?: string[]): {
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAOzD,wBAAgB,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CAkErH"}
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { CLI_VERSION } from './reporter.js';
|
|
3
|
-
/** Máscara um token pra nunca imprimir completo em logs/erros: 2ef0...79fb. */
|
|
4
3
|
export function maskToken(token) {
|
|
5
4
|
if (!token)
|
|
6
5
|
return '(vazio)';
|
|
@@ -8,34 +7,41 @@ export function maskToken(token) {
|
|
|
8
7
|
return token.slice(0, 2) + '...' + token.slice(-2);
|
|
9
8
|
return token.slice(0, 4) + '...' + token.slice(-4);
|
|
10
9
|
}
|
|
11
|
-
/** Resolve o token: prioriza --token, depois SKIP_TOKEN env var. */
|
|
12
10
|
export function resolveToken(cliToken) {
|
|
13
11
|
return cliToken || process.env.SKIP_TOKEN || '';
|
|
14
12
|
}
|
|
15
13
|
export const DEFAULT_BASE_URL = 'https://app.goskip.dev';
|
|
14
|
+
function collect(value, previous) {
|
|
15
|
+
previous.push(value);
|
|
16
|
+
return previous;
|
|
17
|
+
}
|
|
16
18
|
export function parseCli(argv = process.argv) {
|
|
17
19
|
const program = new Command()
|
|
18
20
|
.name('skip-scanner')
|
|
19
21
|
.description('Scanner CLI para a plataforma Skip AI Accessibility Layer')
|
|
20
22
|
.version(CLI_VERSION);
|
|
21
|
-
// Comando principal: send (transporta um mapa já montado pelo agente)
|
|
22
23
|
program
|
|
23
24
|
.command('send', { isDefault: true })
|
|
24
|
-
.description('Envia um
|
|
25
|
-
.
|
|
25
|
+
.description('Envia um ou mais artefatos já gerados para o Skip Cloud.')
|
|
26
|
+
.option('-f, --file <path>', 'Arquivo JSON de artefato (pode repetir)', collect, [])
|
|
27
|
+
.option('--type <type>', 'Tipo do artefato (ex.: semantic-map)')
|
|
28
|
+
.option('--scan-id <scanId>', 'Scan ID esperado para validar envio isolado')
|
|
26
29
|
.option('-t, --token <token>', 'Token do projeto (ou defina SKIP_TOKEN no ambiente)')
|
|
27
30
|
.option('-u, --url <url>', 'URL do Skip Cloud', DEFAULT_BASE_URL)
|
|
28
31
|
.option('--no-polling', 'Enviar sem aguardar o enriquecimento', false)
|
|
29
32
|
.option('-v, --verbose', 'Exibir detalhes no terminal', false)
|
|
30
33
|
.action(() => { });
|
|
31
|
-
// Comando legado: scan (extração por regex — mantido como fallback)
|
|
32
34
|
program
|
|
33
|
-
.command('scan')
|
|
34
|
-
.description('
|
|
35
|
-
.option('-t, --token <token>', 'Token do projeto (ou SKIP_TOKEN). Obrigatório
|
|
35
|
+
.command('scan [projectPath]')
|
|
36
|
+
.description('Escaneia o projeto, gera artefatos Skip e opcionalmente envia para o Skip Cloud.')
|
|
37
|
+
.option('-t, --token <token>', 'Token do projeto (ou SKIP_TOKEN). Obrigatório somente com --send.')
|
|
36
38
|
.option('-u, --url <url>', 'URL do Skip Cloud', DEFAULT_BASE_URL)
|
|
37
39
|
.option('-d, --dir <dir>', 'Diretório raiz do projeto', process.cwd())
|
|
38
40
|
.option('-i, --ignore <patterns...>', 'Padrões a ignorar além do padrão', [])
|
|
41
|
+
.option('--generate-sam', 'Gera um novo .skip-sam.json a partir do scan atual', false)
|
|
42
|
+
.option('--validate-sam', 'Valida o .skip-sam.json gerado no scan atual', false)
|
|
43
|
+
.option('--send', 'Envia todos os artefatos do scan atual', false)
|
|
44
|
+
.option('--output-dir <dir>', 'Diretório de saída dos artefatos')
|
|
39
45
|
.option('--dry-run', 'Executa o scan sem enviar para a plataforma', false)
|
|
40
46
|
.option('-v, --verbose', 'Exibir detalhes do scan no terminal', false)
|
|
41
47
|
.action(() => { });
|
|
@@ -43,19 +49,30 @@ export function parseCli(argv = process.argv) {
|
|
|
43
49
|
const commandName = program.args[0] === 'scan' ? 'scan' : 'send';
|
|
44
50
|
const command = program.commands.find((c) => c.name() === commandName);
|
|
45
51
|
const opts = (command?.opts() ?? {});
|
|
46
|
-
|
|
52
|
+
if (commandName === 'scan') {
|
|
53
|
+
const projectPath = program.args[1];
|
|
54
|
+
if (projectPath && !projectPath.startsWith('-')) {
|
|
55
|
+
opts.dir = projectPath;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
47
58
|
if (commandName === 'send') {
|
|
48
59
|
const sendOpts = opts;
|
|
60
|
+
if (!sendOpts.file.length) {
|
|
61
|
+
program.error('erro: informe ao menos um --file=<ARQUIVO>.', { exitCode: 1 });
|
|
62
|
+
}
|
|
49
63
|
sendOpts.token = resolveToken(sendOpts.token);
|
|
50
64
|
if (!sendOpts.token) {
|
|
51
|
-
program.error(
|
|
65
|
+
program.error('erro: token obrigatório. Use --token=<TOKEN> ou defina SKIP_TOKEN no ambiente.', { exitCode: 1 });
|
|
52
66
|
}
|
|
53
67
|
}
|
|
54
68
|
else {
|
|
55
69
|
const scanOpts = opts;
|
|
56
70
|
scanOpts.token = resolveToken(scanOpts.token);
|
|
57
|
-
|
|
58
|
-
|
|
71
|
+
scanOpts.generateSam = true;
|
|
72
|
+
if (scanOpts.send)
|
|
73
|
+
scanOpts.dryRun = false;
|
|
74
|
+
if (scanOpts.send && !scanOpts.token) {
|
|
75
|
+
program.error('erro: token obrigatório para --send. Use --token=<TOKEN> ou SKIP_TOKEN.', { exitCode: 1 });
|
|
59
76
|
}
|
|
60
77
|
}
|
|
61
78
|
return { command: commandName, opts };
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA4B;IACvD,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;AAClD,CAAC;AAyBD,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAEzD,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAiB,OAAO,CAAC,IAAI;IACpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,cAAc,CAAC;SACpB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,EAAE,OAAO,EAAE,EAAE,CAAC;SACnF,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;SAC3E,MAAM,CAAC,qBAAqB,EAAE,qDAAqD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;SAChE,MAAM,CAAC,cAAc,EAAE,sCAAsC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,6BAA6B,EAAE,KAAK,CAAC;SAC7D,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpB,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,qBAAqB,EAAE,mEAAmE,CAAC;SAClG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACrE,MAAM,CAAC,4BAA4B,EAAE,kCAAkC,EAAE,EAAE,CAAC;SAC5E,MAAM,CAAC,gBAAgB,EAAE,oDAAoD,EAAE,KAAK,CAAC;SACrF,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,KAAK,CAAC;SAC/E,MAAM,CAAC,QAAQ,EAAE,wCAAwC,EAAE,KAAK,CAAC;SACjE,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,qCAAqC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAA8B,CAAC;IAElE,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAoB,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAmB,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,gFAAgF,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,IAAmB,CAAC;QACrC,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,IAAI,QAAQ,CAAC,IAAI;YAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;QAC3C,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,yEAAyE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC"}
|