@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.
Files changed (40) hide show
  1. package/package.json +10 -8
  2. package/src/index.d.ts +11 -11
  3. package/src/index.js +10 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/collect-and-persist.d.ts +1 -1
  6. package/src/lib/collect-and-persist.js +21 -0
  7. package/src/lib/collect-and-persist.js.map +1 -0
  8. package/src/lib/compare.js +96 -0
  9. package/src/lib/compare.js.map +1 -0
  10. package/src/lib/history.d.ts +1 -1
  11. package/src/lib/history.js +38 -0
  12. package/src/lib/history.js.map +1 -0
  13. package/src/lib/implementation/collect.d.ts +1 -1
  14. package/src/lib/implementation/collect.js +25 -0
  15. package/src/lib/implementation/collect.js.map +1 -0
  16. package/src/lib/implementation/compare-scorables.js +117 -0
  17. package/src/lib/implementation/compare-scorables.js.map +1 -0
  18. package/src/lib/implementation/execute-plugin.js +126 -0
  19. package/src/lib/implementation/execute-plugin.js.map +1 -0
  20. package/src/lib/implementation/persist.js +56 -0
  21. package/src/lib/implementation/persist.js.map +1 -0
  22. package/src/lib/implementation/read-rc-file.d.ts +3 -0
  23. package/src/lib/implementation/read-rc-file.js +54 -0
  24. package/src/lib/implementation/read-rc-file.js.map +1 -0
  25. package/src/lib/implementation/report-to-gql.js +133 -0
  26. package/src/lib/implementation/report-to-gql.js.map +1 -0
  27. package/src/lib/implementation/runner.js +34 -0
  28. package/src/lib/implementation/runner.js.map +1 -0
  29. package/src/lib/load-portal-client.js +11 -0
  30. package/src/lib/load-portal-client.js.map +1 -0
  31. package/src/lib/merge-diffs.js +33 -0
  32. package/src/lib/merge-diffs.js.map +1 -0
  33. package/src/lib/normalize.js +31 -0
  34. package/src/lib/normalize.js.map +1 -0
  35. package/src/lib/types.js +2 -0
  36. package/src/lib/types.js.map +1 -0
  37. package/src/lib/upload.d.ts +1 -1
  38. package/src/lib/upload.js +34 -0
  39. package/src/lib/upload.js.map +1 -0
  40. 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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/core/src/lib/types.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import type { PersistConfig, UploadConfig } from '@code-pushup/models';
2
- import type { GlobalOptions } from './types';
2
+ import type { GlobalOptions } from './types.js';
3
3
  export type UploadOptions = {
4
4
  upload?: UploadConfig;
5
5
  } & {
@@ -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"}