@skip-ai/scanner 0.6.0 → 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/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +18 -11
- package/dist/artifacts.js.map +1 -1
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.js +222 -29
- package/dist/index.js.map +1 -1
- package/dist/reporter.d.ts +7 -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 +19 -2
- package/dist/sam.d.ts.map +1 -1
- package/dist/sam.js +101 -13
- package/dist/sam.js.map +1 -1
- package/dist/scanner/navigation.d.ts.map +1 -1
- package/dist/scanner/navigation.js +24 -8
- package/dist/scanner/navigation.js.map +1 -1
- package/dist/scanner/routes.d.ts.map +1 -1
- package/dist/scanner/routes.js +33 -2
- package/dist/scanner/routes.js.map +1 -1
- package/dist/uploader.d.ts +9 -0
- package/dist/uploader.d.ts.map +1 -1
- package/dist/uploader.js +16 -0
- package/dist/uploader.js.map +1 -1
- package/package.json +1 -1
package/dist/artifacts.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,CAOjG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,wBAAwB,CAOpG;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,CAQzG;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"}
|
package/dist/artifacts.js
CHANGED
|
@@ -20,9 +20,9 @@ export function detectArtifactType(filename, payload) {
|
|
|
20
20
|
(Array.isArray(payload?.entities) && Array.isArray(payload?.relationships))) {
|
|
21
21
|
return 'semantic-map';
|
|
22
22
|
}
|
|
23
|
-
if (base === '.skip-report.json' || payload?.navigationMap || payload?.briefing || payload?.routes)
|
|
23
|
+
if (base === '.skip-report.json' || payload?.artifactType === 'report' || payload?.navigationMap || payload?.briefing || payload?.routes)
|
|
24
24
|
return 'report';
|
|
25
|
-
if (base === '.skip-wcag-audit.json' || payload?.artifactType === 'wcag-audit' || payload?.violations || payload?.score) {
|
|
25
|
+
if (base === '.skip-wcag-audit.json' || payload?.artifactType === 'wcag-audit' || payload?.findings || payload?.violations || payload?.score) {
|
|
26
26
|
return 'wcag-audit';
|
|
27
27
|
}
|
|
28
28
|
if (base === 'scan-file-manifest.json' || payload?.artifactType === 'file-manifest')
|
|
@@ -47,19 +47,22 @@ function ok(type) {
|
|
|
47
47
|
}
|
|
48
48
|
export function validateReportArtifact(payload) {
|
|
49
49
|
const errors = [];
|
|
50
|
-
if (
|
|
51
|
-
errors.push('
|
|
50
|
+
if (payload.artifactType && payload.artifactType !== 'report')
|
|
51
|
+
errors.push('artifactType invalido para relatorio.');
|
|
52
|
+
if (!payload.navigationMap && !payload.routes && !payload.wcag && !payload.semanticMapSummary && !payload.wcagSummary) {
|
|
53
|
+
errors.push('O payload nao contem navigationMap, routes nem wcag.');
|
|
52
54
|
}
|
|
53
55
|
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'report' };
|
|
54
56
|
}
|
|
55
57
|
export function validateWcagAuditArtifact(payload) {
|
|
56
58
|
const errors = [];
|
|
57
59
|
if (payload.artifactType && payload.artifactType !== 'wcag-audit')
|
|
58
|
-
errors.push('artifactType
|
|
59
|
-
if (!Array.isArray(payload.violations))
|
|
60
|
-
errors.push('
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
errors.push('artifactType invalido para auditoria WCAG.');
|
|
61
|
+
if (!Array.isArray(payload.findings) && !Array.isArray(payload.violations))
|
|
62
|
+
errors.push('findings deve ser array.');
|
|
63
|
+
const checks = payload.checks;
|
|
64
|
+
if (!checks || typeof checks.total !== 'number')
|
|
65
|
+
errors.push('checks.total deve ser number.');
|
|
63
66
|
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'wcag-audit' };
|
|
64
67
|
}
|
|
65
68
|
export function validateFileManifestArtifact(payload) {
|
|
@@ -72,8 +75,12 @@ export function validateFileManifestArtifact(payload) {
|
|
|
72
75
|
}
|
|
73
76
|
export function validateUploadManifestArtifact(payload) {
|
|
74
77
|
const errors = [];
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
const files = Array.isArray(payload.files) ? payload.files : Array.isArray(payload.artifacts) ? payload.artifacts : undefined;
|
|
79
|
+
if (!files)
|
|
80
|
+
errors.push('files deve ser array.');
|
|
81
|
+
if (files && typeof payload.expectedFileCount === 'number' && payload.expectedFileCount !== files.length) {
|
|
82
|
+
errors.push('expectedFileCount diverge de files.length.');
|
|
83
|
+
}
|
|
77
84
|
return { valid: errors.length === 0, errors, warnings: [], artifactType: 'upload-manifest' };
|
|
78
85
|
}
|
|
79
86
|
export function validateValidationArtifact(payload) {
|
package/dist/artifacts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAyC5B,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAiC;IACpF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IACE,IAAI,KAAK,gBAAgB;QACzB,OAAO,EAAE,YAAY,KAAK,cAAc;QACxC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,EAC3E,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,KAAK,mBAAmB,IAAI,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM;QAAE,OAAO,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare function maskToken(token: string): string;
|
|
|
2
2
|
export declare function resolveToken(cliToken: string | undefined): string;
|
|
3
3
|
export interface SendOptions {
|
|
4
4
|
file: string[];
|
|
5
|
+
dir?: string;
|
|
5
6
|
type?: string;
|
|
6
7
|
scanId?: string;
|
|
7
8
|
token: string;
|
|
@@ -20,6 +21,10 @@ export interface ScanOptions {
|
|
|
20
21
|
validateSam: boolean;
|
|
21
22
|
send: boolean;
|
|
22
23
|
outputDir?: string;
|
|
24
|
+
app?: string;
|
|
25
|
+
noUpload: boolean;
|
|
26
|
+
keepFailedArtifacts: boolean;
|
|
27
|
+
cleanFailedArtifacts: boolean;
|
|
23
28
|
}
|
|
24
29
|
export declare const DEFAULT_BASE_URL = "https://app.goskip.dev";
|
|
25
30
|
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,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;
|
|
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,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,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;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;CAC/B;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,CA2ErH"}
|
package/dist/cli.js
CHANGED
|
@@ -24,6 +24,7 @@ export function parseCli(argv = process.argv) {
|
|
|
24
24
|
.command('send', { isDefault: true })
|
|
25
25
|
.description('Envia um ou mais artefatos já gerados para o Skip Cloud.')
|
|
26
26
|
.option('-f, --file <path>', 'Arquivo JSON de artefato (pode repetir)', collect, [])
|
|
27
|
+
.option('--dir <dir>', 'Diretório de scan contendo os artefatos obrigatórios')
|
|
27
28
|
.option('--type <type>', 'Tipo do artefato (ex.: semantic-map)')
|
|
28
29
|
.option('--scan-id <scanId>', 'Scan ID esperado para validar envio isolado')
|
|
29
30
|
.option('-t, --token <token>', 'Token do projeto (ou defina SKIP_TOKEN no ambiente)')
|
|
@@ -41,6 +42,12 @@ export function parseCli(argv = process.argv) {
|
|
|
41
42
|
.option('--generate-sam', 'Gera um novo .skip-sam.json a partir do scan atual', false)
|
|
42
43
|
.option('--validate-sam', 'Valida o .skip-sam.json gerado no scan atual', false)
|
|
43
44
|
.option('--send', 'Envia todos os artefatos do scan atual', false)
|
|
45
|
+
.option('--app <path>', 'Caminho da aplicação dentro do workspace/monorepo')
|
|
46
|
+
.option('--generate-wcag', 'Gera .skip-wcag-audit.json', true)
|
|
47
|
+
.option('--validate', 'Valida todos os artefatos gerados', false)
|
|
48
|
+
.option('--no-upload', 'Não faz upload, mesmo quando --send for informado', false)
|
|
49
|
+
.option('--keep-failed-artifacts', 'Preserva diagnósticos e snapshots em caso de falha', true)
|
|
50
|
+
.option('--clean-failed-artifacts', 'Remove artefatos de falha após erro', false)
|
|
44
51
|
.option('--output-dir <dir>', 'Diretório de saída dos artefatos')
|
|
45
52
|
.option('--dry-run', 'Executa o scan sem enviar para a plataforma', false)
|
|
46
53
|
.option('-v, --verbose', 'Exibir detalhes do scan no terminal', false)
|
|
@@ -57,8 +64,8 @@ export function parseCli(argv = process.argv) {
|
|
|
57
64
|
}
|
|
58
65
|
if (commandName === 'send') {
|
|
59
66
|
const sendOpts = opts;
|
|
60
|
-
if (!sendOpts.file.length) {
|
|
61
|
-
program.error('erro: informe ao menos um --file=<ARQUIVO>.', { exitCode: 1 });
|
|
67
|
+
if (!sendOpts.file.length && !sendOpts.dir) {
|
|
68
|
+
program.error('erro: informe --dir=<DIRETÓRIO> ou ao menos um --file=<ARQUIVO>.', { exitCode: 1 });
|
|
62
69
|
}
|
|
63
70
|
sendOpts.token = resolveToken(sendOpts.token);
|
|
64
71
|
if (!sendOpts.token) {
|
|
@@ -69,6 +76,9 @@ export function parseCli(argv = process.argv) {
|
|
|
69
76
|
const scanOpts = opts;
|
|
70
77
|
scanOpts.token = resolveToken(scanOpts.token);
|
|
71
78
|
scanOpts.generateSam = true;
|
|
79
|
+
scanOpts.keepFailedArtifacts = !scanOpts.cleanFailedArtifacts;
|
|
80
|
+
if (scanOpts.noUpload)
|
|
81
|
+
scanOpts.send = false;
|
|
72
82
|
if (scanOpts.send)
|
|
73
83
|
scanOpts.dryRun = false;
|
|
74
84
|
if (scanOpts.send && !scanOpts.token) {
|
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,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;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,15 @@ import { appendHistory } from './scanner/history.js';
|
|
|
19
19
|
import { buildReport, maskReportSecrets, CLI_VERSION } from './reporter.js';
|
|
20
20
|
import { DEFAULT_IGNORE_PATTERNS } from './scanner/ignore.js';
|
|
21
21
|
import { buildScanArtifact, detectArtifactType, loadJsonFile, validateFileManifestArtifact, validateReportArtifact, validateUploadManifestArtifact, validateValidationArtifact, validateWcagAuditArtifact, } from './artifacts.js';
|
|
22
|
-
import { buildSemanticApplicationMap, createFileManifest, validateSamArtifact, writeSkipSamFile, } from './sam.js';
|
|
22
|
+
import { buildSemanticApplicationMap, createFileManifest, normalizeSemanticApplicationMap, validateSamArtifact, writeSkipSamFile, } from './sam.js';
|
|
23
|
+
const REQUIRED_ARTIFACTS = [
|
|
24
|
+
'.skip-report.json',
|
|
25
|
+
'.skip-sam.json',
|
|
26
|
+
'.skip-wcag-audit.json',
|
|
27
|
+
'scan-file-manifest.json',
|
|
28
|
+
'upload-manifest.json',
|
|
29
|
+
'scan-validation.json',
|
|
30
|
+
];
|
|
23
31
|
function colorScore(score) {
|
|
24
32
|
const c = scoreColor(score);
|
|
25
33
|
if (c === 'green')
|
|
@@ -37,6 +45,50 @@ function writeJson(filePath, value) {
|
|
|
37
45
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
38
46
|
fs.writeFileSync(filePath, JSON.stringify(value, null, 2));
|
|
39
47
|
}
|
|
48
|
+
function appendLog(outputDir, message) {
|
|
49
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
50
|
+
fs.appendFileSync(path.join(outputDir, 'scanner.log'), `${new Date().toISOString()} ${message}\n`);
|
|
51
|
+
}
|
|
52
|
+
function safeRelative(from, to) {
|
|
53
|
+
return path.relative(from, to).replace(/\\/g, '/') || '.';
|
|
54
|
+
}
|
|
55
|
+
function discoverApplicationRoots(workspaceRoot) {
|
|
56
|
+
const candidates = ['.', 'apps/*', 'packages/*'];
|
|
57
|
+
const roots = new Set();
|
|
58
|
+
for (const pattern of candidates) {
|
|
59
|
+
const base = pattern.endsWith('/*') ? pattern.slice(0, -2) : pattern;
|
|
60
|
+
const absBase = path.join(workspaceRoot, base);
|
|
61
|
+
if (!fs.existsSync(absBase))
|
|
62
|
+
continue;
|
|
63
|
+
if (pattern === '.') {
|
|
64
|
+
if (fs.existsSync(path.join(workspaceRoot, 'package.json')))
|
|
65
|
+
roots.add(workspaceRoot);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
for (const name of fs.readdirSync(absBase)) {
|
|
69
|
+
const dir = path.join(absBase, name);
|
|
70
|
+
if (fs.statSync(dir).isDirectory() && fs.existsSync(path.join(dir, 'package.json')))
|
|
71
|
+
roots.add(dir);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [...roots];
|
|
75
|
+
}
|
|
76
|
+
function selectApplicationRoot(workspaceRoot, app) {
|
|
77
|
+
if (app)
|
|
78
|
+
return path.resolve(workspaceRoot, app);
|
|
79
|
+
const roots = discoverApplicationRoots(workspaceRoot);
|
|
80
|
+
const frontend = roots.find((root) => {
|
|
81
|
+
try {
|
|
82
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'));
|
|
83
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
84
|
+
return Boolean(deps.next || deps.vite || deps.react || deps.vue || deps['react-router-dom']);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return frontend ?? workspaceRoot;
|
|
91
|
+
}
|
|
40
92
|
function validateArtifactByType(filePath, type, context) {
|
|
41
93
|
const payload = loadJsonFile(filePath);
|
|
42
94
|
if (type === 'semantic-map')
|
|
@@ -54,6 +106,13 @@ function validateArtifactByType(filePath, type, context) {
|
|
|
54
106
|
return { valid: true, errors: [], warnings: [], artifactType: type };
|
|
55
107
|
}
|
|
56
108
|
async function sendMode(opts) {
|
|
109
|
+
if (opts.dir) {
|
|
110
|
+
const dir = path.resolve(opts.dir);
|
|
111
|
+
const missing = REQUIRED_ARTIFACTS.filter((file) => !fs.existsSync(path.join(dir, file)));
|
|
112
|
+
if (missing.length)
|
|
113
|
+
throw new Error(`Upload parcial bloqueado. Artefatos ausentes em ${dir}:\n${missing.join('\n')}`);
|
|
114
|
+
opts.file = REQUIRED_ARTIFACTS.map((file) => path.join(dir, file));
|
|
115
|
+
}
|
|
57
116
|
console.log(banner(CLI_VERSION));
|
|
58
117
|
console.log(chalk.dim(' Modo: send (artefatos)'));
|
|
59
118
|
console.log(chalk.dim(` Plataforma: ${opts.url}`));
|
|
@@ -93,38 +152,60 @@ async function sendMode(opts) {
|
|
|
93
152
|
schemaVersion: '1.0.0',
|
|
94
153
|
artifactType: 'upload-manifest',
|
|
95
154
|
scanId: expectedScanId ?? artifacts[0].scanId,
|
|
155
|
+
expectedFileCount: artifacts.length,
|
|
156
|
+
files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
96
157
|
artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
97
158
|
};
|
|
159
|
+
console.log(`Artefatos preparados: ${artifacts.length}`);
|
|
160
|
+
for (const artifact of artifacts)
|
|
161
|
+
console.log(`✓ ${artifact.filename}`);
|
|
98
162
|
const uploadSpinner = spinner('Enviando artefatos para o Skip Cloud...');
|
|
99
163
|
const result = await uploadArtifactBundle(artifacts, opts.token, opts.url, manifest);
|
|
100
164
|
uploadSpinner.succeed(`Artefatos enviados e confirmados. Scan ID: ${chalk.yellow(result.scanId)}`);
|
|
101
165
|
}
|
|
102
166
|
async function scanMode(opts) {
|
|
103
167
|
console.log(banner(CLI_VERSION));
|
|
104
|
-
const
|
|
105
|
-
const
|
|
168
|
+
const workspaceRoot = path.resolve(opts.dir);
|
|
169
|
+
const applicationRoot = selectApplicationRoot(workspaceRoot, opts.app);
|
|
106
170
|
const scanId = createScanId();
|
|
171
|
+
const outputDir = path.resolve(opts.outputDir ?? path.join(workspaceRoot, '.skip-output', scanId));
|
|
107
172
|
const startedAt = new Date().toISOString();
|
|
108
173
|
const ignorePatterns = [...DEFAULT_IGNORE_PATTERNS, ...opts.ignore];
|
|
109
174
|
console.log(chalk.dim(' Modo: scan'));
|
|
110
|
-
console.log(chalk.dim(`
|
|
175
|
+
console.log(chalk.dim(` Diretorio: ${workspaceRoot}`));
|
|
176
|
+
console.log(chalk.dim(` Aplicacao: ${applicationRoot}`));
|
|
111
177
|
console.log(chalk.dim(` Output: ${outputDir}`));
|
|
112
178
|
console.log(chalk.dim(` Plataforma: ${opts.url}`));
|
|
113
179
|
console.log(chalk.dim(` Scan ID: ${scanId}\n`));
|
|
114
180
|
console.log('[1/10] Detectando projeto');
|
|
115
|
-
|
|
116
|
-
|
|
181
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
182
|
+
appendLog(outputDir, `[SAM] Scanner version: ${CLI_VERSION}`);
|
|
183
|
+
appendLog(outputDir, `[SAM] Project root: ${workspaceRoot}`);
|
|
184
|
+
appendLog(outputDir, `[SAM] Workspace root: ${workspaceRoot}`);
|
|
185
|
+
appendLog(outputDir, `[SAM] Application roots: ${discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)).join(', ')}`);
|
|
186
|
+
const signature = detectProject(applicationRoot);
|
|
187
|
+
const projectName = path.basename(applicationRoot);
|
|
117
188
|
console.log('[2/10] Descobrindo arquivos');
|
|
118
|
-
const fileManifest = await createFileManifest(
|
|
189
|
+
const fileManifest = await createFileManifest(applicationRoot, ignorePatterns);
|
|
190
|
+
appendLog(outputDir, `[SAM] Files discovered: ${fileManifest.files.length}`);
|
|
191
|
+
appendLog(outputDir, `[SAM] Source files included: ${fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length}`);
|
|
192
|
+
const fileManifestPayload = { schemaVersion: '1.0.0', artifactType: 'file-manifest', scanId, files: fileManifest.files, sha256: fileManifest.sha256 };
|
|
193
|
+
writeJson(path.join(outputDir, 'scan-file-manifest.json'), fileManifestPayload);
|
|
119
194
|
console.log('[3/10] Detectando rotas e telas');
|
|
120
|
-
const routes = await extractRoutes(
|
|
121
|
-
|
|
195
|
+
const routes = await extractRoutes(applicationRoot, signature.srcDir, ignorePatterns);
|
|
196
|
+
appendLog(outputDir, `[SAM] Route files: ${routes.map((route) => route.physicalPath).join(', ')}`);
|
|
197
|
+
appendLog(outputDir, `[SAM] Routes detected: ${routes.length}`);
|
|
198
|
+
const navigationMap = await extractNavigation(applicationRoot, opts.ignore, {
|
|
122
199
|
pagesRoutes: routes.map((r) => ({ physicalPath: r.physicalPath, logicalRoute: r.logicalRoute })),
|
|
123
200
|
srcDir: signature.srcDir,
|
|
124
201
|
});
|
|
202
|
+
appendLog(outputDir, `[SAM] Screens detected: ${navigationMap.screens.length}`);
|
|
125
203
|
console.log('[4/10] Analisando componentes');
|
|
126
|
-
const { components, events } = await extractComponents(
|
|
127
|
-
const apiCalls = await extractApiCalls(
|
|
204
|
+
const { components, events } = await extractComponents(applicationRoot, opts.ignore);
|
|
205
|
+
const apiCalls = await extractApiCalls(applicationRoot, opts.ignore);
|
|
206
|
+
appendLog(outputDir, `[SAM] Components detected: ${components.length}`);
|
|
207
|
+
appendLog(outputDir, `[SAM] Interactive elements detected: ${navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0)}`);
|
|
208
|
+
appendLog(outputDir, `[SAM] Candidate entities: ${routes.length + navigationMap.screens.length + components.length + apiCalls.length}`);
|
|
128
209
|
const briefing = buildBriefing(navigationMap);
|
|
129
210
|
const widgetSnippet = buildWidgetSnippet();
|
|
130
211
|
const guidedFlows = detectGuidedFlows(navigationMap);
|
|
@@ -132,7 +213,9 @@ async function scanMode(opts) {
|
|
|
132
213
|
let sam = buildSemanticApplicationMap({
|
|
133
214
|
scanId,
|
|
134
215
|
startedAt,
|
|
135
|
-
rootDir,
|
|
216
|
+
rootDir: applicationRoot,
|
|
217
|
+
workspaceRoot,
|
|
218
|
+
applicationRoot,
|
|
136
219
|
signature,
|
|
137
220
|
routes,
|
|
138
221
|
components,
|
|
@@ -143,6 +226,23 @@ async function scanMode(opts) {
|
|
|
143
226
|
sourceManifestSha256: fileManifest.sha256,
|
|
144
227
|
projectName,
|
|
145
228
|
});
|
|
229
|
+
sam = normalizeSemanticApplicationMap(sam);
|
|
230
|
+
appendLog(outputDir, `[SAM] Normalized entities: ${sam.entities.length}`);
|
|
231
|
+
appendLog(outputDir, `[SAM] Discarded entities: 0`);
|
|
232
|
+
appendLog(outputDir, `[SAM] Generated IDs: ${sam.entities.filter((entity) => entity.id).length}`);
|
|
233
|
+
appendLog(outputDir, `[SAM] Entities sent to validator: ${sam.entities.length}`);
|
|
234
|
+
appendLog(outputDir, `[SAM] Relationships sent to validator: ${sam.relationships.length}`);
|
|
235
|
+
writeJson(path.join(outputDir, '.skip-sam.invalid.json'), sam);
|
|
236
|
+
const validatorInputSummary = {
|
|
237
|
+
keys: Object.keys(sam),
|
|
238
|
+
artifactType: sam.artifactType,
|
|
239
|
+
scanId: sam.scanId,
|
|
240
|
+
entitiesType: Array.isArray(sam.entities) ? 'array' : typeof sam.entities,
|
|
241
|
+
entitiesCount: sam.entities.length,
|
|
242
|
+
relationshipsType: Array.isArray(sam.relationships) ? 'array' : typeof sam.relationships,
|
|
243
|
+
relationshipsCount: sam.relationships.length,
|
|
244
|
+
};
|
|
245
|
+
appendLog(outputDir, `[SAM] Validator input: ${JSON.stringify(validatorInputSummary)}`);
|
|
146
246
|
console.log('[6/10] Validando `.skip-sam.json`');
|
|
147
247
|
const samValidation = validateSamArtifact(sam, {
|
|
148
248
|
currentScanId: scanId,
|
|
@@ -154,15 +254,51 @@ async function scanMode(opts) {
|
|
|
154
254
|
sam.validation = { valid: samValidation.valid, errors: samValidation.errors, warnings: samValidation.warnings };
|
|
155
255
|
if (!samValidation.valid) {
|
|
156
256
|
sam.status = sam.status === 'complete' ? 'partial' : sam.status;
|
|
257
|
+
writeJson(path.join(outputDir, 'scanner-diagnostics.json'), {
|
|
258
|
+
schemaVersion: '1.0.0',
|
|
259
|
+
artifactType: 'diagnostics',
|
|
260
|
+
scanId,
|
|
261
|
+
scannerVersion: CLI_VERSION,
|
|
262
|
+
projectRoot: workspaceRoot,
|
|
263
|
+
workspaceRoot,
|
|
264
|
+
applicationRoots: discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)),
|
|
265
|
+
applicationRoot,
|
|
266
|
+
filesDiscovered: fileManifest.files.length,
|
|
267
|
+
sourceFilesIncluded: fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length,
|
|
268
|
+
routeFilesDetected: routes.map((route) => route.physicalPath),
|
|
269
|
+
routesDetected: routes.length,
|
|
270
|
+
screensDetected: navigationMap.screens.length,
|
|
271
|
+
componentsDetected: components.length,
|
|
272
|
+
interactiveElementsDetected: navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0),
|
|
273
|
+
apisDetected: apiCalls.length,
|
|
274
|
+
flowsDetected: guidedFlows.length,
|
|
275
|
+
candidateEntities: routes.length + navigationMap.screens.length + components.length + apiCalls.length,
|
|
276
|
+
normalizedEntities: sam.entities.length,
|
|
277
|
+
discardedEntities: 0,
|
|
278
|
+
generatedEntityIds: sam.entities.filter((entity) => entity.id).length,
|
|
279
|
+
entitiesSentToValidator: sam.entities.length,
|
|
280
|
+
relationshipsSentToValidator: sam.relationships.length,
|
|
281
|
+
validatorInputSummary,
|
|
282
|
+
validationErrors: samValidation.errors,
|
|
283
|
+
});
|
|
284
|
+
writeJson(path.join(outputDir, 'scan-validation.json'), {
|
|
285
|
+
schemaVersion: '1.0.0',
|
|
286
|
+
artifactType: 'validation',
|
|
287
|
+
scanId,
|
|
288
|
+
valid: false,
|
|
289
|
+
generatedAt: new Date().toISOString(),
|
|
290
|
+
errors: samValidation.errors,
|
|
291
|
+
});
|
|
157
292
|
if (opts.validateSam)
|
|
158
293
|
throw new Error(`Falha ao validar .skip-sam.json:\n${samValidation.errors.join('\n')}`);
|
|
159
294
|
}
|
|
160
295
|
const samPath = writeSkipSamFile(outputDir, sam);
|
|
296
|
+
fs.rmSync(path.join(outputDir, '.skip-sam.invalid.json'), { force: true });
|
|
161
297
|
console.log('[7/10] Gerando auditoria WCAG');
|
|
162
298
|
const contentsByFile = {};
|
|
163
299
|
for (const s of navigationMap.screens) {
|
|
164
300
|
try {
|
|
165
|
-
contentsByFile[s.filePath] = fs.readFileSync(path.join(
|
|
301
|
+
contentsByFile[s.filePath] = fs.readFileSync(path.join(applicationRoot, s.filePath), 'utf-8');
|
|
166
302
|
}
|
|
167
303
|
catch {
|
|
168
304
|
contentsByFile[s.filePath] = '';
|
|
@@ -190,7 +326,7 @@ async function scanMode(opts) {
|
|
|
190
326
|
minor: summary.minor,
|
|
191
327
|
unknown: summary.unknown,
|
|
192
328
|
};
|
|
193
|
-
const history = appendHistory(
|
|
329
|
+
const history = appendHistory(applicationRoot, historyEntry);
|
|
194
330
|
const uniqueFiles = new Set([
|
|
195
331
|
...routes.map((r) => r.physicalPath),
|
|
196
332
|
...components.map((c) => c.filepath),
|
|
@@ -221,10 +357,27 @@ async function scanMode(opts) {
|
|
|
221
357
|
components: sam.stats.components,
|
|
222
358
|
coverage: sam.coverage.percentage,
|
|
223
359
|
};
|
|
224
|
-
|
|
225
|
-
|
|
360
|
+
rawReport.artifactType = 'report';
|
|
361
|
+
rawReport.schemaVersion = '1.0.0';
|
|
362
|
+
rawReport.generatedAt = new Date().toISOString();
|
|
363
|
+
rawReport.framework = signature.framework;
|
|
364
|
+
rawReport.language = signature.language;
|
|
365
|
+
rawReport.wcagSummary = summary;
|
|
366
|
+
const wcagPayload = {
|
|
367
|
+
schemaVersion: '1.0.0',
|
|
368
|
+
artifactType: 'wcag-audit',
|
|
369
|
+
scanId,
|
|
370
|
+
generatedAt: wcag.auditedAt,
|
|
371
|
+
status: 'complete',
|
|
372
|
+
findings: violations,
|
|
373
|
+
checks: { total: checks.total, passed: checks.passed, failed: checks.failed, incomplete: checks.needsReview, inapplicable: 0, needsReview: checks.needsReview },
|
|
374
|
+
summary,
|
|
375
|
+
violations,
|
|
376
|
+
score,
|
|
377
|
+
level,
|
|
378
|
+
rulesVersion: WCAG_RULES_VERSION,
|
|
379
|
+
};
|
|
226
380
|
writeJson(path.join(outputDir, '.skip-wcag-audit.json'), wcagPayload);
|
|
227
|
-
writeJson(path.join(outputDir, 'scan-file-manifest.json'), fileManifestPayload);
|
|
228
381
|
const samArtifact = buildScanArtifact(outputDir, '.skip-sam.json', 'semantic-map', scanId);
|
|
229
382
|
rawReport.relatedArtifacts = [
|
|
230
383
|
{
|
|
@@ -241,28 +394,46 @@ async function scanMode(opts) {
|
|
|
241
394
|
if (secretsFound > 0)
|
|
242
395
|
console.log(chalk.yellow(`${secretsFound} possível(eis) secret(s) mascarado(s) antes do envio.`));
|
|
243
396
|
writeJson(path.join(outputDir, '.skip-report.json'), report);
|
|
397
|
+
writeJson(path.join(outputDir, 'scanner-diagnostics.json'), {
|
|
398
|
+
schemaVersion: '1.0.0',
|
|
399
|
+
artifactType: 'diagnostics',
|
|
400
|
+
scanId,
|
|
401
|
+
scannerVersion: CLI_VERSION,
|
|
402
|
+
projectRoot: workspaceRoot,
|
|
403
|
+
workspaceRoot,
|
|
404
|
+
applicationRoots: discoverApplicationRoots(workspaceRoot).map((root) => safeRelative(workspaceRoot, root)),
|
|
405
|
+
applicationRoot,
|
|
406
|
+
filesDiscovered: fileManifest.files.length,
|
|
407
|
+
sourceFilesIncluded: fileManifest.files.filter((file) => /\.(tsx?|jsx?|html|vue|svelte|astro)$/.test(file.path)).length,
|
|
408
|
+
routeFilesDetected: routes.map((route) => route.physicalPath),
|
|
409
|
+
routesDetected: routes.length,
|
|
410
|
+
screensDetected: navigationMap.screens.length,
|
|
411
|
+
componentsDetected: components.length,
|
|
412
|
+
interactiveElementsDetected: navigationMap.screens.reduce((acc, screen) => acc + screen.actions.length, 0),
|
|
413
|
+
apisDetected: apiCalls.length,
|
|
414
|
+
flowsDetected: guidedFlows.length,
|
|
415
|
+
candidateEntities: routes.length + navigationMap.screens.length + components.length + apiCalls.length,
|
|
416
|
+
normalizedEntities: sam.entities.length,
|
|
417
|
+
discardedEntities: 0,
|
|
418
|
+
generatedEntityIds: sam.entities.filter((entity) => entity.id).length,
|
|
419
|
+
entitiesSentToValidator: sam.entities.length,
|
|
420
|
+
relationshipsSentToValidator: sam.relationships.length,
|
|
421
|
+
validatorInputSummary,
|
|
422
|
+
});
|
|
244
423
|
console.log('[8/10] Validando artefatos');
|
|
245
|
-
const
|
|
424
|
+
const firstArtifacts = [
|
|
246
425
|
buildScanArtifact(outputDir, '.skip-report.json', 'report', scanId),
|
|
247
426
|
samArtifact,
|
|
248
427
|
buildScanArtifact(outputDir, '.skip-wcag-audit.json', 'wcag-audit', scanId),
|
|
249
428
|
buildScanArtifact(outputDir, 'scan-file-manifest.json', 'file-manifest', scanId),
|
|
250
429
|
];
|
|
251
|
-
const uploadManifestPayload = {
|
|
252
|
-
schemaVersion: '1.0.0',
|
|
253
|
-
artifactType: 'upload-manifest',
|
|
254
|
-
scanId,
|
|
255
|
-
artifacts: baseArtifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
256
|
-
};
|
|
257
|
-
writeJson(path.join(outputDir, 'upload-manifest.json'), uploadManifestPayload);
|
|
258
|
-
const uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
|
|
259
430
|
const validationPayload = {
|
|
260
431
|
schemaVersion: '1.0.0',
|
|
261
432
|
artifactType: 'validation',
|
|
262
433
|
scanId,
|
|
263
434
|
valid: true,
|
|
264
435
|
generatedAt: new Date().toISOString(),
|
|
265
|
-
artifacts:
|
|
436
|
+
artifacts: firstArtifacts.map((artifact) => ({
|
|
266
437
|
filename: artifact.filename,
|
|
267
438
|
artifactType: artifact.artifactType,
|
|
268
439
|
valid: true,
|
|
@@ -270,7 +441,28 @@ async function scanMode(opts) {
|
|
|
270
441
|
})),
|
|
271
442
|
};
|
|
272
443
|
writeJson(path.join(outputDir, 'scan-validation.json'), validationPayload);
|
|
273
|
-
const
|
|
444
|
+
const validationArtifact = buildScanArtifact(outputDir, 'scan-validation.json', 'validation', scanId);
|
|
445
|
+
const provisionalArtifacts = [...firstArtifacts, validationArtifact];
|
|
446
|
+
const uploadManifestPayload = {
|
|
447
|
+
schemaVersion: '1.0.0',
|
|
448
|
+
artifactType: 'upload-manifest',
|
|
449
|
+
scanId,
|
|
450
|
+
createdAt: new Date().toISOString(),
|
|
451
|
+
expectedFileCount: REQUIRED_ARTIFACTS.length,
|
|
452
|
+
files: provisionalArtifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
453
|
+
artifacts: provisionalArtifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
454
|
+
};
|
|
455
|
+
writeJson(path.join(outputDir, 'upload-manifest.json'), uploadManifestPayload);
|
|
456
|
+
let uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
|
|
457
|
+
let artifacts = [...firstArtifacts, uploadArtifact, validationArtifact];
|
|
458
|
+
const finalUploadManifestPayload = {
|
|
459
|
+
...uploadManifestPayload,
|
|
460
|
+
files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
461
|
+
artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
462
|
+
};
|
|
463
|
+
writeJson(path.join(outputDir, 'upload-manifest.json'), finalUploadManifestPayload);
|
|
464
|
+
uploadArtifact = buildScanArtifact(outputDir, 'upload-manifest.json', 'upload-manifest', scanId);
|
|
465
|
+
artifacts = [...firstArtifacts, uploadArtifact, validationArtifact];
|
|
274
466
|
for (const artifact of artifacts) {
|
|
275
467
|
const validation = validateArtifactByType(artifact.absolutePath, artifact.artifactType, {
|
|
276
468
|
currentScanId: scanId,
|
|
@@ -287,8 +479,9 @@ async function scanMode(opts) {
|
|
|
287
479
|
console.log('[9/10] Enviando artefatos');
|
|
288
480
|
if (opts.send) {
|
|
289
481
|
const bundleManifestPayload = {
|
|
290
|
-
...
|
|
482
|
+
...finalUploadManifestPayload,
|
|
291
483
|
artifacts: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
484
|
+
files: artifacts.map(({ absolutePath, ...artifact }) => artifact),
|
|
292
485
|
};
|
|
293
486
|
const result = await uploadArtifactBundle(artifacts, opts.token, opts.url, bundleManifestPayload);
|
|
294
487
|
uploaded = true;
|