@code-pushup/core 0.93.0 → 0.95.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/core",
3
- "version": "0.93.0",
3
+ "version": "0.95.0",
4
4
  "license": "MIT",
5
5
  "description": "Core business logic for the used by the Code PushUp CLI",
6
6
  "homepage": "https://github.com/code-pushup/cli/tree/main/packages/core#readme",
@@ -39,8 +39,8 @@
39
39
  },
40
40
  "type": "module",
41
41
  "dependencies": {
42
- "@code-pushup/models": "0.93.0",
43
- "@code-pushup/utils": "0.93.0",
42
+ "@code-pushup/models": "0.95.0",
43
+ "@code-pushup/utils": "0.95.0",
44
44
  "ansis": "^3.3.0"
45
45
  },
46
46
  "peerDependencies": {
package/src/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export { collect, type CollectOptions } from './lib/implementation/collect.js';
6
6
  export type { ReportsToCompare } from './lib/implementation/compare-scorables.js';
7
7
  export { executePlugin, executePlugins, } from './lib/implementation/execute-plugin.js';
8
8
  export { persistReport } from './lib/implementation/persist.js';
9
- export { autoloadRc, ConfigPathError, readRcByPath, } from './lib/implementation/read-rc-file.js';
9
+ export { autoloadRc, readRcByPath } from './lib/implementation/read-rc-file.js';
10
10
  export { AuditOutputsMissingAuditError } from './lib/implementation/runner.js';
11
11
  export { mergeDiffs } from './lib/merge-diffs.js';
12
12
  export { upload, type UploadOptions } from './lib/upload.js';
package/src/index.js CHANGED
@@ -5,7 +5,7 @@ export { history, } from './lib/history.js';
5
5
  export { collect } from './lib/implementation/collect.js';
6
6
  export { executePlugin, executePlugins, } from './lib/implementation/execute-plugin.js';
7
7
  export { persistReport } from './lib/implementation/persist.js';
8
- export { autoloadRc, ConfigPathError, readRcByPath, } from './lib/implementation/read-rc-file.js';
8
+ export { autoloadRc, readRcByPath } from './lib/implementation/read-rc-file.js';
9
9
  export { AuditOutputsMissingAuditError } from './lib/implementation/runner.js';
10
10
  export { mergeDiffs } from './lib/merge-diffs.js';
11
11
  export { upload } from './lib/upload.js';
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAEzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,OAAO,GAGR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAuB,MAAM,iCAAiC,CAAC;AAE/E,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAsB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAEzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,OAAO,GAGR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAuB,MAAM,iCAAiC,CAAC;AAE/E,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAsB,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type CacheConfigObject, type CoreConfig, type PersistConfig } from '@code-pushup/models';
1
+ import type { CacheConfigObject, CoreConfig, PersistConfig } from '@code-pushup/models';
2
2
  export type CollectAndPersistReportsOptions = Pick<CoreConfig, 'plugins' | 'categories'> & {
3
3
  persist: Required<Omit<PersistConfig, 'skipReports'>> & Pick<PersistConfig, 'skipReports'>;
4
4
  cache: CacheConfigObject;
@@ -1,25 +1,23 @@
1
- import { pluginReportSchema, validate, } from '@code-pushup/models';
2
1
  import { logStdoutSummary, logger, scoreReport, sortReport, } from '@code-pushup/utils';
3
2
  import { collect } from './implementation/collect.js';
4
- import { logPersistedResults, persistReport, } from './implementation/persist.js';
3
+ import { logPersistedReport, persistReport } from './implementation/persist.js';
5
4
  export async function collectAndPersistReports(options) {
6
5
  const reportResult = await collect(options);
7
6
  const sortedScoredReport = sortReport(scoreReport(reportResult));
8
7
  const { persist } = options;
9
8
  const { skipReports = false, ...persistOptions } = persist ?? {};
10
9
  if (skipReports) {
11
- logger.info('Skipping saving reports as `persist.skipReports` is true');
10
+ logger.info('Skipped saving report as persist.skipReports flag is set');
12
11
  }
13
12
  else {
14
- const persistResults = await persistReport(reportResult, sortedScoredReport, persistOptions);
15
- logPersistedResults(persistResults);
13
+ const reportFiles = await persistReport(reportResult, sortedScoredReport, persistOptions);
14
+ logPersistedReport(reportFiles);
16
15
  }
17
16
  // terminal output
17
+ logger.newline();
18
+ logger.newline();
18
19
  logStdoutSummary(sortedScoredReport);
19
- // validate report and throw if invalid
20
- reportResult.plugins.forEach(plugin => {
21
- // Running checks after persisting helps while debugging as you can check the invalid output after the error is thrown
22
- validate(pluginReportSchema, plugin);
23
- });
20
+ logger.newline();
21
+ logger.newline();
24
22
  }
25
23
  //# sourceMappingURL=collect-and-persist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect-and-persist.js","sourceRoot":"","sources":["../../../src/lib/collect-and-persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EACL,mBAAmB,EACnB,aAAa,GACd,MAAM,6BAA6B,CAAC;AAWrC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC;IAExC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEjE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,GAAG,MAAM,aAAa,CACxC,YAAY,EACZ,kBAAkB,EAClB,cAAc,CACf,CAAC;QACF,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,kBAAkB;IAClB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAErC,uCAAuC;IACvC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACpC,sHAAsH;QACtH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"collect-and-persist.js","sourceRoot":"","sources":["../../../src/lib/collect-and-persist.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAWhF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC;IAExC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEjE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,aAAa,CACrC,YAAY,EACZ,kBAAkB,EAClB,cAAc,CACf,CAAC;QACF,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,kBAAkB;IAClB,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,OAAO,EAAE,CAAC;AACnB,CAAC"}
@@ -26,7 +26,7 @@ export async function history(config, commits) {
26
26
  logger.info('Upload is skipped because skipUploads is set to true.');
27
27
  }
28
28
  else {
29
- if (currentConfig.upload) {
29
+ if (hasUpload(currentConfig)) {
30
30
  await upload(currentConfig);
31
31
  }
32
32
  else {
@@ -39,4 +39,7 @@ export async function history(config, commits) {
39
39
  await safeCheckout(initialBranch, forceCleanStatus);
40
40
  return reports;
41
41
  }
42
+ function hasUpload(config) {
43
+ return config.upload != null;
44
+ }
42
45
  //# sourceMappingURL=history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/lib/history.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,qBAAqB,EACrB,MAAM,EACN,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAsB,EACtB,OAAiB;IAEjB,MAAM,aAAa,GAAW,MAAM,qBAAqB,EAAE,CAAC;IAE5D,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAElE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,yDAAyD;IACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAE7C,MAAM,aAAa,GAAmB;YACpC,GAAG,MAAM;YACT,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,MAAM,EAAE,CAAC,MAAM,CAAC;gBAChB,QAAQ,EAAE,GAAG,MAAM,SAAS;aAC7B;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;aACb;SACF,CAAC;QAEF,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAE9C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/lib/history.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,qBAAqB,EACrB,MAAM,EACN,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAsB,EACtB,OAAiB;IAEjB,MAAM,aAAa,GAAW,MAAM,qBAAqB,EAAE,CAAC;IAE5D,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAElE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,yDAAyD;IACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAE7C,MAAM,aAAa,GAAmB;YACpC,GAAG,MAAM;YACT,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,MAAM,EAAE,CAAC,MAAM,CAAC;gBAChB,QAAQ,EAAE,GAAG,MAAM,SAAS;aAC7B;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;aACb;SACF,CAAC;QAEF,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAE9C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAChB,MAAsB;IAEtB,OAAO,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC"}
@@ -1,5 +1,6 @@
1
+ import ansis from 'ansis';
1
2
  import { createRequire } from 'node:module';
2
- import { calcDuration, getLatestCommit } from '@code-pushup/utils';
3
+ import { calcDuration, getLatestCommit, logger, pluralizeToken, } from '@code-pushup/utils';
3
4
  import { executePlugins } from './execute-plugin.js';
4
5
  /**
5
6
  * Run audits, collect plugin output and aggregate it into a JSON object
@@ -9,9 +10,14 @@ export async function collect(options) {
9
10
  const { plugins, categories, persist = {}, cache } = options;
10
11
  const date = new Date().toISOString();
11
12
  const start = performance.now();
13
+ const packageJson = createRequire(import.meta.url)('../../../package.json');
12
14
  const commit = await getLatestCommit();
15
+ logger.debug(commit
16
+ ? `Found latest commit ${commit.hash} ("${commit.message}" by ${commit.author})`
17
+ : 'Latest commit not found');
18
+ logger.info(`Collecting report from ${pluralizeToken('plugin', plugins.length)} ...`);
13
19
  const pluginOutputs = await executePlugins({ plugins, persist, cache });
14
- const packageJson = createRequire(import.meta.url)('../../../package.json');
20
+ logger.info(ansis.green('Collected report ✓'));
15
21
  return {
16
22
  commit,
17
23
  packageName: packageJson.name,
@@ -1 +1 @@
1
- {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../../src/lib/implementation/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,uBAAuB,CACkB,CAAC;IAC5C,OAAO;QACL,MAAM;QACN,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,IAAI;QACJ,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QAC7B,UAAU;QACV,OAAO,EAAE,aAAa;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../../src/lib/implementation/collect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,OAAO,EACL,YAAY,EACZ,eAAe,EACf,MAAM,EACN,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,uBAAuB,CACkB,CAAC;IAE5C,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,CAAC,KAAK,CACV,MAAM;QACJ,CAAC,CAAC,uBAAuB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,QAAQ,MAAM,CAAC,MAAM,GAAG;QAChF,CAAC,CAAC,yBAAyB,CAC9B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CACzE,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE/C,OAAO;QACL,MAAM;QACN,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,IAAI;QACJ,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QAC7B,UAAU;QACV,OAAO,EAAE,aAAa;KACvB,CAAC;AACJ,CAAC"}
@@ -1,4 +1,9 @@
1
1
  import type { PersistConfig, Report } from '@code-pushup/models';
2
- import { type MultipleFileResults, type ScoredReport } from '@code-pushup/utils';
3
- export declare function persistReport(report: Report, sortedScoredReport: ScoredReport, options: Required<Omit<PersistConfig, 'skipReports'>>): Promise<MultipleFileResults>;
4
- export declare function logPersistedResults(persistResults: MultipleFileResults): void;
2
+ import { type ScoredReport } from '@code-pushup/utils';
3
+ type FileSize = {
4
+ file: string;
5
+ size: number;
6
+ };
7
+ export declare function persistReport(report: Report, sortedScoredReport: ScoredReport, options: Required<Omit<PersistConfig, 'skipReports'>>): Promise<FileSize[]>;
8
+ export declare function logPersistedReport(reportFiles: FileSize[]): void;
9
+ export {};
@@ -1,9 +1,10 @@
1
1
  import ansis from 'ansis';
2
2
  import { mkdir, stat, writeFile } from 'node:fs/promises';
3
- import { createReportPath, directoryExists, generateMdReport, logMultipleFileResults, stringifyError, } from '@code-pushup/utils';
3
+ import path from 'node:path';
4
+ import { createReportPath, directoryExists, formatBytes, generateMdReport, logger, stringifyError, } from '@code-pushup/utils';
4
5
  export async function persistReport(report, sortedScoredReport, options) {
5
6
  const { outputDir, filename, format } = options;
6
- // collect physical format outputs
7
+ // format report
7
8
  const results = format.map((reportType) => {
8
9
  switch (reportType) {
9
10
  case 'json':
@@ -27,18 +28,23 @@ export async function persistReport(report, sortedScoredReport, options) {
27
28
  }
28
29
  }
29
30
  // write relevant format outputs to file system
30
- return Promise.allSettled(results.map(result => persistResult(createReportPath({ outputDir, filename, format: result.format }), result.content)));
31
+ return Promise.all(results.map(result => persistResult(createReportPath({ outputDir, filename, format: result.format }), result.content)));
31
32
  }
32
33
  function persistResult(reportPath, content) {
33
34
  return (writeFile(reportPath, content)
34
35
  // return reportPath instead of void
35
36
  .then(() => stat(reportPath))
36
- .then(stats => [reportPath, stats.size])
37
+ .then((stats) => ({ file: reportPath, size: stats.size }))
37
38
  .catch((error) => {
38
- throw new Error(`Failed to persist report in ${ansis.bold(reportPath)} - ${stringifyError(error)}`);
39
+ throw new Error(`Failed to save report in ${ansis.bold(reportPath)} - ${stringifyError(error)}`);
39
40
  }));
40
41
  }
41
- export function logPersistedResults(persistResults) {
42
- logMultipleFileResults(persistResults, 'Generated reports');
42
+ export function logPersistedReport(reportFiles) {
43
+ logger.info(`Persisted report to file system:`);
44
+ reportFiles.forEach(({ file, size }) => {
45
+ const name = ansis.bold(path.relative(process.cwd(), file));
46
+ const suffix = ansis.gray(`(${formatBytes(size)})`);
47
+ logger.info(`• ${name} ${suffix}`);
48
+ });
43
49
  }
44
50
  //# sourceMappingURL=persist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../../src/lib/implementation/persist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAGL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,kBAAgC,EAChC,OAAqD;IAErD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEhD,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CACxB,CAAC,UAAU,EAAuC,EAAE;QAClD,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACzC,CAAC;YACJ,KAAK,IAAI;gBACP,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC;iBAC7D,CAAC;QACN,CAAC;IACH,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,OAAO,OAAO,CAAC,UAAU,CACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACnB,aAAa,CACX,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAChE,MAAM,CAAC,OAAO,CACf,CACF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,OAAe;IACxD,OAAO,CACL,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QAC5B,oCAAoC;SACnC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAU,CAAC;SAChD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CACnF,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,cAAmC;IACrE,sBAAsB,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../../src/lib/implementation/persist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAEL,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,cAAc,GACf,MAAM,oBAAoB,CAAC;AAO5B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,kBAAgC,EAChC,OAAqD;IAErD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEhD,gBAAgB;IAChB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CACxB,CAAC,UAAU,EAAuC,EAAE;QAClD,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACzC,CAAC;YACJ,KAAK,IAAI;gBACP,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC;iBAC7D,CAAC;QACN,CAAC;IACH,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACnB,aAAa,CACX,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAChE,MAAM,CAAC,OAAO,CACf,CACF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,OAAe;IACxD,OAAO,CACL,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QAC5B,oCAAoC;SACnC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC5B,IAAI,CAAC,CAAC,KAAK,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;SACnE,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAuB;IACxD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,3 @@
1
1
  import { type CoreConfig } from '@code-pushup/models';
2
- export declare class ConfigPathError extends Error {
3
- constructor(configPath: string);
4
- }
5
2
  export declare function readRcByPath(filePath: string, tsconfig?: string): Promise<CoreConfig>;
6
3
  export declare function autoloadRc(tsconfig?: string): Promise<CoreConfig>;
@@ -1,26 +1,33 @@
1
+ import ansis from 'ansis';
1
2
  import path from 'node:path';
2
3
  import { CONFIG_FILE_NAME, SUPPORTED_CONFIG_FILE_FORMATS, coreConfigSchema, validate, } from '@code-pushup/models';
3
- import { fileExists, importModule } from '@code-pushup/utils';
4
- export class ConfigPathError extends Error {
5
- constructor(configPath) {
6
- super(`Provided path '${configPath}' is not valid.`);
7
- }
8
- }
4
+ import { fileExists, importModule, logger } from '@code-pushup/utils';
9
5
  export async function readRcByPath(filePath, tsconfig) {
10
- if (filePath.length === 0) {
11
- throw new Error('The path to the configuration file is empty.');
12
- }
13
- if (!(await fileExists(filePath))) {
14
- throw new ConfigPathError(filePath);
15
- }
16
- const cfg = await importModule({
17
- filepath: filePath,
18
- tsconfig,
19
- format: 'esm',
6
+ const formattedTarget = [
7
+ `${ansis.bold(path.relative(process.cwd(), filePath))}`,
8
+ tsconfig &&
9
+ `(paths from ${ansis.bold(path.relative(process.cwd(), tsconfig))})`,
10
+ ]
11
+ .filter(Boolean)
12
+ .join(' ');
13
+ const value = await logger.task(`Importing config from ${formattedTarget}`, async () => {
14
+ const result = await importModule({
15
+ filepath: filePath,
16
+ tsconfig,
17
+ format: 'esm',
18
+ });
19
+ return { result, message: `Imported config from ${formattedTarget}` };
20
20
  });
21
- return validate(coreConfigSchema, cfg, { filePath });
21
+ const config = validate(coreConfigSchema, value, { filePath });
22
+ logger.info('Configuration is valid ✓');
23
+ return config;
22
24
  }
23
25
  export async function autoloadRc(tsconfig) {
26
+ const configFilePatterns = [
27
+ CONFIG_FILE_NAME,
28
+ `{${SUPPORTED_CONFIG_FILE_FORMATS.join(',')}}`,
29
+ ].join('.');
30
+ logger.debug(`Looking for default config file ${configFilePatterns}`);
24
31
  // eslint-disable-next-line functional/no-let
25
32
  let ext = '';
26
33
  // eslint-disable-next-line functional/no-loop-statements
@@ -28,12 +35,13 @@ export async function autoloadRc(tsconfig) {
28
35
  const filePath = `${CONFIG_FILE_NAME}.${extension}`;
29
36
  const exists = await fileExists(filePath);
30
37
  if (exists) {
38
+ logger.debug(`Found default config file ${ansis.bold(filePath)}`);
31
39
  ext = extension;
32
40
  break;
33
41
  }
34
42
  }
35
43
  if (!ext) {
36
- throw new Error(`No file ${CONFIG_FILE_NAME}.(${SUPPORTED_CONFIG_FILE_FORMATS.join('|')}) present in ${process.cwd()}`);
44
+ throw new Error(`No ${configFilePatterns} file present in ${process.cwd()}`);
37
45
  }
38
46
  return readRcByPath(path.join(process.cwd(), `${CONFIG_FILE_NAME}.${ext}`), tsconfig);
39
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"read-rc-file.js","sourceRoot":"","sources":["../../../../src/lib/implementation/read-rc-file.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAEhB,6BAA6B,EAC7B,gBAAgB,EAChB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,UAAkB;QAC5B,KAAK,CAAC,kBAAkB,UAAU,iBAAiB,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,QAAiB;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,GAAG,GAAe,MAAM,YAAY,CAAC;QACzC,QAAQ,EAAE,QAAQ;QAClB,QAAQ;QACR,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAiB;IAChD,6CAA6C;IAC7C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,yDAAyD;IACzD,KAAK,MAAM,SAAS,IAAI,6BAA6B,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,GAAG,gBAAgB,IAAI,SAAS,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,GAAG,SAAS,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,WAAW,gBAAgB,KAAK,6BAA6B,CAAC,IAAI,CAChE,GAAG,CACJ,gBAAgB,OAAO,CAAC,GAAG,EAAE,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,gBAAgB,IAAI,GAAG,EAAE,CAAC,EACtD,QAAQ,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"read-rc-file.js","sourceRoot":"","sources":["../../../../src/lib/implementation/read-rc-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAEhB,6BAA6B,EAC7B,gBAAgB,EAChB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,QAAiB;IAEjB,MAAM,eAAe,GAAG;QACtB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE;QACvD,QAAQ;YACN,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,GAAG;KACvE;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAC7B,yBAAyB,eAAe,EAAE,EAC1C,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,QAAQ,EAAE,QAAQ;YAClB,QAAQ;YACR,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,eAAe,EAAE,EAAE,CAAC;IACxE,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAiB;IAChD,MAAM,kBAAkB,GAAG;QACzB,gBAAgB;QAChB,IAAI,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;KAC/C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,CAAC,KAAK,CAAC,mCAAmC,kBAAkB,EAAE,CAAC,CAAC;IAEtE,6CAA6C;IAC7C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,yDAAyD;IACzD,KAAK,MAAM,SAAS,IAAI,6BAA6B,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,GAAG,gBAAgB,IAAI,SAAS,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClE,GAAG,GAAG,SAAS,CAAC;YAChB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,MAAM,kBAAkB,oBAAoB,OAAO,CAAC,GAAG,EAAE,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,gBAAgB,IAAI,GAAG,EAAE,CAAC,EACtD,QAAQ,CACT,CAAC;AACJ,CAAC"}
@@ -2,7 +2,7 @@ import ansis from 'ansis';
2
2
  import { writeFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { auditOutputsSchema, validate, } from '@code-pushup/models';
5
- import { calcDuration, ensureDirectoryExists, executeProcess, fileExists, readJsonFile, removeDirectoryIfExists, runnerArgsToEnv, } from '@code-pushup/utils';
5
+ import { calcDuration, ensureDirectoryExists, executeProcess, fileExists, logger, readJsonFile, removeDirectoryIfExists, runnerArgsToEnv, } from '@code-pushup/utils';
6
6
  import { normalizeAuditOutputs } from '../normalize.js';
7
7
  export async function executeRunnerConfig(config, args) {
8
8
  const { outputFile, outputTransform } = config;
@@ -67,17 +67,23 @@ export async function writeRunnerResults(pluginSlug, outputDir, runnerResult) {
67
67
  const cacheFilePath = getRunnerOutputsPath(pluginSlug, outputDir);
68
68
  await ensureDirectoryExists(path.dirname(cacheFilePath));
69
69
  await writeFile(cacheFilePath, JSON.stringify(runnerResult.audits, null, 2));
70
+ logger.info(`Wrote runner output to cache ${formatCachePathSuffix(cacheFilePath)}`);
70
71
  }
71
72
  export async function readRunnerResults(pluginSlug, outputDir) {
72
- const auditOutputsPath = getRunnerOutputsPath(pluginSlug, outputDir);
73
- if (await fileExists(auditOutputsPath)) {
74
- const cachedResult = await readJsonFile(auditOutputsPath);
73
+ const cachePath = getRunnerOutputsPath(pluginSlug, outputDir);
74
+ if (await fileExists(cachePath)) {
75
+ const cachedResult = await readJsonFile(cachePath);
76
+ logger.info(`Read runner output from cache ${formatCachePathSuffix(cachePath)}`);
75
77
  return {
76
78
  audits: cachedResult,
77
79
  duration: 0,
78
80
  date: new Date().toISOString(),
79
81
  };
80
82
  }
83
+ logger.info(`Cached runner output is not available ${formatCachePathSuffix(cachePath)}`);
81
84
  return null;
82
85
  }
86
+ function formatCachePathSuffix(cacheFilePath) {
87
+ return ansis.gray(`(${cacheFilePath})`);
88
+ }
83
89
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/implementation/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/implementation/runner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function loadPortalClient(): Promise<typeof import('@code-pushup/portal-client') | null>;
1
+ export declare function loadPortalClient(): Promise<typeof import('@code-pushup/portal-client')>;
@@ -1,12 +1,12 @@
1
+ import ansis from 'ansis';
1
2
  import { logger, stringifyError } from '@code-pushup/utils';
2
3
  export async function loadPortalClient() {
3
4
  try {
4
5
  return await import('@code-pushup/portal-client');
5
6
  }
6
7
  catch (error) {
7
- logger.warn(`Failed to import @code-pushup/portal-client - ${stringifyError(error)}`);
8
- logger.error('Optional peer dependency @code-pushup/portal-client is not available. Make sure it is installed to enable upload functionality.');
9
- return null;
8
+ logger.error(`Failed to import @code-pushup/portal-client - ${stringifyError(error)}`);
9
+ throw new Error(`The ${ansis.bold('@code-pushup/portal-client')} peer dependency must be installed to enable uploading to Portal.`);
10
10
  }
11
11
  }
12
12
  //# sourceMappingURL=load-portal-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-portal-client.js","sourceRoot":"","sources":["../../../src/lib/load-portal-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAGpC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CACT,iDAAiD,cAAc,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;QACF,MAAM,CAAC,KAAK,CACV,iIAAiI,CAClI,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"load-portal-client.js","sourceRoot":"","sources":["../../../src/lib/load-portal-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAGpC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,iDAAiD,cAAc,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;QACF,MAAM,IAAI,KAAK,CACb,OAAO,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,mEAAmE,CACnH,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,12 +1,9 @@
1
1
  import type { PersistConfig, UploadConfig } from '@code-pushup/models';
2
2
  export type UploadOptions = {
3
- upload?: UploadConfig;
4
- } & {
3
+ upload: UploadConfig;
5
4
  persist: Required<PersistConfig>;
6
5
  };
7
6
  /**
8
7
  * Uploads collected audits to the portal
9
- * @param options
10
- * @param uploadFn
11
8
  */
12
- export declare function upload(options: UploadOptions): Promise<import("@code-pushup/portal-client").ReportUrlFragment | undefined>;
9
+ export declare function upload(options: UploadOptions): Promise<void>;
package/src/lib/upload.js CHANGED
@@ -1,34 +1,35 @@
1
- import { loadReport } from '@code-pushup/utils';
1
+ import { formatAsciiLink, loadReport, logger } from '@code-pushup/utils';
2
2
  import { reportToGQL } from './implementation/report-to-gql.js';
3
3
  import { loadPortalClient } from './load-portal-client.js';
4
4
  /**
5
5
  * Uploads collected audits to the portal
6
- * @param options
7
- * @param uploadFn
8
6
  */
9
7
  export async function upload(options) {
10
- if (options.upload == null) {
11
- throw new Error('Upload configuration is not set.');
12
- }
13
- const portalClient = await loadPortalClient();
14
- if (!portalClient) {
15
- return;
16
- }
17
- const { uploadReportToPortal } = portalClient;
18
- const { apiKey, server, organization, project, timeout } = options.upload;
19
- const report = await loadReport({
20
- ...options.persist,
21
- format: 'json',
8
+ await logger.task('Uploading report to Portal', async () => {
9
+ const portalClient = await loadPortalClient();
10
+ const { uploadReportToPortal } = portalClient;
11
+ const { apiKey, server, organization, project, timeout } = options.upload;
12
+ const report = await loadReport({
13
+ ...options.persist,
14
+ format: 'json',
15
+ });
16
+ if (!report.commit) {
17
+ throw new Error('Commit must be linked in order to upload report');
18
+ }
19
+ const data = {
20
+ organization,
21
+ project,
22
+ commit: report.commit.hash,
23
+ ...reportToGQL(report),
24
+ };
25
+ const { url } = await uploadReportToPortal({
26
+ apiKey,
27
+ server,
28
+ data,
29
+ timeout,
30
+ });
31
+ logger.info(formatAsciiLink(url));
32
+ return `Uploaded report to Portal`;
22
33
  });
23
- if (!report.commit) {
24
- throw new Error('Commit must be linked in order to upload report');
25
- }
26
- const data = {
27
- organization,
28
- project,
29
- commit: report.commit.hash,
30
- ...reportToGQL(report),
31
- };
32
- return uploadReportToPortal({ apiKey, server, data, timeout });
33
34
  }
34
35
  //# sourceMappingURL=upload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/lib/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,oBAAoB,EAAE,GAAG,YAAY,CAAC;IAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1E,MAAM,MAAM,GAAW,MAAM,UAAU,CAAC;QACtC,GAAG,OAAO,CAAC,OAAO;QAClB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAgC;QACxC,YAAY;QACZ,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QAC1B,GAAG,WAAW,CAAC,MAAM,CAAC;KACvB,CAAC;IAEF,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/lib/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,MAAM,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC9C,MAAM,EAAE,oBAAoB,EAAE,GAAG,YAAY,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC1E,MAAM,MAAM,GAAW,MAAM,UAAU,CAAC;YACtC,GAAG,OAAO,CAAC,OAAO;YAClB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAgC;YACxC,YAAY;YACZ,OAAO;YACP,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;YAC1B,GAAG,WAAW,CAAC,MAAM,CAAC;SACvB,CAAC;QAEF,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,CAAC;YACzC,MAAM;YACN,MAAM;YACN,IAAI;YACJ,OAAO;SACR,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAElC,OAAO,2BAA2B,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC"}