@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/utils",
3
- "version": "0.56.0",
3
+ "version": "0.57.0",
4
4
  "description": "Low-level utilities (helper functions, etc.) used by Code PushUp CLI",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/code-pushup/cli/tree/main/packages/utils#readme",
@@ -23,10 +23,11 @@
23
23
  "access": "public"
24
24
  },
25
25
  "type": "module",
26
- "main": "./index.js",
27
- "types": "./src/index.d.ts",
26
+ "engines": {
27
+ "node": ">=17.0.0"
28
+ },
28
29
  "dependencies": {
29
- "@code-pushup/models": "0.56.0",
30
+ "@code-pushup/models": "0.57.0",
30
31
  "@isaacs/cliui": "^8.0.2",
31
32
  "@poppinss/cliui": "^6.4.0",
32
33
  "ansis": "^3.3.0",
@@ -35,6 +36,10 @@
35
36
  "esbuild": "^0.19.2",
36
37
  "multi-progress-bars": "^5.0.3",
37
38
  "semver": "^7.6.0",
38
- "simple-git": "^3.20.0"
39
- }
40
- }
39
+ "simple-git": "^3.20.0",
40
+ "zod-validation-error": "^3.4.0"
41
+ },
42
+ "module": "./src/index.js",
43
+ "main": "./src/index.js",
44
+ "types": "./src/index.d.ts"
45
+ }
package/src/index.d.ts CHANGED
@@ -1,30 +1,31 @@
1
1
  export { exists } from '@code-pushup/models';
2
- export { comparePairs, matchArrayItemsByKey, type Diff } from './lib/diff';
3
- export { stringifyError } from './lib/errors';
4
- export { ProcessError, executeProcess, type ProcessConfig, type ProcessObserver, type ProcessResult, } from './lib/execute-process';
5
- export { crawlFileSystem, directoryExists, ensureDirectoryExists, fileExists, filePathToCliArg, findLineNumberInText, findNearestFile, importModule, logMultipleFileResults, pluginWorkDir, projectToFilename, readJsonFile, readTextFile, removeDirectoryIfExists, type CrawlFileSystemOptions, type FileResult, type MultipleFileResults, } from './lib/file-system';
6
- export { filterItemRefsBy } from './lib/filter';
7
- export { formatBytes, formatDuration, pluralize, pluralizeToken, slugify, truncateDescription, truncateIssueMessage, truncateText, truncateTitle, } from './lib/formatting';
8
- export { formatGitPath, getGitRoot, guardAgainstLocalChanges, safeCheckout, toGitPath, } from './lib/git/git';
9
- export { getCurrentBranchOrTag, getHashFromTag, getHashes, getLatestCommit, getSemverTags, type LogResult, } from './lib/git/git.commits-and-tags';
10
- export { groupByStatus } from './lib/group-by-status';
11
- export { isPromiseFulfilledResult, isPromiseRejectedResult, } from './lib/guards';
12
- export { logMultipleResults } from './lib/log-results';
13
- export { link, ui, type CliUi, type Column } from './lib/logging';
14
- export { mergeConfigs } from './lib/merge-configs';
15
- export { getProgressBar, type ProgressBar } from './lib/progress';
16
- export { CODE_PUSHUP_DOMAIN, CODE_PUSHUP_UNICODE_LOGO, FOOTER_PREFIX, README_LINK, TERMINAL_WIDTH, } from './lib/reports/constants';
17
- export { listAuditsFromAllPlugins, listGroupsFromAllPlugins, } from './lib/reports/flatten-plugins';
18
- export { generateMdReport } from './lib/reports/generate-md-report';
19
- export { generateMdReportsDiff, generateMdReportsDiffForMonorepo, } from './lib/reports/generate-md-reports-diff';
20
- export { loadReport } from './lib/reports/load-report';
21
- export { logStdoutSummary } from './lib/reports/log-stdout-summary';
22
- export { scoreReport } from './lib/reports/scoring';
23
- export { sortReport } from './lib/reports/sorting';
24
- export type { ScoredCategoryConfig, ScoredGroup, ScoredReport, } from './lib/reports/types';
25
- export { calcDuration, compareIssueSeverity, formatReportScore, } from './lib/reports/utils';
26
- export { isSemver, normalizeSemver, sortSemvers } from './lib/semver';
27
- export * from './lib/text-formats';
28
- export { capitalize, countOccurrences, distinct, factorOf, fromJsonLines, objectFromEntries, objectToCliArgs, objectToEntries, objectToKeys, toArray, toJsonLines, toNumberPrecision, toOrdinal, toUnixNewlines, toUnixPath, type CliArgsObject, } from './lib/transform';
29
- export type { ExcludeNullFromPropertyTypes, ExtractArray, ExtractArrays, ItemOrArray, Prettify, WithRequired, } from './lib/types';
30
- export { verboseUtils } from './lib/verbose-utils';
2
+ export { comparePairs, matchArrayItemsByKey, type Diff } from './lib/diff.js';
3
+ export { stringifyError } from './lib/errors.js';
4
+ export { ProcessError, executeProcess, type ProcessConfig, type ProcessObserver, type ProcessResult, } from './lib/execute-process.js';
5
+ export { crawlFileSystem, directoryExists, ensureDirectoryExists, fileExists, filePathToCliArg, findLineNumberInText, findNearestFile, importModule, logMultipleFileResults, pluginWorkDir, projectToFilename, readJsonFile, readTextFile, removeDirectoryIfExists, type CrawlFileSystemOptions, type FileResult, type MultipleFileResults, } from './lib/file-system.js';
6
+ export { filterItemRefsBy } from './lib/filter.js';
7
+ export { formatBytes, formatDuration, pluralize, pluralizeToken, slugify, truncateDescription, truncateIssueMessage, truncateText, truncateTitle, } from './lib/formatting.js';
8
+ export { getCurrentBranchOrTag, getHashFromTag, getHashes, getLatestCommit, getSemverTags, type LogResult, } from './lib/git/git.commits-and-tags.js';
9
+ export { formatGitPath, getGitRoot, guardAgainstLocalChanges, safeCheckout, toGitPath, } from './lib/git/git.js';
10
+ export { groupByStatus } from './lib/group-by-status.js';
11
+ export { isPromiseFulfilledResult, isPromiseRejectedResult, hasNoNullableProps, } from './lib/guards.js';
12
+ export { logMultipleResults } from './lib/log-results.js';
13
+ export { link, ui, type CliUi, type Column } from './lib/logging.js';
14
+ export { mergeConfigs } from './lib/merge-configs.js';
15
+ export { getProgressBar, type ProgressBar } from './lib/progress.js';
16
+ export { CODE_PUSHUP_DOMAIN, CODE_PUSHUP_UNICODE_LOGO, FOOTER_PREFIX, README_LINK, TERMINAL_WIDTH, } from './lib/reports/constants.js';
17
+ export { listAuditsFromAllPlugins, listGroupsFromAllPlugins, } from './lib/reports/flatten-plugins.js';
18
+ export { generateMdReport } from './lib/reports/generate-md-report.js';
19
+ export { generateMdReportsDiff, generateMdReportsDiffForMonorepo, } from './lib/reports/generate-md-reports-diff.js';
20
+ export { loadReport } from './lib/reports/load-report.js';
21
+ export { logStdoutSummary } from './lib/reports/log-stdout-summary.js';
22
+ export { scoreReport } from './lib/reports/scoring.js';
23
+ export { sortReport } from './lib/reports/sorting.js';
24
+ export type { ScoredCategoryConfig, ScoredGroup, ScoredReport, } from './lib/reports/types.js';
25
+ export { calcDuration, compareIssueSeverity, formatReportScore, } from './lib/reports/utils.js';
26
+ export { isSemver, normalizeSemver, sortSemvers } from './lib/semver.js';
27
+ export * from './lib/text-formats/index.js';
28
+ export { capitalize, countOccurrences, distinct, factorOf, fromJsonLines, objectFromEntries, objectToCliArgs, objectToEntries, objectToKeys, toArray, toJsonLines, toNumberPrecision, toOrdinal, toUnixNewlines, toUnixPath, type CliArgsObject, } from './lib/transform.js';
29
+ export type { ExcludeNullableProps, ExtractArray, ExtractArrays, ItemOrArray, Prettify, WithRequired, } from './lib/types.js';
30
+ export { verboseUtils } from './lib/verbose-utils.js';
31
+ export { zodErrorMessageBuilder } from './lib/zod-validation.js';
package/src/index.js ADDED
@@ -0,0 +1,30 @@
1
+ export { exists } from '@code-pushup/models';
2
+ export { comparePairs, matchArrayItemsByKey } from './lib/diff.js';
3
+ export { stringifyError } from './lib/errors.js';
4
+ export { ProcessError, executeProcess, } from './lib/execute-process.js';
5
+ export { crawlFileSystem, directoryExists, ensureDirectoryExists, fileExists, filePathToCliArg, findLineNumberInText, findNearestFile, importModule, logMultipleFileResults, pluginWorkDir, projectToFilename, readJsonFile, readTextFile, removeDirectoryIfExists, } from './lib/file-system.js';
6
+ export { filterItemRefsBy } from './lib/filter.js';
7
+ export { formatBytes, formatDuration, pluralize, pluralizeToken, slugify, truncateDescription, truncateIssueMessage, truncateText, truncateTitle, } from './lib/formatting.js';
8
+ export { getCurrentBranchOrTag, getHashFromTag, getHashes, getLatestCommit, getSemverTags, } from './lib/git/git.commits-and-tags.js';
9
+ export { formatGitPath, getGitRoot, guardAgainstLocalChanges, safeCheckout, toGitPath, } from './lib/git/git.js';
10
+ export { groupByStatus } from './lib/group-by-status.js';
11
+ export { isPromiseFulfilledResult, isPromiseRejectedResult, hasNoNullableProps, } from './lib/guards.js';
12
+ export { logMultipleResults } from './lib/log-results.js';
13
+ export { link, ui } from './lib/logging.js';
14
+ export { mergeConfigs } from './lib/merge-configs.js';
15
+ export { getProgressBar } from './lib/progress.js';
16
+ export { CODE_PUSHUP_DOMAIN, CODE_PUSHUP_UNICODE_LOGO, FOOTER_PREFIX, README_LINK, TERMINAL_WIDTH, } from './lib/reports/constants.js';
17
+ export { listAuditsFromAllPlugins, listGroupsFromAllPlugins, } from './lib/reports/flatten-plugins.js';
18
+ export { generateMdReport } from './lib/reports/generate-md-report.js';
19
+ export { generateMdReportsDiff, generateMdReportsDiffForMonorepo, } from './lib/reports/generate-md-reports-diff.js';
20
+ export { loadReport } from './lib/reports/load-report.js';
21
+ export { logStdoutSummary } from './lib/reports/log-stdout-summary.js';
22
+ export { scoreReport } from './lib/reports/scoring.js';
23
+ export { sortReport } from './lib/reports/sorting.js';
24
+ export { calcDuration, compareIssueSeverity, formatReportScore, } from './lib/reports/utils.js';
25
+ export { isSemver, normalizeSemver, sortSemvers } from './lib/semver.js';
26
+ export * from './lib/text-formats/index.js';
27
+ export { capitalize, countOccurrences, distinct, factorOf, fromJsonLines, objectFromEntries, objectToCliArgs, objectToEntries, objectToKeys, toArray, toJsonLines, toNumberPrecision, toOrdinal, toUnixNewlines, toUnixPath, } from './lib/transform.js';
28
+ export { verboseUtils } from './lib/verbose-utils.js';
29
+ export { zodErrorMessageBuilder } from './lib/zod-validation.js';
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAa,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,cAAc,GAIf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,uBAAuB,GAIxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,cAAc,EACd,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,eAAe,EACf,aAAa,GAEd,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,YAAY,EACZ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,EAAE,EAA2B,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAoB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EACL,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMtD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,UAAU,GAEX,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,38 @@
1
+ export function matchArrayItemsByKey({ before, after, key, }) {
2
+ const pairs = [];
3
+ const added = [];
4
+ const afterKeys = new Set();
5
+ const keyFn = typeof key === 'function' ? key : (item) => item[key];
6
+ // eslint-disable-next-line functional/no-loop-statements
7
+ for (const afterItem of after) {
8
+ const afterKey = keyFn(afterItem);
9
+ afterKeys.add(afterKey);
10
+ const match = before.find(beforeItem => keyFn(beforeItem) === afterKey);
11
+ if (match) {
12
+ // eslint-disable-next-line functional/immutable-data
13
+ pairs.push({ before: match, after: afterItem });
14
+ }
15
+ else {
16
+ // eslint-disable-next-line functional/immutable-data
17
+ added.push(afterItem);
18
+ }
19
+ }
20
+ const removed = before.filter(beforeItem => !afterKeys.has(keyFn(beforeItem)));
21
+ return {
22
+ pairs,
23
+ added,
24
+ removed,
25
+ };
26
+ }
27
+ export function comparePairs(pairs, equalsFn) {
28
+ return pairs.reduce((acc, pair) => ({
29
+ ...acc,
30
+ ...(equalsFn(pair)
31
+ ? { unchanged: [...acc.unchanged, pair.after] }
32
+ : { changed: [...acc.changed, pair] }),
33
+ }), {
34
+ changed: [],
35
+ unchanged: [],
36
+ });
37
+ }
38
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/diff.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,oBAAoB,CAAI,EACtC,MAAM,EACN,KAAK,EACL,GAAG,GACmD;IACtD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAQ,EAAE,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAW,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvE,yDAAyD;IACzD,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC;QACxE,IAAI,KAAK,EAAE,CAAC;YACV,qDAAqD;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,UAAU,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAChD,CAAC;IAEF,OAAO;QACL,KAAK;QACL,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAgB,EAChB,QAAoC;IAEpC,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,GAAG,GAAG;QACN,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;YAC/C,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;KACzC,CAAC,EACF;QACE,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;KACd,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export function stringifyError(error) {
2
+ // TODO: special handling for ZodError instances
3
+ if (error instanceof Error) {
4
+ if (error.name === 'Error' || error.message.startsWith(error.name)) {
5
+ return error.message;
6
+ }
7
+ return `${error.name}: ${error.message}`;
8
+ }
9
+ if (typeof error === 'string') {
10
+ return error;
11
+ }
12
+ return JSON.stringify(error);
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,gDAAgD;IAChD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { type ChildProcess, type SpawnOptionsWithStdioTuple, type StdioPipe } from 'node:child_process';
3
2
  /**
4
3
  * Represents the process result.
@@ -0,0 +1,101 @@
1
+ import { spawn, } from 'node:child_process';
2
+ import { calcDuration } from './reports/utils.js';
3
+ /**
4
+ * Error class for process errors.
5
+ * Contains additional information about the process result.
6
+ * @category Error
7
+ * @public
8
+ * @class
9
+ * @extends Error
10
+ * @example
11
+ * const result = await executeProcess({})
12
+ * .catch((error) => {
13
+ * if (error instanceof ProcessError) {
14
+ * console.error(error.code);
15
+ * console.error(error.stderr);
16
+ * console.error(error.stdout);
17
+ * }
18
+ * });
19
+ *
20
+ */
21
+ export class ProcessError extends Error {
22
+ code;
23
+ stderr;
24
+ stdout;
25
+ constructor(result) {
26
+ super(result.stderr);
27
+ this.code = result.code;
28
+ this.stderr = result.stderr;
29
+ this.stdout = result.stdout;
30
+ }
31
+ }
32
+ /**
33
+ * Executes a process and returns a promise with the result as `ProcessResult`.
34
+ *
35
+ * @example
36
+ *
37
+ * // sync process execution
38
+ * const result = await executeProcess({
39
+ * command: 'node',
40
+ * args: ['--version']
41
+ * });
42
+ *
43
+ * console.info(result);
44
+ *
45
+ * // async process execution
46
+ * const result = await executeProcess({
47
+ * command: 'node',
48
+ * args: ['download-data.js'],
49
+ * observer: {
50
+ * onStdout: updateProgress,
51
+ * error: handleError,
52
+ * complete: cleanLogs,
53
+ * }
54
+ * });
55
+ *
56
+ * console.info(result);
57
+ *
58
+ * @param cfg - see {@link ProcessConfig}
59
+ */
60
+ export function executeProcess(cfg) {
61
+ const { command, args, observer, ignoreExitCode = false, ...options } = cfg;
62
+ const { onStdout, onStderr, onError, onComplete } = observer ?? {};
63
+ const date = new Date().toISOString();
64
+ const start = performance.now();
65
+ return new Promise((resolve, reject) => {
66
+ // shell:true tells Windows to use shell command for spawning a child process
67
+ const spawnedProcess = spawn(command, args ?? [], {
68
+ shell: true,
69
+ windowsHide: true,
70
+ ...options,
71
+ });
72
+ // eslint-disable-next-line functional/no-let
73
+ let stdout = '';
74
+ // eslint-disable-next-line functional/no-let
75
+ let stderr = '';
76
+ spawnedProcess.stdout.on('data', data => {
77
+ stdout += String(data);
78
+ onStdout?.(String(data), spawnedProcess);
79
+ });
80
+ spawnedProcess.stderr.on('data', data => {
81
+ stderr += String(data);
82
+ onStderr?.(String(data), spawnedProcess);
83
+ });
84
+ spawnedProcess.on('error', err => {
85
+ stderr += err.toString();
86
+ });
87
+ spawnedProcess.on('close', code => {
88
+ const timings = { date, duration: calcDuration(start) };
89
+ if (code === 0 || ignoreExitCode) {
90
+ onComplete?.();
91
+ resolve({ code, stdout, stderr, ...timings });
92
+ }
93
+ else {
94
+ const errorMsg = new ProcessError({ code, stdout, stderr, ...timings });
95
+ onError?.(errorMsg);
96
+ reject(errorMsg);
97
+ }
98
+ });
99
+ });
100
+ }
101
+ //# sourceMappingURL=execute-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-process.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/execute-process.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { type Options } from 'bundle-require';
2
- export declare function readTextFile(path: string): Promise<string>;
3
- export declare function readJsonFile<T = unknown>(path: string): Promise<T>;
4
- export declare function fileExists(path: string): Promise<boolean>;
5
- export declare function directoryExists(path: string): Promise<boolean>;
2
+ export declare function readTextFile(filePath: string): Promise<string>;
3
+ export declare function readJsonFile<T = unknown>(filePath: string): Promise<T>;
4
+ export declare function fileExists(filePath: string): Promise<boolean>;
5
+ export declare function directoryExists(filePath: string): Promise<boolean>;
6
6
  export declare function ensureDirectoryExists(baseDir: string): Promise<void>;
7
7
  export declare function removeDirectoryIfExists(dir: string): Promise<void>;
8
8
  export type FileResult = readonly [string] | readonly [string, number];
@@ -18,5 +18,5 @@ export type CrawlFileSystemOptions<T> = {
18
18
  export declare function crawlFileSystem<T = string>(options: CrawlFileSystemOptions<T>): Promise<T[]>;
19
19
  export declare function findNearestFile(fileNames: string[], cwd?: string): Promise<string | undefined>;
20
20
  export declare function findLineNumberInText(content: string, pattern: string): number | null;
21
- export declare function filePathToCliArg(path: string): string;
21
+ export declare function filePathToCliArg(filePath: string): string;
22
22
  export declare function projectToFilename(project: string): string;
@@ -0,0 +1,113 @@
1
+ import { bold, gray } from 'ansis';
2
+ import { bundleRequire } from 'bundle-require';
3
+ import { mkdir, readFile, readdir, rm, stat } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { formatBytes } from './formatting.js';
6
+ import { logMultipleResults } from './log-results.js';
7
+ import { ui } from './logging.js';
8
+ export async function readTextFile(filePath) {
9
+ const buffer = await readFile(filePath);
10
+ return buffer.toString();
11
+ }
12
+ export async function readJsonFile(filePath) {
13
+ const text = await readTextFile(filePath);
14
+ return JSON.parse(text);
15
+ }
16
+ export async function fileExists(filePath) {
17
+ try {
18
+ const stats = await stat(filePath);
19
+ return stats.isFile();
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ export async function directoryExists(filePath) {
26
+ try {
27
+ const stats = await stat(filePath);
28
+ return stats.isDirectory();
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ export async function ensureDirectoryExists(baseDir) {
35
+ try {
36
+ await mkdir(baseDir, { recursive: true });
37
+ return;
38
+ }
39
+ catch (error) {
40
+ ui().logger.info(error.message);
41
+ if (error.code !== 'EEXIST') {
42
+ throw error;
43
+ }
44
+ }
45
+ }
46
+ export async function removeDirectoryIfExists(dir) {
47
+ if (await directoryExists(dir)) {
48
+ await rm(dir, { recursive: true, force: true });
49
+ }
50
+ }
51
+ export function logMultipleFileResults(fileResults, messagePrefix) {
52
+ const succeededTransform = (result) => {
53
+ const [fileName, size] = result.value;
54
+ const formattedSize = size ? ` (${gray(formatBytes(size))})` : '';
55
+ return `- ${bold(fileName)}${formattedSize}`;
56
+ };
57
+ const failedTransform = (result) => `- ${bold(result.reason)}`;
58
+ logMultipleResults(fileResults, messagePrefix, succeededTransform, failedTransform);
59
+ }
60
+ export async function importModule(options) {
61
+ const { mod } = await bundleRequire(options);
62
+ if (typeof mod === 'object' && 'default' in mod) {
63
+ return mod.default;
64
+ }
65
+ return mod;
66
+ }
67
+ export function pluginWorkDir(slug) {
68
+ return path.join('node_modules', '.code-pushup', slug);
69
+ }
70
+ export async function crawlFileSystem(options) {
71
+ const { directory, pattern, fileTransform = (filePath) => filePath, } = options;
72
+ const files = await readdir(directory);
73
+ const promises = files.map(async (file) => {
74
+ const filePath = path.join(directory, file);
75
+ const stats = await stat(filePath);
76
+ if (stats.isDirectory()) {
77
+ return crawlFileSystem({ directory: filePath, pattern, fileTransform });
78
+ }
79
+ if (stats.isFile() && (!pattern || new RegExp(pattern).test(file))) {
80
+ return fileTransform(filePath);
81
+ }
82
+ return [];
83
+ });
84
+ const resultsNestedArray = await Promise.all(promises);
85
+ return resultsNestedArray.flat();
86
+ }
87
+ export async function findNearestFile(fileNames, cwd = process.cwd()) {
88
+ // eslint-disable-next-line functional/no-loop-statements
89
+ for (
90
+ // eslint-disable-next-line functional/no-let
91
+ let directory = cwd; directory !== path.dirname(directory); directory = path.dirname(directory)) {
92
+ // eslint-disable-next-line functional/no-loop-statements
93
+ for (const file of fileNames) {
94
+ if (await fileExists(path.join(directory, file))) {
95
+ return path.join(directory, file);
96
+ }
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ export function findLineNumberInText(content, pattern) {
102
+ const lines = content.split(/\r?\n/); // Split lines, handle both Windows and UNIX line endings
103
+ const lineNumber = lines.findIndex(line => line.includes(pattern)) + 1; // +1 because line numbers are 1-based
104
+ return lineNumber === 0 ? null : lineNumber; // If the package isn't found, return null
105
+ }
106
+ export function filePathToCliArg(filePath) {
107
+ // needs to be escaped if spaces included
108
+ return `"${filePath}"`;
109
+ }
110
+ export function projectToFilename(project) {
111
+ return project.replace(/[/\\\s]+/g, '-').replace(/@/g, '');
112
+ }
113
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export function filterItemRefsBy(items, refFilterFn) {
2
+ return (items
3
+ .map(item => ({
4
+ ...item,
5
+ refs: item.refs.filter(refFilterFn),
6
+ }))
7
+ // remove item with empty refs
8
+ .filter(item => item.refs.length));
9
+ }
10
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/filter.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC9B,KAAU,EACV,WAAiD;IAEjD,OAAO,CACL,KAAK;SACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,GAAG,IAAI;QACP,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;KACpC,CAAC,CAAC;QACH,8BAA8B;SAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { MAX_DESCRIPTION_LENGTH, MAX_ISSUE_MESSAGE_LENGTH, MAX_TITLE_LENGTH, } from '@code-pushup/models';
2
+ export function slugify(text) {
3
+ return text
4
+ .trim()
5
+ .toLowerCase()
6
+ .replace(/\s+|\//g, '-')
7
+ .replace(/[^a-z\d-]/g, '');
8
+ }
9
+ export function pluralize(text, amount) {
10
+ if (amount != null && Math.abs(amount) === 1) {
11
+ return text;
12
+ }
13
+ if (text.endsWith('y')) {
14
+ return `${text.slice(0, -1)}ies`;
15
+ }
16
+ if (text.endsWith('s')) {
17
+ return `${text}es`;
18
+ }
19
+ return `${text}s`;
20
+ }
21
+ export function formatBytes(bytes, decimals = 2) {
22
+ const positiveBytes = Math.max(bytes, 0);
23
+ // early exit
24
+ if (positiveBytes === 0) {
25
+ return '0 B';
26
+ }
27
+ const k = 1024;
28
+ const dm = Math.max(decimals, 0);
29
+ const sizes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
30
+ const i = Math.floor(Math.log(positiveBytes) / Math.log(k));
31
+ return `${Number.parseFloat((positiveBytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
32
+ }
33
+ export function pluralizeToken(token, times) {
34
+ return `${times} ${Math.abs(times) === 1 ? token : pluralize(token)}`;
35
+ }
36
+ export function formatDuration(duration, granularity = 0) {
37
+ if (duration < 1000) {
38
+ return `${granularity ? duration.toFixed(granularity) : duration} ms`;
39
+ }
40
+ return `${(duration / 1000).toFixed(2)} s`;
41
+ }
42
+ export function formatDate(date) {
43
+ const locale = 'en-US'; // fixed locale to ensure consistency across local defaults execution
44
+ return date
45
+ .toLocaleString(locale, {
46
+ weekday: 'short',
47
+ month: 'short',
48
+ day: 'numeric',
49
+ year: 'numeric',
50
+ hour: 'numeric',
51
+ minute: '2-digit',
52
+ timeZoneName: 'short',
53
+ })
54
+ .replace(/\u202F/g, ' '); // see https://github.com/nodejs/node/issues/45171
55
+ }
56
+ export function truncateText(text, options) {
57
+ const { maxChars, position = 'end', ellipsis = '...', } = typeof options === 'number' ? { maxChars: options } : options;
58
+ if (text.length <= maxChars) {
59
+ return text;
60
+ }
61
+ const maxLength = maxChars - ellipsis.length;
62
+ switch (position) {
63
+ case 'start':
64
+ return ellipsis + text.slice(-maxLength).trim();
65
+ case 'middle':
66
+ const halfMaxChars = Math.floor(maxLength / 2);
67
+ return (text.slice(0, halfMaxChars).trim() +
68
+ ellipsis +
69
+ text.slice(-halfMaxChars).trim());
70
+ case 'end':
71
+ return text.slice(0, maxLength).trim() + ellipsis;
72
+ }
73
+ }
74
+ export function truncateTitle(text) {
75
+ return truncateText(text, MAX_TITLE_LENGTH);
76
+ }
77
+ export function truncateDescription(text) {
78
+ return truncateText(text, MAX_DESCRIPTION_LENGTH);
79
+ }
80
+ export function truncateIssueMessage(text) {
81
+ return truncateText(text, MAX_ISSUE_MESSAGE_LENGTH);
82
+ }
83
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/formatting.ts"],"names":[],"mappings":"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"}