@code-pushup/core 0.56.0 → 0.57.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/package.json +10 -8
- package/src/index.d.ts +11 -11
- package/src/index.js +10 -0
- package/src/index.js.map +1 -0
- package/src/lib/collect-and-persist.d.ts +1 -1
- package/src/lib/collect-and-persist.js +21 -0
- package/src/lib/collect-and-persist.js.map +1 -0
- package/src/lib/compare.js +96 -0
- package/src/lib/compare.js.map +1 -0
- package/src/lib/history.d.ts +1 -1
- package/src/lib/history.js +38 -0
- package/src/lib/history.js.map +1 -0
- package/src/lib/implementation/collect.d.ts +1 -1
- package/src/lib/implementation/collect.js +25 -0
- package/src/lib/implementation/collect.js.map +1 -0
- package/src/lib/implementation/compare-scorables.js +117 -0
- package/src/lib/implementation/compare-scorables.js.map +1 -0
- package/src/lib/implementation/execute-plugin.js +126 -0
- package/src/lib/implementation/execute-plugin.js.map +1 -0
- package/src/lib/implementation/persist.js +56 -0
- package/src/lib/implementation/persist.js.map +1 -0
- package/src/lib/implementation/read-rc-file.d.ts +3 -0
- package/src/lib/implementation/read-rc-file.js +54 -0
- package/src/lib/implementation/read-rc-file.js.map +1 -0
- package/src/lib/implementation/report-to-gql.js +133 -0
- package/src/lib/implementation/report-to-gql.js.map +1 -0
- package/src/lib/implementation/runner.js +34 -0
- package/src/lib/implementation/runner.js.map +1 -0
- package/src/lib/load-portal-client.js +11 -0
- package/src/lib/load-portal-client.js.map +1 -0
- package/src/lib/merge-diffs.js +33 -0
- package/src/lib/merge-diffs.js.map +1 -0
- package/src/lib/normalize.js +31 -0
- package/src/lib/normalize.js.map +1 -0
- package/src/lib/types.js +2 -0
- package/src/lib/types.js.map +1 -0
- package/src/lib/upload.d.ts +1 -1
- package/src/lib/upload.js +34 -0
- package/src/lib/upload.js.map +1 -0
- package/index.js +0 -3249
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { bold } from 'ansis';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fromError, isZodErrorLike } from 'zod-validation-error';
|
|
4
|
+
import { CONFIG_FILE_NAME, SUPPORTED_CONFIG_FILE_FORMATS, coreConfigSchema, } from '@code-pushup/models';
|
|
5
|
+
import { fileExists, importModule, zodErrorMessageBuilder, } from '@code-pushup/utils';
|
|
6
|
+
export class ConfigPathError extends Error {
|
|
7
|
+
constructor(configPath) {
|
|
8
|
+
super(`Provided path '${configPath}' is not valid.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ConfigValidationError extends Error {
|
|
12
|
+
constructor(configPath, message) {
|
|
13
|
+
const relativePath = path.relative(process.cwd(), configPath);
|
|
14
|
+
super(`Failed parsing core config in ${bold(relativePath)}.\n\n${message}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function readRcByPath(filepath, tsconfig) {
|
|
18
|
+
if (filepath.length === 0) {
|
|
19
|
+
throw new Error('The path to the configuration file is empty.');
|
|
20
|
+
}
|
|
21
|
+
if (!(await fileExists(filepath))) {
|
|
22
|
+
throw new ConfigPathError(filepath);
|
|
23
|
+
}
|
|
24
|
+
const cfg = await importModule({ filepath, tsconfig, format: 'esm' });
|
|
25
|
+
try {
|
|
26
|
+
return coreConfigSchema.parse(cfg);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const validationError = fromError(error, {
|
|
30
|
+
messageBuilder: zodErrorMessageBuilder,
|
|
31
|
+
});
|
|
32
|
+
throw isZodErrorLike(error)
|
|
33
|
+
? new ConfigValidationError(filepath, validationError.message)
|
|
34
|
+
: error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function autoloadRc(tsconfig) {
|
|
38
|
+
// eslint-disable-next-line functional/no-let
|
|
39
|
+
let ext = '';
|
|
40
|
+
// eslint-disable-next-line functional/no-loop-statements
|
|
41
|
+
for (const extension of SUPPORTED_CONFIG_FILE_FORMATS) {
|
|
42
|
+
const filePath = `${CONFIG_FILE_NAME}.${extension}`;
|
|
43
|
+
const exists = await fileExists(filePath);
|
|
44
|
+
if (exists) {
|
|
45
|
+
ext = extension;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!ext) {
|
|
50
|
+
throw new Error(`No file ${CONFIG_FILE_NAME}.(${SUPPORTED_CONFIG_FILE_FORMATS.join('|')}) present in ${process.cwd()}`);
|
|
51
|
+
}
|
|
52
|
+
return readRcByPath(path.join(process.cwd(), `${CONFIG_FILE_NAME}.${ext}`), tsconfig);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=read-rc-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-rc-file.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/implementation/read-rc-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,gBAAgB,EAEhB,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,UAAkB;QAC5B,KAAK,CAAC,kBAAkB,UAAU,iBAAiB,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,UAAkB,EAAE,OAAe;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC9D,KAAK,CAAC,iCAAiC,IAAI,CAAC,YAAY,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,QAAiB;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,EAAE;YACvC,cAAc,EAAE,sBAAsB;SACvC,CAAC,CAAC;QACH,MAAM,cAAc,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,IAAI,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;YAC9D,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAiB;IAChD,6CAA6C;IAC7C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,yDAAyD;IACzD,KAAK,MAAM,SAAS,IAAI,6BAA6B,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,GAAG,gBAAgB,IAAI,SAAS,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,GAAG,SAAS,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,WAAW,gBAAgB,KAAK,6BAA6B,CAAC,IAAI,CAChE,GAAG,CACJ,gBAAgB,OAAO,CAAC,GAAG,EAAE,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,gBAAgB,IAAI,GAAG,EAAE,CAAC,EACtD,QAAQ,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export function reportToGQL(report) {
|
|
2
|
+
return {
|
|
3
|
+
packageName: report.packageName,
|
|
4
|
+
packageVersion: report.version,
|
|
5
|
+
commandStartDate: report.date,
|
|
6
|
+
commandDuration: report.duration,
|
|
7
|
+
plugins: report.plugins.map(pluginToGQL),
|
|
8
|
+
categories: (report.categories ?? []).map(categoryToGQL),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function pluginToGQL(plugin) {
|
|
12
|
+
return {
|
|
13
|
+
slug: plugin.slug,
|
|
14
|
+
title: plugin.title,
|
|
15
|
+
icon: plugin.icon,
|
|
16
|
+
description: plugin.description,
|
|
17
|
+
docsUrl: plugin.docsUrl,
|
|
18
|
+
audits: plugin.audits.map(auditToGQL),
|
|
19
|
+
groups: plugin.groups?.map(groupToGQL),
|
|
20
|
+
packageName: plugin.packageName,
|
|
21
|
+
packageVersion: plugin.version,
|
|
22
|
+
runnerDuration: plugin.duration,
|
|
23
|
+
runnerStartDate: plugin.date,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function groupToGQL(group) {
|
|
27
|
+
return {
|
|
28
|
+
slug: group.slug,
|
|
29
|
+
title: group.title,
|
|
30
|
+
description: group.description,
|
|
31
|
+
refs: group.refs.map(ref => ({ slug: ref.slug, weight: ref.weight })),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function auditToGQL(audit) {
|
|
35
|
+
const { slug, title, description, docsUrl, score, value, displayValue: formattedValue, details, } = audit;
|
|
36
|
+
const { issues, table } = details ?? {};
|
|
37
|
+
return {
|
|
38
|
+
slug,
|
|
39
|
+
title,
|
|
40
|
+
description,
|
|
41
|
+
docsUrl,
|
|
42
|
+
score,
|
|
43
|
+
value,
|
|
44
|
+
formattedValue,
|
|
45
|
+
...(details && {
|
|
46
|
+
details: {
|
|
47
|
+
...(issues && { issues: issues.map(issueToGQL) }),
|
|
48
|
+
...(table && { tables: [tableToGQL(table)] }),
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function issueToGQL(issue) {
|
|
54
|
+
return {
|
|
55
|
+
message: issue.message,
|
|
56
|
+
severity: issueSeverityToGQL(issue.severity),
|
|
57
|
+
...(issue.source?.file && {
|
|
58
|
+
sourceType: safeEnum('SourceCode'),
|
|
59
|
+
sourceFilePath: issue.source.file,
|
|
60
|
+
sourceStartLine: issue.source.position?.startLine,
|
|
61
|
+
sourceStartColumn: issue.source.position?.startColumn,
|
|
62
|
+
sourceEndLine: issue.source.position?.endLine,
|
|
63
|
+
sourceEndColumn: issue.source.position?.endColumn,
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function tableToGQL(table) {
|
|
68
|
+
return {
|
|
69
|
+
...(table.title && { title: table.title }),
|
|
70
|
+
...(table.columns?.length && {
|
|
71
|
+
columns: table.columns.map((column) => typeof column === 'string'
|
|
72
|
+
? { alignment: tableAlignmentToGQL(column) }
|
|
73
|
+
: {
|
|
74
|
+
key: column.key,
|
|
75
|
+
label: column.label,
|
|
76
|
+
alignment: column.align && tableAlignmentToGQL(column.align),
|
|
77
|
+
}),
|
|
78
|
+
}),
|
|
79
|
+
rows: table.rows.map((row) => Array.isArray(row)
|
|
80
|
+
? row.map(content => ({ content: content?.toString() ?? '' }))
|
|
81
|
+
: Object.entries(row).map(([key, content]) => ({
|
|
82
|
+
key,
|
|
83
|
+
content: content?.toString() ?? '',
|
|
84
|
+
}))),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function categoryToGQL(category) {
|
|
88
|
+
return {
|
|
89
|
+
slug: category.slug,
|
|
90
|
+
title: category.title,
|
|
91
|
+
description: category.description,
|
|
92
|
+
isBinary: category.isBinary,
|
|
93
|
+
refs: category.refs.map(ref => ({
|
|
94
|
+
plugin: ref.plugin,
|
|
95
|
+
type: categoryRefTypeToGQL(ref.type),
|
|
96
|
+
weight: ref.weight,
|
|
97
|
+
slug: ref.slug,
|
|
98
|
+
})),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function categoryRefTypeToGQL(type) {
|
|
102
|
+
switch (type) {
|
|
103
|
+
case 'audit':
|
|
104
|
+
return safeEnum('Audit');
|
|
105
|
+
case 'group':
|
|
106
|
+
return safeEnum('Group');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function issueSeverityToGQL(severity) {
|
|
110
|
+
switch (severity) {
|
|
111
|
+
case 'info':
|
|
112
|
+
return safeEnum('Info');
|
|
113
|
+
case 'error':
|
|
114
|
+
return safeEnum('Error');
|
|
115
|
+
case 'warning':
|
|
116
|
+
return safeEnum('Warning');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function tableAlignmentToGQL(alignment) {
|
|
120
|
+
switch (alignment) {
|
|
121
|
+
case 'left':
|
|
122
|
+
return safeEnum('Left');
|
|
123
|
+
case 'center':
|
|
124
|
+
return safeEnum('Center');
|
|
125
|
+
case 'right':
|
|
126
|
+
return safeEnum('Right');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// validates enum value string, workaround for nominal typing
|
|
130
|
+
function safeEnum(value) {
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=report-to-gql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-to-gql.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/implementation/report-to-gql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { calcDuration, executeProcess, readJsonFile } from '@code-pushup/utils';
|
|
3
|
+
export async function executeRunnerConfig(cfg, onProgress) {
|
|
4
|
+
const { args, command, outputFile, outputTransform } = cfg;
|
|
5
|
+
// execute process
|
|
6
|
+
const { duration, date } = await executeProcess({
|
|
7
|
+
command,
|
|
8
|
+
args,
|
|
9
|
+
observer: { onStdout: onProgress },
|
|
10
|
+
});
|
|
11
|
+
// read process output from file system and parse it
|
|
12
|
+
const outputs = await readJsonFile(path.join(process.cwd(), outputFile));
|
|
13
|
+
// transform unknownAuditOutputs to auditOutputs
|
|
14
|
+
const audits = outputTransform ? await outputTransform(outputs) : outputs;
|
|
15
|
+
// create runner result
|
|
16
|
+
return {
|
|
17
|
+
duration,
|
|
18
|
+
date,
|
|
19
|
+
audits,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function executeRunnerFunction(runner, onProgress) {
|
|
23
|
+
const date = new Date().toISOString();
|
|
24
|
+
const start = performance.now();
|
|
25
|
+
// execute plugin runner
|
|
26
|
+
const audits = await runner(onProgress);
|
|
27
|
+
// create runner result
|
|
28
|
+
return {
|
|
29
|
+
date,
|
|
30
|
+
duration: calcDuration(start),
|
|
31
|
+
audits,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../../../packages/core/src/lib/implementation/runner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQhF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAiB,EACjB,UAAuB;IAEvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;IAE3D,kBAAkB;IAClB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,OAAO;QACP,IAAI;QACJ,QAAQ,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;KACnC,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAEzE,gDAAgD;IAChD,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1E,uBAAuB;IACvB,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,UAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAExC,uBAAuB;IACvB,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QAC7B,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ui } from '@code-pushup/utils';
|
|
2
|
+
export async function loadPortalClient() {
|
|
3
|
+
try {
|
|
4
|
+
return await import('@code-pushup/portal-client');
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
ui().logger.error('Optional peer dependency @code-pushup/portal-client is not available. Make sure it is installed to enable upload functionality.');
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=load-portal-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-portal-client.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/load-portal-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAGpC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CACf,iIAAiI,CAClI,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { reportsDiffSchema } from '@code-pushup/models';
|
|
4
|
+
import { ensureDirectoryExists, generateMdReportsDiffForMonorepo, isPromiseFulfilledResult, isPromiseRejectedResult, readJsonFile, stringifyError, ui, } from '@code-pushup/utils';
|
|
5
|
+
export async function mergeDiffs(files, persistConfig) {
|
|
6
|
+
const results = await Promise.allSettled(files.map(async (file) => {
|
|
7
|
+
const json = await readJsonFile(file).catch((error) => {
|
|
8
|
+
throw new Error(`Failed to read JSON file ${file} - ${stringifyError(error)}`);
|
|
9
|
+
});
|
|
10
|
+
const result = await reportsDiffSchema.safeParseAsync(json);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
throw new Error(`Invalid reports diff in ${file} - ${result.error.message}`);
|
|
13
|
+
}
|
|
14
|
+
return { ...result.data, file };
|
|
15
|
+
}));
|
|
16
|
+
results.filter(isPromiseRejectedResult).forEach(({ reason }) => {
|
|
17
|
+
ui().logger.warning(`Skipped invalid report diff - ${stringifyError(reason)}`);
|
|
18
|
+
});
|
|
19
|
+
const diffs = results
|
|
20
|
+
.filter(isPromiseFulfilledResult)
|
|
21
|
+
.map(({ value }) => value);
|
|
22
|
+
const labeledDiffs = diffs.map(diff => ({
|
|
23
|
+
...diff,
|
|
24
|
+
label: diff.label || path.basename(path.dirname(diff.file)), // fallback is parent folder name
|
|
25
|
+
}));
|
|
26
|
+
const markdown = generateMdReportsDiffForMonorepo(labeledDiffs);
|
|
27
|
+
const { outputDir, filename } = persistConfig;
|
|
28
|
+
const outputPath = path.join(outputDir, `${filename}-diff.md`);
|
|
29
|
+
await ensureDirectoryExists(outputDir);
|
|
30
|
+
await writeFile(outputPath, markdown);
|
|
31
|
+
return outputPath;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=merge-diffs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-diffs.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/merge-diffs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAsB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,wBAAwB,EACxB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,EAAE,GACH,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAe,EACf,aAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC7D,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAC9D,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAC5D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC,CACH,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7D,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CACjB,iCAAiC,cAAc,CAAC,MAAM,CAAC,EAAE,CAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,OAAO;SAClB,MAAM,CAAC,wBAAwB,CAAC;SAChC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,GAAG,IAAI;QACP,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,iCAAiC;KAC/F,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,gCAAgC,CAAC,YAAY,CAAC,CAAC;IAEhE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,UAAU,CAAC,CAAC;IAC/D,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { formatGitPath, getGitRoot } from '@code-pushup/utils';
|
|
2
|
+
export function normalizeIssue(issue, gitRoot) {
|
|
3
|
+
const { source, ...issueWithoutSource } = issue;
|
|
4
|
+
// early exit to avoid issue object cloning.
|
|
5
|
+
return source == null
|
|
6
|
+
? issue
|
|
7
|
+
: {
|
|
8
|
+
...issueWithoutSource,
|
|
9
|
+
source: {
|
|
10
|
+
...source,
|
|
11
|
+
file: formatGitPath(source.file, gitRoot),
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export async function normalizeAuditOutputs(audits) {
|
|
16
|
+
const gitRoot = await getGitRoot();
|
|
17
|
+
return audits.map(audit => {
|
|
18
|
+
if (audit.details?.issues == null ||
|
|
19
|
+
audit.details.issues.every(issue => issue.source == null)) {
|
|
20
|
+
return audit;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
...audit,
|
|
24
|
+
details: {
|
|
25
|
+
...audit.details,
|
|
26
|
+
issues: audit.details.issues.map(issue => normalizeIssue(issue, gitRoot)),
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/normalize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,OAAe;IAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC;IAChD,4CAA4C;IAC5C,OAAO,MAAM,IAAI,IAAI;QACnB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC;YACE,GAAG,kBAAkB;YACrB,MAAM,EAAE;gBACN,GAAG,MAAM;gBACT,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;aAC1C;SACF,CAAC;AACR,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxB,IACE,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI;YAC7B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,EACzD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO;YACL,GAAG,KAAK;YACR,OAAO,EAAE;gBACP,GAAG,KAAK,CAAC,OAAO;gBAChB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAC/B;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/src/lib/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/types.ts"],"names":[],"mappings":""}
|
package/src/lib/upload.d.ts
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { loadReport } from '@code-pushup/utils';
|
|
2
|
+
import { reportToGQL } from './implementation/report-to-gql.js';
|
|
3
|
+
import { loadPortalClient } from './load-portal-client.js';
|
|
4
|
+
/**
|
|
5
|
+
* Uploads collected audits to the portal
|
|
6
|
+
* @param options
|
|
7
|
+
* @param uploadFn
|
|
8
|
+
*/
|
|
9
|
+
export async function upload(options) {
|
|
10
|
+
if (options.upload == null) {
|
|
11
|
+
throw new Error('Upload configuration is not set.');
|
|
12
|
+
}
|
|
13
|
+
const portalClient = await loadPortalClient();
|
|
14
|
+
if (!portalClient) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const { uploadToPortal } = portalClient;
|
|
18
|
+
const { apiKey, server, organization, project, timeout } = options.upload;
|
|
19
|
+
const report = await loadReport({
|
|
20
|
+
...options.persist,
|
|
21
|
+
format: 'json',
|
|
22
|
+
});
|
|
23
|
+
if (!report.commit) {
|
|
24
|
+
throw new Error('Commit must be linked in order to upload report');
|
|
25
|
+
}
|
|
26
|
+
const data = {
|
|
27
|
+
organization,
|
|
28
|
+
project,
|
|
29
|
+
commit: report.commit.hash,
|
|
30
|
+
...reportToGQL(report),
|
|
31
|
+
};
|
|
32
|
+
return uploadToPortal({ apiKey, server, data, timeout });
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1E,MAAM,MAAM,GAAW,MAAM,UAAU,CAAC;QACtC,GAAG,OAAO,CAAC,OAAO;QAClB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAgC;QACxC,YAAY;QACZ,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QAC1B,GAAG,WAAW,CAAC,MAAM,CAAC;KACvB,CAAC;IAEF,OAAO,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|