@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.
- package/package.json +13 -7
- package/src/index.d.ts +31 -29
- package/src/index.js +31 -0
- package/src/index.js.map +1 -0
- package/src/lib/create-runner-files.d.ts +8 -0
- package/src/lib/create-runner-files.js +22 -0
- package/src/lib/create-runner-files.js.map +1 -0
- package/src/lib/diff.js +38 -0
- package/src/lib/diff.js.map +1 -0
- package/src/lib/errors.js +14 -0
- package/src/lib/errors.js.map +1 -0
- package/src/lib/execute-process.d.ts +0 -1
- package/src/lib/execute-process.js +105 -0
- package/src/lib/execute-process.js.map +1 -0
- package/src/lib/file-system.d.ts +5 -5
- package/src/lib/file-system.js +113 -0
- package/src/lib/file-system.js.map +1 -0
- package/src/lib/filter.js +10 -0
- package/src/lib/filter.js.map +1 -0
- package/src/lib/formatting.js +83 -0
- package/src/lib/formatting.js.map +1 -0
- package/src/lib/git/git.commits-and-tags.js +148 -0
- package/src/lib/git/git.commits-and-tags.js.map +1 -0
- package/src/lib/git/git.d.ts +2 -2
- package/src/lib/git/git.js +58 -0
- package/src/lib/git/git.js.map +1 -0
- package/src/lib/group-by-status.js +6 -0
- package/src/lib/group-by-status.js.map +1 -0
- package/src/lib/guards.d.ts +2 -0
- package/src/lib/guards.js +10 -0
- package/src/lib/guards.js.map +1 -0
- package/src/lib/log-results.js +28 -0
- package/src/lib/log-results.js.map +1 -0
- package/src/lib/logging.js +33 -0
- package/src/lib/logging.js.map +1 -0
- package/src/lib/merge-configs.js +104 -0
- package/src/lib/merge-configs.js.map +1 -0
- package/src/lib/progress.js +57 -0
- package/src/lib/progress.js.map +1 -0
- package/src/lib/reports/constants.js +19 -0
- package/src/lib/reports/constants.js.map +1 -0
- package/src/lib/reports/environment-type.d.ts +1 -1
- package/src/lib/reports/environment-type.js +17 -0
- package/src/lib/reports/environment-type.js.map +1 -0
- package/src/lib/reports/flatten-plugins.js +8 -0
- package/src/lib/reports/flatten-plugins.js.map +1 -0
- package/src/lib/reports/formatting.d.ts +1 -1
- package/src/lib/reports/formatting.js +105 -0
- package/src/lib/reports/formatting.js.map +1 -0
- package/src/lib/reports/generate-md-report-categoy-section.d.ts +1 -1
- package/src/lib/reports/generate-md-report-categoy-section.js +63 -0
- package/src/lib/reports/generate-md-report-categoy-section.js.map +1 -0
- package/src/lib/reports/generate-md-report.d.ts +1 -1
- package/src/lib/reports/generate-md-report.js +116 -0
- package/src/lib/reports/generate-md-report.js.map +1 -0
- package/src/lib/reports/generate-md-reports-diff-utils.d.ts +1 -1
- package/src/lib/reports/generate-md-reports-diff-utils.js +117 -0
- package/src/lib/reports/generate-md-reports-diff-utils.js.map +1 -0
- package/src/lib/reports/generate-md-reports-diff.d.ts +1 -1
- package/src/lib/reports/generate-md-reports-diff.js +158 -0
- package/src/lib/reports/generate-md-reports-diff.js.map +1 -0
- package/src/lib/reports/load-report.js +15 -0
- package/src/lib/reports/load-report.js.map +1 -0
- package/src/lib/reports/log-stdout-summary.d.ts +1 -1
- package/src/lib/reports/log-stdout-summary.js +102 -0
- package/src/lib/reports/log-stdout-summary.js.map +1 -0
- package/src/lib/reports/scoring.d.ts +1 -1
- package/src/lib/reports/scoring.js +78 -0
- package/src/lib/reports/scoring.js.map +1 -0
- package/src/lib/reports/sorting.d.ts +1 -1
- package/src/lib/reports/sorting.js +91 -0
- package/src/lib/reports/sorting.js.map +1 -0
- package/src/lib/reports/types.js +7 -0
- package/src/lib/reports/types.js.map +1 -0
- package/src/lib/reports/utils.d.ts +1 -1
- package/src/lib/reports/utils.js +209 -0
- package/src/lib/reports/utils.js.map +1 -0
- package/src/lib/semver.js +17 -0
- package/src/lib/semver.js.map +1 -0
- package/src/lib/text-formats/constants.js +14 -0
- package/src/lib/text-formats/constants.js.map +1 -0
- package/src/lib/text-formats/html/details.js +20 -0
- package/src/lib/text-formats/html/details.js.map +1 -0
- package/src/lib/text-formats/html/font-style.js +13 -0
- package/src/lib/text-formats/html/font-style.js.map +1 -0
- package/src/lib/text-formats/html/link.js +4 -0
- package/src/lib/text-formats/html/link.js.map +1 -0
- package/src/lib/text-formats/html/table.js +27 -0
- package/src/lib/text-formats/html/table.js.map +1 -0
- package/src/lib/text-formats/index.d.ts +5 -5
- package/src/lib/text-formats/index.js +14 -0
- package/src/lib/text-formats/index.js.map +1 -0
- package/src/lib/text-formats/table.js +92 -0
- package/src/lib/text-formats/table.js.map +1 -0
- package/src/lib/transform.d.ts +2 -3
- package/src/lib/transform.js +111 -0
- package/src/lib/transform.js.map +1 -0
- package/src/lib/types.d.ts +3 -3
- package/src/lib/types.js +2 -0
- package/src/lib/types.js.map +1 -0
- package/src/lib/verbose-utils.js +20 -0
- package/src/lib/verbose-utils.js.map +1 -0
- package/src/lib/zod-validation.d.ts +11 -0
- package/src/lib/zod-validation.js +46 -0
- package/src/lib/zod-validation.js.map +1 -0
- package/index.js +0 -2980
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/utils",
|
|
3
|
-
"version": "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
|
-
"
|
|
27
|
-
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=17.0.0"
|
|
28
|
+
},
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@code-pushup/models": "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 {
|
|
9
|
-
export {
|
|
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 {
|
|
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
|
package/src/index.js.map
ADDED
|
@@ -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"}
|
package/src/lib/diff.js
ADDED
|
@@ -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"}
|
|
@@ -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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"}
|
package/src/lib/file-system.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type Options } from 'bundle-require';
|
|
2
|
-
export declare function readTextFile(
|
|
3
|
-
export declare function readJsonFile<T = unknown>(
|
|
4
|
-
export declare function fileExists(
|
|
5
|
-
export declare function directoryExists(
|
|
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(
|
|
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 @@
|
|
|
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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"}
|