@code-pushup/utils 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 (103) hide show
  1. package/package.json +12 -7
  2. package/src/index.d.ts +30 -29
  3. package/src/index.js +30 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/diff.js +38 -0
  6. package/src/lib/diff.js.map +1 -0
  7. package/src/lib/errors.js +14 -0
  8. package/src/lib/errors.js.map +1 -0
  9. package/src/lib/execute-process.d.ts +0 -1
  10. package/src/lib/execute-process.js +101 -0
  11. package/src/lib/execute-process.js.map +1 -0
  12. package/src/lib/file-system.d.ts +5 -5
  13. package/src/lib/file-system.js +113 -0
  14. package/src/lib/file-system.js.map +1 -0
  15. package/src/lib/filter.js +10 -0
  16. package/src/lib/filter.js.map +1 -0
  17. package/src/lib/formatting.js +83 -0
  18. package/src/lib/formatting.js.map +1 -0
  19. package/src/lib/git/git.commits-and-tags.js +148 -0
  20. package/src/lib/git/git.commits-and-tags.js.map +1 -0
  21. package/src/lib/git/git.d.ts +2 -2
  22. package/src/lib/git/git.js +58 -0
  23. package/src/lib/git/git.js.map +1 -0
  24. package/src/lib/group-by-status.js +6 -0
  25. package/src/lib/group-by-status.js.map +1 -0
  26. package/src/lib/guards.d.ts +2 -0
  27. package/src/lib/guards.js +10 -0
  28. package/src/lib/guards.js.map +1 -0
  29. package/src/lib/log-results.js +28 -0
  30. package/src/lib/log-results.js.map +1 -0
  31. package/src/lib/logging.js +33 -0
  32. package/src/lib/logging.js.map +1 -0
  33. package/src/lib/merge-configs.js +104 -0
  34. package/src/lib/merge-configs.js.map +1 -0
  35. package/src/lib/progress.js +57 -0
  36. package/src/lib/progress.js.map +1 -0
  37. package/src/lib/reports/constants.js +19 -0
  38. package/src/lib/reports/constants.js.map +1 -0
  39. package/src/lib/reports/environment-type.d.ts +1 -1
  40. package/src/lib/reports/environment-type.js +17 -0
  41. package/src/lib/reports/environment-type.js.map +1 -0
  42. package/src/lib/reports/flatten-plugins.js +8 -0
  43. package/src/lib/reports/flatten-plugins.js.map +1 -0
  44. package/src/lib/reports/formatting.d.ts +1 -1
  45. package/src/lib/reports/formatting.js +105 -0
  46. package/src/lib/reports/formatting.js.map +1 -0
  47. package/src/lib/reports/generate-md-report-categoy-section.d.ts +1 -1
  48. package/src/lib/reports/generate-md-report-categoy-section.js +63 -0
  49. package/src/lib/reports/generate-md-report-categoy-section.js.map +1 -0
  50. package/src/lib/reports/generate-md-report.d.ts +1 -1
  51. package/src/lib/reports/generate-md-report.js +116 -0
  52. package/src/lib/reports/generate-md-report.js.map +1 -0
  53. package/src/lib/reports/generate-md-reports-diff-utils.d.ts +1 -1
  54. package/src/lib/reports/generate-md-reports-diff-utils.js +117 -0
  55. package/src/lib/reports/generate-md-reports-diff-utils.js.map +1 -0
  56. package/src/lib/reports/generate-md-reports-diff.d.ts +1 -1
  57. package/src/lib/reports/generate-md-reports-diff.js +158 -0
  58. package/src/lib/reports/generate-md-reports-diff.js.map +1 -0
  59. package/src/lib/reports/load-report.js +15 -0
  60. package/src/lib/reports/load-report.js.map +1 -0
  61. package/src/lib/reports/log-stdout-summary.d.ts +1 -1
  62. package/src/lib/reports/log-stdout-summary.js +102 -0
  63. package/src/lib/reports/log-stdout-summary.js.map +1 -0
  64. package/src/lib/reports/scoring.d.ts +1 -1
  65. package/src/lib/reports/scoring.js +78 -0
  66. package/src/lib/reports/scoring.js.map +1 -0
  67. package/src/lib/reports/sorting.d.ts +1 -1
  68. package/src/lib/reports/sorting.js +91 -0
  69. package/src/lib/reports/sorting.js.map +1 -0
  70. package/src/lib/reports/types.js +7 -0
  71. package/src/lib/reports/types.js.map +1 -0
  72. package/src/lib/reports/utils.d.ts +1 -1
  73. package/src/lib/reports/utils.js +209 -0
  74. package/src/lib/reports/utils.js.map +1 -0
  75. package/src/lib/semver.js +17 -0
  76. package/src/lib/semver.js.map +1 -0
  77. package/src/lib/text-formats/constants.js +14 -0
  78. package/src/lib/text-formats/constants.js.map +1 -0
  79. package/src/lib/text-formats/html/details.js +20 -0
  80. package/src/lib/text-formats/html/details.js.map +1 -0
  81. package/src/lib/text-formats/html/font-style.js +13 -0
  82. package/src/lib/text-formats/html/font-style.js.map +1 -0
  83. package/src/lib/text-formats/html/link.js +4 -0
  84. package/src/lib/text-formats/html/link.js.map +1 -0
  85. package/src/lib/text-formats/html/table.js +27 -0
  86. package/src/lib/text-formats/html/table.js.map +1 -0
  87. package/src/lib/text-formats/index.d.ts +5 -5
  88. package/src/lib/text-formats/index.js +14 -0
  89. package/src/lib/text-formats/index.js.map +1 -0
  90. package/src/lib/text-formats/table.js +92 -0
  91. package/src/lib/text-formats/table.js.map +1 -0
  92. package/src/lib/transform.d.ts +1 -2
  93. package/src/lib/transform.js +111 -0
  94. package/src/lib/transform.js.map +1 -0
  95. package/src/lib/types.d.ts +3 -3
  96. package/src/lib/types.js +2 -0
  97. package/src/lib/types.js.map +1 -0
  98. package/src/lib/verbose-utils.js +20 -0
  99. package/src/lib/verbose-utils.js.map +1 -0
  100. package/src/lib/zod-validation.d.ts +3 -0
  101. package/src/lib/zod-validation.js +22 -0
  102. package/src/lib/zod-validation.js.map +1 -0
  103. package/index.js +0 -2980
@@ -0,0 +1,148 @@
1
+ import { simpleGit } from 'simple-git';
2
+ import { commitSchema } from '@code-pushup/models';
3
+ import { isSemver } from '../semver.js';
4
+ export async function getLatestCommit(git = simpleGit()) {
5
+ const log = await git.log({
6
+ maxCount: 1,
7
+ // git log -1 --pretty=format:"%H %s %an %aI" - See: https://git-scm.com/docs/pretty-formats
8
+ format: { hash: '%H', message: '%s', author: '%an', date: '%aI' },
9
+ });
10
+ return commitSchema.parse(log.latest);
11
+ }
12
+ export async function getCurrentBranchOrTag(git = simpleGit()) {
13
+ return ((await git.branch().then(r => r.current)) ||
14
+ // If no current branch, try to get the tag
15
+ // @TODO use simple git
16
+ (await git
17
+ .raw(['describe', '--tags', '--exact-match'])
18
+ .then(out => out.trim())));
19
+ }
20
+ function validateFilter({ from, to }) {
21
+ if (to && !from) {
22
+ // throw more user-friendly error instead of:
23
+ // fatal: ambiguous argument '...a': unknown revision or path not in the working tree.
24
+ // Use '--' to separate paths from revisions, like this:
25
+ // 'git <command> [<revision>...] -- [<file>...]'
26
+ throw new Error(`filter needs the "from" option defined to accept the "to" option.\n`);
27
+ }
28
+ }
29
+ export function filterLogs(allTags, opt) {
30
+ if (!opt) {
31
+ return allTags;
32
+ }
33
+ validateFilter(opt);
34
+ const { from, to, maxCount } = opt;
35
+ const finIndex = (tagName, fallback) => {
36
+ const idx = allTags.indexOf(tagName ?? '');
37
+ if (idx !== -1) {
38
+ return idx;
39
+ }
40
+ return fallback;
41
+ };
42
+ const fromIndex = finIndex(from, 0);
43
+ const toIndex = finIndex(to, undefined);
44
+ return allTags
45
+ .slice(fromIndex, toIndex ? toIndex + 1 : toIndex)
46
+ .slice(0, maxCount ?? undefined);
47
+ }
48
+ export async function getHashFromTag(tag, git = simpleGit()) {
49
+ const tagDetails = await git.show(['--no-patch', '--format=%H', tag]);
50
+ const hash = tagDetails.trim(); // Remove quotes and trim whitespace
51
+ return {
52
+ hash: hash.split('\n').at(-1) ?? '',
53
+ message: tag,
54
+ };
55
+ }
56
+ export async function getSemverTags(opt = {}, git = simpleGit()) {
57
+ validateFilter(opt);
58
+ const { targetBranch, ...options } = opt;
59
+ // make sure we have a target branch
60
+ // eslint-disable-next-line functional/no-let
61
+ let currentBranch;
62
+ if (targetBranch) {
63
+ currentBranch = await getCurrentBranchOrTag(git);
64
+ await git.checkout(targetBranch);
65
+ }
66
+ // Fetch all tags merged into the target branch
67
+ const tagsRaw = await git.tag([
68
+ '--merged',
69
+ targetBranch ?? (await getCurrentBranchOrTag(git)),
70
+ ]);
71
+ const allTags = tagsRaw
72
+ .split(/\n/)
73
+ .map(tag => tag.trim())
74
+ .filter(Boolean)
75
+ .filter(isSemver);
76
+ const relevantTags = filterLogs(allTags, options);
77
+ const tagsWithHashes = await Promise.all(relevantTags.map(tag => getHashFromTag(tag, git)));
78
+ if (currentBranch) {
79
+ await git.checkout(currentBranch);
80
+ }
81
+ return tagsWithHashes;
82
+ }
83
+ /**
84
+ * `getHashes` returns a list of commit hashes. Internally it uses `git.log()` to determine the commits within a range.
85
+ * The amount can be limited to a maximum number of commits specified by `maxCount`.
86
+ * With `from` and `to`, you can specify a range of commits.
87
+ *
88
+ * **NOTE:**
89
+ * In Git, specifying a range with two dots (`from..to`) selects commits that are reachable from `to` but not from `from`.
90
+ * Essentially, it shows the commits that are in `to` but not in `from`, excluding the commits unique to `from`.
91
+ *
92
+ * Example:
93
+ *
94
+ * Let's consider the following commit history:
95
+ *
96
+ * A---B---C---D---E (main)
97
+ *
98
+ * Using `git log B..D`, you would get the commits C and D:
99
+ *
100
+ * C---D
101
+ *
102
+ * This is because these commits are reachable from D but not from B.
103
+ *
104
+ * ASCII Representation:
105
+ *
106
+ * Main Branch: A---B---C---D---E
107
+ * \ \
108
+ * \ +--- Commits included in `git log B..D`
109
+ * \
110
+ * +--- Excluded by the `from` parameter
111
+ *
112
+ * With `simple-git`, when you specify a `from` and `to` range like this:
113
+ *
114
+ * git.log({ from: 'B', to: 'D' });
115
+ *
116
+ * It interprets it similarly, selecting commits between B and D, inclusive of D but exclusive of B.
117
+ * For `git.log({ from: 'B', to: 'D' })` or `git log B..D`, commits C and D are selected.
118
+ *
119
+ * @param options Object containing `from`, `to`, and optionally `maxCount` to specify the commit range and limit.
120
+ * @param git The `simple-git` instance used to execute Git commands.
121
+ */
122
+ export async function getHashes(options = {}, git = simpleGit()) {
123
+ const { targetBranch, from, to, maxCount, ...opt } = options;
124
+ validateFilter({ from, to });
125
+ // Ensure you are on the correct branch
126
+ // eslint-disable-next-line functional/no-let
127
+ let currentBranch;
128
+ if (targetBranch) {
129
+ currentBranch = await getCurrentBranchOrTag(git);
130
+ await git.checkout(targetBranch);
131
+ }
132
+ const logs = await git.log({
133
+ ...opt,
134
+ format: {
135
+ hash: '%H',
136
+ message: '%s',
137
+ },
138
+ from,
139
+ to,
140
+ maxCount,
141
+ });
142
+ // Ensure you are back to the initial branch
143
+ if (targetBranch) {
144
+ await git.checkout(currentBranch);
145
+ }
146
+ return [...logs.all];
147
+ }
148
+ //# sourceMappingURL=git.commits-and-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.commits-and-tags.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/git/git.commits-and-tags.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { type StatusResult } from 'simple-git';
2
2
  export declare function getGitRoot(git?: import("simple-git").SimpleGit): Promise<string>;
3
- export declare function formatGitPath(path: string, gitRoot: string): string;
4
- export declare function toGitPath(path: string, git?: import("simple-git").SimpleGit): Promise<string>;
3
+ export declare function formatGitPath(filePath: string, gitRoot: string): string;
4
+ export declare function toGitPath(filePath: string, git?: import("simple-git").SimpleGit): Promise<string>;
5
5
  export declare class GitStatusError extends Error {
6
6
  static ignoredProps: Set<string>;
7
7
  static getReducedStatus(status: StatusResult): {
@@ -0,0 +1,58 @@
1
+ import path from 'node:path';
2
+ import { simpleGit } from 'simple-git';
3
+ import { ui } from '../logging.js';
4
+ import { toUnixPath } from '../transform.js';
5
+ export function getGitRoot(git = simpleGit()) {
6
+ return git.revparse('--show-toplevel');
7
+ }
8
+ export function formatGitPath(filePath, gitRoot) {
9
+ const absolutePath = path.isAbsolute(filePath)
10
+ ? filePath
11
+ : path.join(process.cwd(), filePath);
12
+ const relativePath = path.relative(gitRoot, absolutePath);
13
+ return toUnixPath(relativePath);
14
+ }
15
+ export async function toGitPath(filePath, git = simpleGit()) {
16
+ const gitRoot = await getGitRoot(git);
17
+ return formatGitPath(filePath, gitRoot);
18
+ }
19
+ export class GitStatusError extends Error {
20
+ static ignoredProps = new Set(['current', 'tracking']);
21
+ static getReducedStatus(status) {
22
+ return Object.fromEntries(Object.entries(status)
23
+ .filter(([key]) => !this.ignoredProps.has(key))
24
+ .filter((entry) => {
25
+ const value = entry[1];
26
+ if (value == null) {
27
+ return false;
28
+ }
29
+ if (Array.isArray(value) && value.length === 0) {
30
+ return false;
31
+ }
32
+ if (typeof value === 'number' && value === 0) {
33
+ return false;
34
+ }
35
+ return !(typeof value === 'boolean' && !value);
36
+ }));
37
+ }
38
+ constructor(status) {
39
+ super(`Working directory needs to be clean before we you can proceed. Commit your local changes or stash them: \n ${JSON.stringify(GitStatusError.getReducedStatus(status), null, 2)}`);
40
+ }
41
+ }
42
+ export async function guardAgainstLocalChanges(git = simpleGit()) {
43
+ const status = await git.status(['-s']);
44
+ if (status.files.length > 0) {
45
+ throw new GitStatusError(status);
46
+ }
47
+ }
48
+ export async function safeCheckout(branchOrHash, forceCleanStatus = false, git = simpleGit()) {
49
+ // git requires a clean history to check out a branch
50
+ if (forceCleanStatus) {
51
+ await git.raw(['reset', '--hard']);
52
+ await git.clean(['f', 'd']);
53
+ ui().logger.info(`git status cleaned`);
54
+ }
55
+ await guardAgainstLocalChanges(git);
56
+ await git.checkout(branchOrHash);
57
+ }
58
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/git/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export function groupByStatus(results) {
2
+ return results.reduce((acc, result) => result.status === 'fulfilled'
3
+ ? { ...acc, fulfilled: [...acc.fulfilled, result] }
4
+ : { ...acc, rejected: [...acc.rejected, result] }, { fulfilled: [], rejected: [] });
5
+ }
6
+ //# sourceMappingURL=group-by-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-by-status.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/group-by-status.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAI,OAAkC;IAIjE,OAAO,OAAO,CAAC,MAAM,CAInB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CACd,MAAM,CAAC,MAAM,KAAK,WAAW;QAC3B,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;QACnD,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EACrD,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAChC,CAAC;AACJ,CAAC"}
@@ -1,2 +1,4 @@
1
+ import type { ExcludeNullableProps } from './types.js';
1
2
  export declare function isPromiseFulfilledResult<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T>;
2
3
  export declare function isPromiseRejectedResult(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult;
4
+ export declare function hasNoNullableProps<T extends object>(obj: T): obj is ExcludeNullableProps<T>;
@@ -0,0 +1,10 @@
1
+ export function isPromiseFulfilledResult(result) {
2
+ return result.status === 'fulfilled';
3
+ }
4
+ export function isPromiseRejectedResult(result) {
5
+ return result.status === 'rejected';
6
+ }
7
+ export function hasNoNullableProps(obj) {
8
+ return Object.values(obj).every(value => value != null);
9
+ }
10
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/guards.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,MAA+B;IAE/B,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAqC;IAErC,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAM;IAEN,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { isPromiseFulfilledResult, isPromiseRejectedResult } from './guards.js';
2
+ import { ui } from './logging.js';
3
+ export function logMultipleResults(results, messagePrefix, succeededTransform, failedTransform) {
4
+ if (succeededTransform) {
5
+ const succeededResults = results.filter(isPromiseFulfilledResult);
6
+ logPromiseResults(succeededResults, `${messagePrefix} successfully: `, succeededTransform);
7
+ }
8
+ if (failedTransform) {
9
+ const failedResults = results.filter(isPromiseRejectedResult);
10
+ logPromiseResults(failedResults, `${messagePrefix} failed: `, failedTransform);
11
+ }
12
+ }
13
+ export function logPromiseResults(results, logMessage, getMsg) {
14
+ if (results.length > 0) {
15
+ const log = results[0]?.status === 'fulfilled'
16
+ ? (m) => {
17
+ ui().logger.success(m);
18
+ }
19
+ : (m) => {
20
+ ui().logger.warning(m);
21
+ };
22
+ log(logMessage);
23
+ results.forEach(result => {
24
+ log(getMsg(result));
25
+ });
26
+ }
27
+ }
28
+ //# sourceMappingURL=log-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-results.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/log-results.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,aAAqB,EACrB,kBAAkE,EAClE,eAA2D;IAE3D,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAElE,iBAAiB,CACf,gBAAgB,EAChB,GAAG,aAAa,iBAAiB,EACjC,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAE9D,iBAAiB,CACf,aAAa,EACb,GAAG,aAAa,WAAW,EAC3B,eAAe,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAE/B,OAAY,EAAE,UAAkB,EAAE,MAA6B;IAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GACP,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,WAAW;YAChC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE;gBACZ,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACH,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE;gBACZ,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC,CAAC;QAER,GAAG,CAAC,UAAU,CAAC,CAAC;QAChB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import isaacs_cliui from '@isaacs/cliui';
2
+ import { cliui } from '@poppinss/cliui';
3
+ import { underline } from 'ansis';
4
+ import { TERMINAL_WIDTH } from './reports/constants.js';
5
+ // eslint-disable-next-line import/no-mutable-exports,functional/no-let
6
+ export let singletonUiInstance;
7
+ export function ui() {
8
+ if (singletonUiInstance === undefined) {
9
+ singletonUiInstance = cliui();
10
+ }
11
+ return {
12
+ ...singletonUiInstance,
13
+ row: args => {
14
+ logListItem(args);
15
+ },
16
+ };
17
+ }
18
+ // eslint-disable-next-line functional/no-let
19
+ let singletonisaacUi;
20
+ export function logListItem(args) {
21
+ if (singletonisaacUi === undefined) {
22
+ singletonisaacUi = isaacs_cliui({ width: TERMINAL_WIDTH });
23
+ }
24
+ singletonisaacUi.div(...args);
25
+ const content = singletonisaacUi.toString();
26
+ // eslint-disable-next-line functional/immutable-data
27
+ singletonisaacUi.rows = [];
28
+ singletonUiInstance?.logger.log(content);
29
+ }
30
+ export function link(text) {
31
+ return underline.blueBright(text);
32
+ }
33
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/logging.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAkBxD,uEAAuE;AACvE,MAAM,CAAC,IAAI,mBAA0C,CAAC;AAEtD,MAAM,UAAU,EAAE;IAChB,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,mBAAmB,GAAG,KAAK,EAAE,CAAC;IAChC,CAAC;IACD,OAAO;QACL,GAAG,mBAAmB;QACtB,GAAG,EAAE,IAAI,CAAC,EAAE;YACV,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6CAA6C;AAC7C,IAAI,gBAAgC,CAAC;AACrC,MAAM,UAAU,WAAW,CAAC,IAA8B;IACxD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,gBAAgB,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;IAC5C,qDAAqD;IACrD,gBAAgB,CAAC,IAAI,GAAG,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,104 @@
1
+ export function mergeConfigs(config, ...configs) {
2
+ return configs.reduce((acc, obj) => ({
3
+ ...acc,
4
+ ...mergeCategories(acc.categories, obj.categories),
5
+ ...mergePlugins(acc.plugins, obj.plugins),
6
+ ...mergePersist(acc.persist, obj.persist),
7
+ ...mergeUpload(acc.upload, obj.upload),
8
+ }), config);
9
+ }
10
+ function mergeCategories(a, b) {
11
+ if (!a && !b) {
12
+ return {};
13
+ }
14
+ const mergedMap = new Map();
15
+ const addToMap = (categories) => {
16
+ categories.forEach(newObject => {
17
+ if (mergedMap.has(newObject.slug)) {
18
+ const existingObject = mergedMap.get(newObject.slug);
19
+ mergedMap.set(newObject.slug, {
20
+ ...existingObject,
21
+ ...newObject,
22
+ refs: mergeByUniqueCategoryRefCombination(existingObject?.refs, newObject.refs),
23
+ });
24
+ }
25
+ else {
26
+ mergedMap.set(newObject.slug, newObject);
27
+ }
28
+ });
29
+ };
30
+ if (a) {
31
+ addToMap(a);
32
+ }
33
+ if (b) {
34
+ addToMap(b);
35
+ }
36
+ // Convert the map back to an array
37
+ return { categories: [...mergedMap.values()] };
38
+ }
39
+ function mergePlugins(a, b) {
40
+ if (!a && !b) {
41
+ return { plugins: [] };
42
+ }
43
+ const mergedMap = new Map();
44
+ const addToMap = (plugins) => {
45
+ plugins.forEach(newObject => {
46
+ mergedMap.set(newObject.slug, newObject);
47
+ });
48
+ };
49
+ if (a) {
50
+ addToMap(a);
51
+ }
52
+ if (b) {
53
+ addToMap(b);
54
+ }
55
+ return { plugins: [...mergedMap.values()] };
56
+ }
57
+ function mergePersist(a, b) {
58
+ if (!a && !b) {
59
+ return {};
60
+ }
61
+ if (a) {
62
+ return b ? { persist: { ...a, ...b } } : {};
63
+ }
64
+ else {
65
+ return { persist: b };
66
+ }
67
+ }
68
+ function mergeByUniqueCategoryRefCombination(a, b) {
69
+ const map = new Map();
70
+ const addToMap = (refs) => {
71
+ refs.forEach(ref => {
72
+ const uniqueIdentification = `${ref.type}:${ref.plugin}:${ref.slug}`;
73
+ if (map.has(uniqueIdentification)) {
74
+ map.set(uniqueIdentification, {
75
+ ...map.get(uniqueIdentification),
76
+ ...ref,
77
+ });
78
+ }
79
+ else {
80
+ map.set(uniqueIdentification, ref);
81
+ }
82
+ });
83
+ };
84
+ // Add objects from both arrays to the map
85
+ if (a) {
86
+ addToMap(a);
87
+ }
88
+ if (b) {
89
+ addToMap(b);
90
+ }
91
+ return [...map.values()];
92
+ }
93
+ function mergeUpload(a, b) {
94
+ if (!a && !b) {
95
+ return {};
96
+ }
97
+ if (a) {
98
+ return b ? { upload: { ...a, ...b } } : {};
99
+ }
100
+ else {
101
+ return { upload: b };
102
+ }
103
+ }
104
+ //# sourceMappingURL=merge-configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-configs.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/merge-configs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { black, bold, gray, green } from 'ansis';
2
+ import { MultiProgressBars } from 'multi-progress-bars';
3
+ import { TERMINAL_WIDTH } from './reports/constants.js';
4
+ export const barStyles = {
5
+ active: (s) => green(s),
6
+ done: (s) => gray(s),
7
+ idle: (s) => gray(s),
8
+ };
9
+ export const messageStyles = {
10
+ active: (s) => black(s),
11
+ done: (s) => bold.green(s),
12
+ idle: (s) => gray(s),
13
+ };
14
+ // eslint-disable-next-line functional/no-let
15
+ let mpb;
16
+ export function getSingletonProgressBars(options) {
17
+ if (!mpb) {
18
+ mpb = new MultiProgressBars({
19
+ progressWidth: TERMINAL_WIDTH,
20
+ initMessage: '',
21
+ border: true,
22
+ ...options,
23
+ });
24
+ }
25
+ return mpb;
26
+ }
27
+ export function getProgressBar(taskName) {
28
+ const tasks = getSingletonProgressBars();
29
+ // Initialize progress bar if not set
30
+ tasks.addTask(taskName, {
31
+ type: 'percentage',
32
+ percentage: 0,
33
+ message: '',
34
+ barTransformFn: barStyles.idle,
35
+ });
36
+ return {
37
+ incrementInSteps: (numPlugins) => {
38
+ tasks.incrementTask(taskName, {
39
+ percentage: 1 / numPlugins,
40
+ barTransformFn: barStyles.active,
41
+ });
42
+ },
43
+ updateTitle: (title) => {
44
+ tasks.updateTask(taskName, {
45
+ message: title,
46
+ barTransformFn: barStyles.active,
47
+ });
48
+ },
49
+ endProgress: (message = '') => {
50
+ tasks.done(taskName, {
51
+ message: messageStyles.done(message),
52
+ barTransformFn: barStyles.done,
53
+ });
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAoB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD,MAAM,CAAC,MAAM,SAAS,GAAiB;IACrC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;CAC7B,CAAC;AASF,6CAA6C;AAC7C,IAAI,GAAsB,CAAC;AAE3B,MAAM,UAAU,wBAAwB,CACtC,OAA8B;IAE9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,IAAI,iBAAiB,CAAC;YAC1B,aAAa,EAAE,cAAc;YAC7B,WAAW,EAAE,EAAE;YACf,MAAM,EAAE,IAAI;YACZ,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAG,wBAAwB,EAAE,CAAC;IAEzC,qCAAqC;IACrC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;QACtB,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,SAAS,CAAC,IAAI;KAC/B,CAAC,CAAC;IAEH,OAAO;QACL,gBAAgB,EAAE,CAAC,UAAkB,EAAE,EAAE;YACvC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC5B,UAAU,EAAE,CAAC,GAAG,UAAU;gBAC1B,cAAc,EAAE,SAAS,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;QACD,WAAW,EAAE,CAAC,KAAa,EAAE,EAAE;YAC7B,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACzB,OAAO,EAAE,KAAK;gBACd,cAAc,EAAE,SAAS,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;QACD,WAAW,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACnB,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;gBACpC,cAAc,EAAE,SAAS,CAAC,IAAI;aAC/B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ // https://stackoverflow.com/questions/4651012/why-is-the-default-terminal-width-80-characters/4651037#4651037
2
+ export const TERMINAL_WIDTH = 80;
3
+ export const SCORE_COLOR_RANGE = {
4
+ /* eslint-disable @typescript-eslint/no-magic-numbers */
5
+ GREEN_MIN: 0.9,
6
+ YELLOW_MIN: 0.5,
7
+ /* eslint-enable @typescript-eslint/no-magic-numbers */
8
+ };
9
+ export const FOOTER_PREFIX = 'Made with ❤ by'; // replace ❤️ with ❤, because ❤️ has output issues in terminal
10
+ export const CODE_PUSHUP_DOMAIN = 'code-pushup.dev';
11
+ export const README_LINK = 'https://github.com/code-pushup/cli#readme';
12
+ export const REPORT_HEADLINE_TEXT = 'Code PushUp Report';
13
+ export const CODE_PUSHUP_UNICODE_LOGO = '<✓>';
14
+ export const REPORT_RAW_OVERVIEW_TABLE_HEADERS = [
15
+ 'Category',
16
+ 'Score',
17
+ 'Audits',
18
+ ];
19
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/reports/constants.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,wDAAwD;IACxD,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,GAAG;IACf,uDAAuD;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,8DAA8D;AAC7G,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AACpD,MAAM,CAAC,MAAM,WAAW,GAAG,2CAA2C,CAAC;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAEzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,UAAU;IACV,OAAO;IACP,QAAQ;CACT,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type EnvironmentType } from './types';
1
+ import { type EnvironmentType } from './types.js';
2
2
  export declare function getEnvironmentType(): EnvironmentType;
3
3
  export declare function getGitHubBaseUrl(): string;
4
4
  export declare function getGitLabBaseUrl(): string;
@@ -0,0 +1,17 @@
1
+ import { SUPPORTED_ENVIRONMENTS } from './types.js';
2
+ const environmentChecks = {
3
+ vscode: () => process.env['TERM_PROGRAM'] === 'vscode',
4
+ github: () => process.env['GITHUB_ACTIONS'] === 'true',
5
+ gitlab: () => process.env['GITLAB_CI'] === 'true',
6
+ other: () => true,
7
+ };
8
+ export function getEnvironmentType() {
9
+ return (SUPPORTED_ENVIRONMENTS.find(env => environmentChecks[env]()) ?? 'other');
10
+ }
11
+ export function getGitHubBaseUrl() {
12
+ return `${process.env['GITHUB_SERVER_URL']}/${process.env['GITHUB_REPOSITORY']}/blob/${process.env['GITHUB_SHA']}`;
13
+ }
14
+ export function getGitLabBaseUrl() {
15
+ return `${process.env['CI_SERVER_URL']}/${process.env['CI_PROJECT_PATH']}/-/blob/${process.env['CI_COMMIT_SHA']}`;
16
+ }
17
+ //# sourceMappingURL=environment-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-type.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/reports/environment-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,iBAAiB,GAA2C;IAChE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,QAAQ;IACtD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM;IACtD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,MAAM;IACjD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;CAClB,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,CACL,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;AACpH,CAAC"}
@@ -0,0 +1,8 @@
1
+ // generic type param infers ScoredGroup if ScoredReport provided
2
+ export function listGroupsFromAllPlugins(report) {
3
+ return report.plugins.flatMap(plugin => plugin.groups?.map(group => ({ plugin, group })) ?? []);
4
+ }
5
+ export function listAuditsFromAllPlugins(report) {
6
+ return report.plugins.flatMap(plugin => plugin.audits.map(audit => ({ plugin, audit })));
7
+ }
8
+ //# sourceMappingURL=flatten-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten-plugins.js","sourceRoot":"","sources":["../../../../../../packages/utils/src/lib/reports/flatten-plugins.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CACtC,MAAS;IAKT,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CACjE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAS;IAKT,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CACrC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type HeadingLevel, type InlineText, MarkdownDocument } from 'build-md';
2
2
  import type { AuditReport, SourceFileLocation, Table } from '@code-pushup/models';
3
- import type { MdReportOptions } from './types';
3
+ import type { MdReportOptions } from './types.js';
4
4
  export declare function tableSection(tableData: Table, options?: {
5
5
  level?: HeadingLevel;
6
6
  }): MarkdownDocument | null;