@code-pushup/utils 0.56.0 → 0.58.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 (106) hide show
  1. package/package.json +13 -7
  2. package/src/index.d.ts +31 -29
  3. package/src/index.js +31 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/create-runner-files.d.ts +8 -0
  6. package/src/lib/create-runner-files.js +22 -0
  7. package/src/lib/create-runner-files.js.map +1 -0
  8. package/src/lib/diff.js +38 -0
  9. package/src/lib/diff.js.map +1 -0
  10. package/src/lib/errors.js +14 -0
  11. package/src/lib/errors.js.map +1 -0
  12. package/src/lib/execute-process.d.ts +0 -1
  13. package/src/lib/execute-process.js +105 -0
  14. package/src/lib/execute-process.js.map +1 -0
  15. package/src/lib/file-system.d.ts +5 -5
  16. package/src/lib/file-system.js +113 -0
  17. package/src/lib/file-system.js.map +1 -0
  18. package/src/lib/filter.js +10 -0
  19. package/src/lib/filter.js.map +1 -0
  20. package/src/lib/formatting.js +83 -0
  21. package/src/lib/formatting.js.map +1 -0
  22. package/src/lib/git/git.commits-and-tags.js +148 -0
  23. package/src/lib/git/git.commits-and-tags.js.map +1 -0
  24. package/src/lib/git/git.d.ts +2 -2
  25. package/src/lib/git/git.js +58 -0
  26. package/src/lib/git/git.js.map +1 -0
  27. package/src/lib/group-by-status.js +6 -0
  28. package/src/lib/group-by-status.js.map +1 -0
  29. package/src/lib/guards.d.ts +2 -0
  30. package/src/lib/guards.js +10 -0
  31. package/src/lib/guards.js.map +1 -0
  32. package/src/lib/log-results.js +28 -0
  33. package/src/lib/log-results.js.map +1 -0
  34. package/src/lib/logging.js +33 -0
  35. package/src/lib/logging.js.map +1 -0
  36. package/src/lib/merge-configs.js +104 -0
  37. package/src/lib/merge-configs.js.map +1 -0
  38. package/src/lib/progress.js +57 -0
  39. package/src/lib/progress.js.map +1 -0
  40. package/src/lib/reports/constants.js +19 -0
  41. package/src/lib/reports/constants.js.map +1 -0
  42. package/src/lib/reports/environment-type.d.ts +1 -1
  43. package/src/lib/reports/environment-type.js +17 -0
  44. package/src/lib/reports/environment-type.js.map +1 -0
  45. package/src/lib/reports/flatten-plugins.js +8 -0
  46. package/src/lib/reports/flatten-plugins.js.map +1 -0
  47. package/src/lib/reports/formatting.d.ts +1 -1
  48. package/src/lib/reports/formatting.js +105 -0
  49. package/src/lib/reports/formatting.js.map +1 -0
  50. package/src/lib/reports/generate-md-report-categoy-section.d.ts +1 -1
  51. package/src/lib/reports/generate-md-report-categoy-section.js +63 -0
  52. package/src/lib/reports/generate-md-report-categoy-section.js.map +1 -0
  53. package/src/lib/reports/generate-md-report.d.ts +1 -1
  54. package/src/lib/reports/generate-md-report.js +116 -0
  55. package/src/lib/reports/generate-md-report.js.map +1 -0
  56. package/src/lib/reports/generate-md-reports-diff-utils.d.ts +1 -1
  57. package/src/lib/reports/generate-md-reports-diff-utils.js +117 -0
  58. package/src/lib/reports/generate-md-reports-diff-utils.js.map +1 -0
  59. package/src/lib/reports/generate-md-reports-diff.d.ts +1 -1
  60. package/src/lib/reports/generate-md-reports-diff.js +158 -0
  61. package/src/lib/reports/generate-md-reports-diff.js.map +1 -0
  62. package/src/lib/reports/load-report.js +15 -0
  63. package/src/lib/reports/load-report.js.map +1 -0
  64. package/src/lib/reports/log-stdout-summary.d.ts +1 -1
  65. package/src/lib/reports/log-stdout-summary.js +102 -0
  66. package/src/lib/reports/log-stdout-summary.js.map +1 -0
  67. package/src/lib/reports/scoring.d.ts +1 -1
  68. package/src/lib/reports/scoring.js +78 -0
  69. package/src/lib/reports/scoring.js.map +1 -0
  70. package/src/lib/reports/sorting.d.ts +1 -1
  71. package/src/lib/reports/sorting.js +91 -0
  72. package/src/lib/reports/sorting.js.map +1 -0
  73. package/src/lib/reports/types.js +7 -0
  74. package/src/lib/reports/types.js.map +1 -0
  75. package/src/lib/reports/utils.d.ts +1 -1
  76. package/src/lib/reports/utils.js +209 -0
  77. package/src/lib/reports/utils.js.map +1 -0
  78. package/src/lib/semver.js +17 -0
  79. package/src/lib/semver.js.map +1 -0
  80. package/src/lib/text-formats/constants.js +14 -0
  81. package/src/lib/text-formats/constants.js.map +1 -0
  82. package/src/lib/text-formats/html/details.js +20 -0
  83. package/src/lib/text-formats/html/details.js.map +1 -0
  84. package/src/lib/text-formats/html/font-style.js +13 -0
  85. package/src/lib/text-formats/html/font-style.js.map +1 -0
  86. package/src/lib/text-formats/html/link.js +4 -0
  87. package/src/lib/text-formats/html/link.js.map +1 -0
  88. package/src/lib/text-formats/html/table.js +27 -0
  89. package/src/lib/text-formats/html/table.js.map +1 -0
  90. package/src/lib/text-formats/index.d.ts +5 -5
  91. package/src/lib/text-formats/index.js +14 -0
  92. package/src/lib/text-formats/index.js.map +1 -0
  93. package/src/lib/text-formats/table.js +92 -0
  94. package/src/lib/text-formats/table.js.map +1 -0
  95. package/src/lib/transform.d.ts +2 -3
  96. package/src/lib/transform.js +111 -0
  97. package/src/lib/transform.js.map +1 -0
  98. package/src/lib/types.d.ts +3 -3
  99. package/src/lib/types.js +2 -0
  100. package/src/lib/types.js.map +1 -0
  101. package/src/lib/verbose-utils.js +20 -0
  102. package/src/lib/verbose-utils.js.map +1 -0
  103. package/src/lib/zod-validation.d.ts +11 -0
  104. package/src/lib/zod-validation.js +46 -0
  105. package/src/lib/zod-validation.js.map +1 -0
  106. 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.58.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.58.0",
30
31
  "@isaacs/cliui": "^8.0.2",
31
32
  "@poppinss/cliui": "^6.4.0",
32
33
  "ansis": "^3.3.0",
@@ -35,6 +36,11 @@
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": "^3.23.8",
41
+ "zod-validation-error": "^3.4.0"
42
+ },
43
+ "module": "./src/index.js",
44
+ "main": "./src/index.js",
45
+ "types": "./src/index.d.ts"
46
+ }
package/src/index.d.ts CHANGED
@@ -1,30 +1,32 @@
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 { parseSchema, SchemaValidationError } from './lib/zod-validation.js';
32
+ export { createRunnerFiles } from './lib/create-runner-files.js';
package/src/index.js ADDED
@@ -0,0 +1,31 @@
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 { parseSchema, SchemaValidationError } from './lib/zod-validation.js';
30
+ export { createRunnerFiles } from './lib/create-runner-files.js';
31
+ //# 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,WAAW,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RunnerFilesPaths } from '@code-pushup/models';
2
+ /**
3
+ * Function to create timestamp nested plugin runner files for config and output.
4
+ *
5
+ * @param pluginSlug - slug of the plugin name used as folder names to group same plugin configs
6
+ * @param configJSON - config of the plugin runner as JSON.
7
+ */
8
+ export declare function createRunnerFiles(pluginSlug: string, configJSON: string): Promise<RunnerFilesPaths>;
@@ -0,0 +1,22 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ensureDirectoryExists, pluginWorkDir } from './file-system.js';
4
+ /**
5
+ * Function to create timestamp nested plugin runner files for config and output.
6
+ *
7
+ * @param pluginSlug - slug of the plugin name used as folder names to group same plugin configs
8
+ * @param configJSON - config of the plugin runner as JSON.
9
+ */
10
+ export async function createRunnerFiles(pluginSlug, configJSON) {
11
+ const timestamp = Date.now().toString();
12
+ const runnerWorkDir = path.join(pluginWorkDir(pluginSlug), timestamp);
13
+ const runnerConfigPath = path.join(runnerWorkDir, 'plugin-config.json');
14
+ const runnerOutputPath = path.join(runnerWorkDir, 'runner-output.json');
15
+ await ensureDirectoryExists(path.dirname(runnerOutputPath));
16
+ await writeFile(runnerConfigPath, configJSON);
17
+ return {
18
+ runnerConfigPath,
19
+ runnerOutputPath,
20
+ };
21
+ }
22
+ //# sourceMappingURL=create-runner-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-runner-files.js","sourceRoot":"","sources":["../../../../../packages/utils/src/lib/create-runner-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,UAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAExE,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAE9C,OAAO;QACL,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;AACJ,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,105 @@
1
+ import { gray } from 'ansis';
2
+ import { spawn, } from 'node:child_process';
3
+ import { ui } from './logging.js';
4
+ import { calcDuration } from './reports/utils.js';
5
+ /**
6
+ * Error class for process errors.
7
+ * Contains additional information about the process result.
8
+ * @category Error
9
+ * @public
10
+ * @class
11
+ * @extends Error
12
+ * @example
13
+ * const result = await executeProcess({})
14
+ * .catch((error) => {
15
+ * if (error instanceof ProcessError) {
16
+ * console.error(error.code);
17
+ * console.error(error.stderr);
18
+ * console.error(error.stdout);
19
+ * }
20
+ * });
21
+ *
22
+ */
23
+ export class ProcessError extends Error {
24
+ code;
25
+ stderr;
26
+ stdout;
27
+ constructor(result) {
28
+ super(result.stderr);
29
+ this.code = result.code;
30
+ this.stderr = result.stderr;
31
+ this.stdout = result.stdout;
32
+ }
33
+ }
34
+ /**
35
+ * Executes a process and returns a promise with the result as `ProcessResult`.
36
+ *
37
+ * @example
38
+ *
39
+ * // sync process execution
40
+ * const result = await executeProcess({
41
+ * command: 'node',
42
+ * args: ['--version']
43
+ * });
44
+ *
45
+ * console.info(result);
46
+ *
47
+ * // async process execution
48
+ * const result = await executeProcess({
49
+ * command: 'node',
50
+ * args: ['download-data.js'],
51
+ * observer: {
52
+ * onStdout: updateProgress,
53
+ * error: handleError,
54
+ * complete: cleanLogs,
55
+ * }
56
+ * });
57
+ *
58
+ * console.info(result);
59
+ *
60
+ * @param cfg - see {@link ProcessConfig}
61
+ */
62
+ export function executeProcess(cfg) {
63
+ const { command, args, observer, ignoreExitCode = false, ...options } = cfg;
64
+ const { onStdout, onStderr, onError, onComplete } = observer ?? {};
65
+ const date = new Date().toISOString();
66
+ const start = performance.now();
67
+ const logCommand = [command, ...(args || [])].join(' ');
68
+ ui().logger.log(gray(`Executing command:\n${logCommand}\nIn working directory:\n${cfg.cwd}`));
69
+ return new Promise((resolve, reject) => {
70
+ // shell:true tells Windows to use shell command for spawning a child process
71
+ const spawnedProcess = spawn(command, args ?? [], {
72
+ shell: true,
73
+ windowsHide: true,
74
+ ...options,
75
+ });
76
+ // eslint-disable-next-line functional/no-let
77
+ let stdout = '';
78
+ // eslint-disable-next-line functional/no-let
79
+ let stderr = '';
80
+ spawnedProcess.stdout.on('data', data => {
81
+ stdout += String(data);
82
+ onStdout?.(String(data), spawnedProcess);
83
+ });
84
+ spawnedProcess.stderr.on('data', data => {
85
+ stderr += String(data);
86
+ onStderr?.(String(data), spawnedProcess);
87
+ });
88
+ spawnedProcess.on('error', err => {
89
+ stderr += err.toString();
90
+ });
91
+ spawnedProcess.on('close', code => {
92
+ const timings = { date, duration: calcDuration(start) };
93
+ if (code === 0 || ignoreExitCode) {
94
+ onComplete?.();
95
+ resolve({ code, stdout, stderr, ...timings });
96
+ }
97
+ else {
98
+ const errorMsg = new ProcessError({ code, stdout, stderr, ...timings });
99
+ onError?.(errorMsg);
100
+ reject(errorMsg);
101
+ }
102
+ });
103
+ });
104
+ }
105
+ //# 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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"}