@code-pushup/core 0.8.10 → 0.8.12

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/index.js CHANGED
@@ -6,7 +6,7 @@ import { join as join2 } from "node:path";
6
6
  // packages/utils/src/lib/execute-process.ts
7
7
  import { spawn } from "node:child_process";
8
8
 
9
- // packages/utils/src/lib/report.ts
9
+ // packages/utils/src/lib/reports/utils.ts
10
10
  import { join } from "node:path";
11
11
 
12
12
  // packages/models/src/lib/audit.ts
@@ -43,6 +43,46 @@ function errorItems(items, transform = (items2) => items2.join(", ")) {
43
43
  function exists(value) {
44
44
  return value != null;
45
45
  }
46
+ function getMissingRefsForCategories(categories, plugins) {
47
+ const missingRefs = [];
48
+ const auditRefsFromCategory = categories.flatMap(
49
+ ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
50
+ );
51
+ const auditRefsFromPlugins = plugins.flatMap(
52
+ ({ audits, slug: pluginSlug }) => {
53
+ return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
54
+ }
55
+ );
56
+ const missingAuditRefs = hasMissingStrings(
57
+ auditRefsFromCategory,
58
+ auditRefsFromPlugins
59
+ );
60
+ if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
61
+ missingRefs.push(...missingAuditRefs);
62
+ }
63
+ const groupRefsFromCategory = categories.flatMap(
64
+ ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
65
+ );
66
+ const groupRefsFromPlugins = plugins.flatMap(
67
+ ({ groups, slug: pluginSlug }) => {
68
+ return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
69
+ }
70
+ );
71
+ const missingGroupRefs = hasMissingStrings(
72
+ groupRefsFromCategory,
73
+ groupRefsFromPlugins
74
+ );
75
+ if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
76
+ missingRefs.push(...missingGroupRefs);
77
+ }
78
+ return missingRefs.length ? missingRefs : false;
79
+ }
80
+ function missingRefsForCategoriesErrorMsg(categories, plugins) {
81
+ const missingRefs = getMissingRefsForCategories(categories, plugins);
82
+ return `The following category references need to point to an audit or group: ${errorItems(
83
+ missingRefs
84
+ )}`;
85
+ }
46
86
 
47
87
  // packages/models/src/lib/implementation/schemas.ts
48
88
  function executionMetaSchema(options = {
@@ -101,15 +141,13 @@ function positiveIntSchema(description) {
101
141
  return z.number({ description }).int().nonnegative();
102
142
  }
103
143
  function packageVersionSchema(options) {
104
- let { versionDescription, optional } = options || {};
105
- versionDescription = versionDescription || "NPM version of the package";
106
- optional = !!optional;
144
+ const { versionDescription = "NPM version of the package", required } = options ?? {};
107
145
  const packageSchema = z.string({ description: "NPM package name" });
108
146
  const versionSchema = z.string({ description: versionDescription });
109
147
  return z.object(
110
148
  {
111
- packageName: optional ? packageSchema.optional() : packageSchema,
112
- version: optional ? versionSchema.optional() : versionSchema
149
+ packageName: required ? packageSchema : packageSchema.optional(),
150
+ version: required ? versionSchema : versionSchema.optional()
113
151
  },
114
152
  { description: "NPM package name and version of a published package" }
115
153
  );
@@ -171,7 +209,7 @@ var pluginAuditsSchema = z2.array(auditSchema, {
171
209
  );
172
210
  function duplicateSlugsInAuditsErrorMsg(audits) {
173
211
  const duplicateRefs = getDuplicateSlugsInAudits(audits);
174
- return `In plugin audits the slugs are not unique: ${errorItems(
212
+ return `In plugin audits the following slugs are not unique: ${errorItems(
175
213
  duplicateRefs
176
214
  )}`;
177
215
  }
@@ -360,7 +398,9 @@ function getDuplicateRefsInGroups(groups) {
360
398
  }
361
399
  function duplicateSlugsInGroupsErrorMsg(groups) {
362
400
  const duplicateRefs = getDuplicateSlugsInGroups(groups);
363
- return `In groups the slugs are not unique: ${errorItems(duplicateRefs)}`;
401
+ return `In groups the following slugs are not unique: ${errorItems(
402
+ duplicateRefs
403
+ )}`;
364
404
  }
365
405
  function getDuplicateSlugsInGroups(groups) {
366
406
  return Array.isArray(groups) ? hasDuplicateStrings(groups.map(({ slug }) => slug)) : false;
@@ -386,9 +426,7 @@ var onProgressSchema = z8.function().args(z8.unknown()).returns(z8.void());
386
426
  var runnerFunctionSchema = z8.function().args(onProgressSchema.optional()).returns(z8.union([auditOutputsSchema, z8.promise(auditOutputsSchema)]));
387
427
 
388
428
  // packages/models/src/lib/plugin-config.ts
389
- var pluginMetaSchema = packageVersionSchema({
390
- optional: true
391
- }).merge(
429
+ var pluginMetaSchema = packageVersionSchema().merge(
392
430
  metaSchema({
393
431
  titleDescription: "Descriptive name",
394
432
  descriptionDescription: "Description (markdown)",
@@ -397,7 +435,7 @@ var pluginMetaSchema = packageVersionSchema({
397
435
  })
398
436
  ).merge(
399
437
  z9.object({
400
- slug: slugSchema("References plugin. ID (unique within core config)"),
438
+ slug: slugSchema("Unique plugin slug within core config"),
401
439
  icon: materialIconSchema
402
440
  })
403
441
  );
@@ -414,20 +452,17 @@ var pluginConfigSchema = pluginMetaSchema.merge(pluginDataSchema).refine(
414
452
  );
415
453
  function missingRefsFromGroupsErrorMsg(pluginCfg) {
416
454
  const missingRefs = getMissingRefsFromGroups(pluginCfg);
417
- return `In the groups, the following audit ref's needs to point to a audit in this plugin config: ${errorItems(
455
+ return `The following group references need to point to an existing audit in this plugin config: ${errorItems(
418
456
  missingRefs
419
457
  )}`;
420
458
  }
421
459
  function getMissingRefsFromGroups(pluginCfg) {
422
- if (pluginCfg?.groups?.length && pluginCfg?.audits?.length) {
423
- const groups = pluginCfg?.groups || [];
424
- const audits = pluginCfg?.audits || [];
425
- return hasMissingStrings(
426
- groups.flatMap(({ refs: audits2 }) => audits2.map(({ slug: ref }) => ref)),
427
- audits.map(({ slug }) => slug)
428
- );
429
- }
430
- return false;
460
+ return hasMissingStrings(
461
+ pluginCfg.groups?.flatMap(
462
+ ({ refs: audits }) => audits.map(({ slug: ref }) => ref)
463
+ ) ?? [],
464
+ pluginCfg.audits.map(({ slug }) => slug)
465
+ );
431
466
  }
432
467
 
433
468
  // packages/models/src/lib/upload-config.ts
@@ -437,19 +472,15 @@ var uploadConfigSchema = z10.object({
437
472
  apiKey: z10.string({
438
473
  description: "API key with write access to portal (use `process.env` for security)"
439
474
  }),
440
- organization: z10.string({
441
- description: "Organization in code versioning system"
442
- }),
443
- project: z10.string({
444
- description: "Project in code versioning system"
445
- })
475
+ organization: slugSchema("Organization slug from Code PushUp portal"),
476
+ project: slugSchema("Project slug from Code PushUp portal")
446
477
  });
447
478
 
448
479
  // packages/models/src/lib/core-config.ts
449
480
  var unrefinedCoreConfigSchema = z11.object({
450
481
  plugins: z11.array(pluginConfigSchema, {
451
482
  description: "List of plugins to be used (official, community-provided, or custom)"
452
- }),
483
+ }).min(1),
453
484
  /** portal configuration for persisting results */
454
485
  persist: persistConfigSchema.optional(),
455
486
  /** portal configuration for uploading results */
@@ -459,52 +490,15 @@ var unrefinedCoreConfigSchema = z11.object({
459
490
  var coreConfigSchema = refineCoreConfig(unrefinedCoreConfigSchema);
460
491
  function refineCoreConfig(schema) {
461
492
  return schema.refine(
462
- (coreCfg) => !getMissingRefsForCategories(coreCfg),
493
+ (coreCfg) => !getMissingRefsForCategories(coreCfg.categories, coreCfg.plugins),
463
494
  (coreCfg) => ({
464
- message: missingRefsForCategoriesErrorMsg(coreCfg)
495
+ message: missingRefsForCategoriesErrorMsg(
496
+ coreCfg.categories,
497
+ coreCfg.plugins
498
+ )
465
499
  })
466
500
  );
467
501
  }
468
- function missingRefsForCategoriesErrorMsg(coreCfg) {
469
- const missingRefs = getMissingRefsForCategories(coreCfg);
470
- return `In the categories, the following plugin refs do not exist in the provided plugins: ${errorItems(
471
- missingRefs
472
- )}`;
473
- }
474
- function getMissingRefsForCategories(coreCfg) {
475
- const missingRefs = [];
476
- const auditRefsFromCategory = coreCfg.categories.flatMap(
477
- ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
478
- );
479
- const auditRefsFromPlugins = coreCfg.plugins.flatMap(
480
- ({ audits, slug: pluginSlug }) => {
481
- return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
482
- }
483
- );
484
- const missingAuditRefs = hasMissingStrings(
485
- auditRefsFromCategory,
486
- auditRefsFromPlugins
487
- );
488
- if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
489
- missingRefs.push(...missingAuditRefs);
490
- }
491
- const groupRefsFromCategory = coreCfg.categories.flatMap(
492
- ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
493
- );
494
- const groupRefsFromPlugins = coreCfg.plugins.flatMap(
495
- ({ groups, slug: pluginSlug }) => {
496
- return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
497
- }
498
- );
499
- const missingGroupRefs = hasMissingStrings(
500
- groupRefsFromCategory,
501
- groupRefsFromPlugins
502
- );
503
- if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
504
- missingRefs.push(...missingGroupRefs);
505
- }
506
- return missingRefs.length ? missingRefs : false;
507
- }
508
502
 
509
503
  // packages/models/src/lib/implementation/constants.ts
510
504
  var PERSIST_OUTPUT_DIR = ".code-pushup";
@@ -524,9 +518,32 @@ var pluginReportSchema = pluginMetaSchema.merge(
524
518
  audits: z12.array(auditReportSchema),
525
519
  groups: z12.array(groupSchema).optional()
526
520
  })
521
+ ).refine(
522
+ (pluginReport) => !getMissingRefsFromGroups2(pluginReport.audits, pluginReport.groups ?? []),
523
+ (pluginReport) => ({
524
+ message: missingRefsFromGroupsErrorMsg2(
525
+ pluginReport.audits,
526
+ pluginReport.groups ?? []
527
+ )
528
+ })
527
529
  );
530
+ function missingRefsFromGroupsErrorMsg2(audits, groups) {
531
+ const missingRefs = getMissingRefsFromGroups2(audits, groups);
532
+ return `group references need to point to an existing audit in this plugin report: ${errorItems(
533
+ missingRefs
534
+ )}`;
535
+ }
536
+ function getMissingRefsFromGroups2(audits, groups) {
537
+ return hasMissingStrings(
538
+ groups.flatMap(
539
+ ({ refs: auditRefs }) => auditRefs.map(({ slug: ref }) => ref)
540
+ ),
541
+ audits.map(({ slug }) => slug)
542
+ );
543
+ }
528
544
  var reportSchema = packageVersionSchema({
529
- versionDescription: "NPM version of the CLI"
545
+ versionDescription: "NPM version of the CLI",
546
+ required: true
530
547
  }).merge(
531
548
  executionMetaSchema({
532
549
  descriptionDate: "Start date and time of the collect run",
@@ -536,18 +553,20 @@ var reportSchema = packageVersionSchema({
536
553
  z12.object(
537
554
  {
538
555
  categories: z12.array(categoryConfigSchema),
539
- plugins: z12.array(pluginReportSchema)
556
+ plugins: z12.array(pluginReportSchema).min(1)
540
557
  },
541
558
  { description: "Collect output data" }
542
559
  )
560
+ ).refine(
561
+ (report) => !getMissingRefsForCategories(report.categories, report.plugins),
562
+ (report) => ({
563
+ message: missingRefsForCategoriesErrorMsg(
564
+ report.categories,
565
+ report.plugins
566
+ )
567
+ })
543
568
  );
544
569
 
545
- // packages/utils/src/lib/constants.ts
546
- var SCORE_COLOR_RANGE = {
547
- GREEN_MIN: 0.9,
548
- YELLOW_MIN: 0.5
549
- };
550
-
551
570
  // packages/utils/src/lib/file-system.ts
552
571
  import { bundleRequire } from "bundle-require";
553
572
  import chalk from "chalk";
@@ -673,7 +692,14 @@ async function importEsmModule(options) {
673
692
  return mod.default;
674
693
  }
675
694
 
676
- // packages/utils/src/lib/report.ts
695
+ // packages/utils/src/lib/reports/constants.ts
696
+ var NEW_LINE = "\n";
697
+ var SCORE_COLOR_RANGE = {
698
+ GREEN_MIN: 0.9,
699
+ YELLOW_MIN: 0.5
700
+ };
701
+
702
+ // packages/utils/src/lib/reports/utils.ts
677
703
  var FOOTER_PREFIX = "Made with \u2764 by";
678
704
  var CODE_PUSHUP_DOMAIN = "code-pushup.dev";
679
705
  var README_LINK = "https://github.com/flowup/quality-metrics-cli#readme";
@@ -956,83 +982,6 @@ function groupByStatus(results) {
956
982
  );
957
983
  }
958
984
 
959
- // packages/utils/src/lib/md/details.ts
960
- function details(title, content, cfg = { open: false }) {
961
- return `<details${cfg.open ? " open" : ""}>
962
- <summary>${title}</summary>
963
- ${content}
964
- </details>
965
- `;
966
- }
967
-
968
- // packages/utils/src/lib/md/headline.ts
969
- function headline(text, hierarchy = 1) {
970
- return `${new Array(hierarchy).fill("#").join("")} ${text}`;
971
- }
972
- function h2(text) {
973
- return headline(text, 2);
974
- }
975
- function h3(text) {
976
- return headline(text, 3);
977
- }
978
-
979
- // packages/utils/src/lib/md/constants.ts
980
- var NEW_LINE = "\n";
981
-
982
- // packages/utils/src/lib/md/table.ts
983
- var alignString = /* @__PURE__ */ new Map([
984
- ["l", ":--"],
985
- ["c", ":--:"],
986
- ["r", "--:"]
987
- ]);
988
- function tableMd(data, align) {
989
- if (data.length === 0) {
990
- throw new Error("Data can't be empty");
991
- }
992
- align = align || data[0]?.map(() => "c");
993
- const _data = data.map((arr) => "|" + arr.join("|") + "|");
994
- const secondRow = "|" + align?.map((s) => alignString.get(s)).join("|") + "|";
995
- return _data.shift() + NEW_LINE + secondRow + NEW_LINE + _data.join(NEW_LINE);
996
- }
997
- function tableHtml(data) {
998
- if (data.length === 0) {
999
- throw new Error("Data can't be empty");
1000
- }
1001
- const _data = data.map((arr, index) => {
1002
- if (index === 0) {
1003
- return "<tr>" + arr.map((s) => `<th>${s}</th>`).join("") + "</tr>";
1004
- }
1005
- return "<tr>" + arr.map((s) => `<td>${s}</td>`).join("") + "</tr>";
1006
- });
1007
- return "<table>" + _data.join("") + "</table>";
1008
- }
1009
-
1010
- // packages/utils/src/lib/md/font-style.ts
1011
- var stylesMap = {
1012
- i: "_",
1013
- // italic
1014
- b: "**",
1015
- // bold
1016
- s: "~",
1017
- // strike through
1018
- c: "`"
1019
- // code
1020
- };
1021
- function style(text, styles = ["b"]) {
1022
- return styles.reduce((t, s) => `${stylesMap[s]}${t}${stylesMap[s]}`, text);
1023
- }
1024
-
1025
- // packages/utils/src/lib/md/link.ts
1026
- function link(href, text) {
1027
- return `[${text || href}](${href})`;
1028
- }
1029
-
1030
- // packages/utils/src/lib/md/list.ts
1031
- function li(text, order = "unordered") {
1032
- const style2 = order === "unordered" ? "-" : "- [ ]";
1033
- return `${style2} ${text}`;
1034
- }
1035
-
1036
985
  // packages/utils/src/lib/progress.ts
1037
986
  import chalk2 from "chalk";
1038
987
  import { MultiProgressBars } from "multi-progress-bars";
@@ -1087,8 +1036,82 @@ function getProgressBar(taskName) {
1087
1036
  };
1088
1037
  }
1089
1038
 
1090
- // packages/utils/src/lib/report-to-md.ts
1091
- function reportToMd(report, commitData) {
1039
+ // packages/utils/src/lib/reports/md/details.ts
1040
+ function details(title, content, cfg = { open: false }) {
1041
+ return `<details${cfg.open ? " open" : ""}>
1042
+ <summary>${title}</summary>
1043
+ ${content}
1044
+ </details>
1045
+ `;
1046
+ }
1047
+
1048
+ // packages/utils/src/lib/reports/md/font-style.ts
1049
+ var stylesMap = {
1050
+ i: "_",
1051
+ // italic
1052
+ b: "**",
1053
+ // bold
1054
+ s: "~",
1055
+ // strike through
1056
+ c: "`"
1057
+ // code
1058
+ };
1059
+ function style(text, styles = ["b"]) {
1060
+ return styles.reduce((t, s) => `${stylesMap[s]}${t}${stylesMap[s]}`, text);
1061
+ }
1062
+
1063
+ // packages/utils/src/lib/reports/md/headline.ts
1064
+ function headline(text, hierarchy = 1) {
1065
+ return `${new Array(hierarchy).fill("#").join("")} ${text}`;
1066
+ }
1067
+ function h2(text) {
1068
+ return headline(text, 2);
1069
+ }
1070
+ function h3(text) {
1071
+ return headline(text, 3);
1072
+ }
1073
+
1074
+ // packages/utils/src/lib/reports/md/link.ts
1075
+ function link(href, text) {
1076
+ return `[${text || href}](${href})`;
1077
+ }
1078
+
1079
+ // packages/utils/src/lib/reports/md/list.ts
1080
+ function li(text, order = "unordered") {
1081
+ const style2 = order === "unordered" ? "-" : "- [ ]";
1082
+ return `${style2} ${text}`;
1083
+ }
1084
+
1085
+ // packages/utils/src/lib/reports/md/table.ts
1086
+ var alignString = /* @__PURE__ */ new Map([
1087
+ ["l", ":--"],
1088
+ ["c", ":--:"],
1089
+ ["r", "--:"]
1090
+ ]);
1091
+ function tableMd(data, align) {
1092
+ if (data.length === 0) {
1093
+ throw new Error("Data can't be empty");
1094
+ }
1095
+ align = align || data[0]?.map(() => "c");
1096
+ const _data = data.map((arr) => "|" + arr.join("|") + "|");
1097
+ const secondRow = "|" + align?.map((s) => alignString.get(s)).join("|") + "|";
1098
+ return _data.shift() + NEW_LINE + secondRow + NEW_LINE + _data.join(NEW_LINE);
1099
+ }
1100
+ function tableHtml(data) {
1101
+ if (data.length === 0) {
1102
+ throw new Error("Data can't be empty");
1103
+ }
1104
+ const _data = data.map((arr, index) => {
1105
+ if (index === 0) {
1106
+ return "<tr>" + arr.map((s) => `<th>${s}</th>`).join("") + "</tr>";
1107
+ }
1108
+ return "<tr>" + arr.map((s) => `<td>${s}</td>`).join("") + "</tr>";
1109
+ });
1110
+ return "<table>" + _data.join("") + "</table>";
1111
+ }
1112
+
1113
+ // packages/utils/src/lib/reports/generate-md-report.ts
1114
+ function generateMdReport(report, commitData) {
1092
1115
  let md = reportToHeaderSection() + NEW_LINE;
1093
1116
  md += reportToOverviewSection(report) + NEW_LINE + NEW_LINE;
1094
1117
  md += reportToCategoriesSection(report) + NEW_LINE + NEW_LINE;
@@ -1269,14 +1292,14 @@ function getAuditResult(audit, isHtml = false) {
1269
1292
  return isHtml ? `<b>${displayValue || value}</b>` : style(String(displayValue || value));
1270
1293
  }
1271
1294
 
1272
- // packages/utils/src/lib/report-to-stdout.ts
1295
+ // packages/utils/src/lib/reports/generate-stdout-summary.ts
1273
1296
  import cliui from "@isaacs/cliui";
1274
1297
  import chalk3 from "chalk";
1275
1298
  import Table from "cli-table3";
1276
1299
  function addLine(line = "") {
1277
1300
  return line + NEW_LINE;
1278
1301
  }
1279
- function reportToStdout(report) {
1302
+ function generateStdoutSummary(report) {
1280
1303
  let output = "";
1281
1304
  output += addLine(reportToHeaderSection2(report));
1282
1305
  output += addLine();
@@ -1369,7 +1392,7 @@ function deepClone(obj) {
1369
1392
  return cloned;
1370
1393
  }
1371
1394
 
1372
- // packages/utils/src/lib/scoring.ts
1395
+ // packages/utils/src/lib/reports/scoring.ts
1373
1396
  function calculateScore(refs, scoreFn) {
1374
1397
  const { numerator, denominator } = refs.reduce(
1375
1398
  (acc, ref) => {
@@ -1437,27 +1460,7 @@ function scoreReport(report) {
1437
1460
  return scoredReport;
1438
1461
  }
1439
1462
 
1440
- // packages/utils/src/lib/verbose-utils.ts
1441
- function getLogVerbose(verbose) {
1442
- return (...args) => {
1443
- if (verbose) {
1444
- console.info(...args);
1445
- }
1446
- };
1447
- }
1448
- function getExecVerbose(verbose) {
1449
- return (fn) => {
1450
- if (verbose) {
1451
- fn();
1452
- }
1453
- };
1454
- }
1455
- var verboseUtils = (verbose) => ({
1456
- log: getLogVerbose(verbose),
1457
- exec: getExecVerbose(verbose)
1458
- });
1459
-
1460
- // packages/utils/src/lib/sort-report.ts
1463
+ // packages/utils/src/lib/reports/sorting.ts
1461
1464
  function sortReport(report) {
1462
1465
  const { categories, plugins } = report;
1463
1466
  const sortedCategories = categories.map((category) => {
@@ -1507,6 +1510,26 @@ function sortReport(report) {
1507
1510
  };
1508
1511
  }
1509
1512
 
1513
+ // packages/utils/src/lib/verbose-utils.ts
1514
+ function getLogVerbose(verbose) {
1515
+ return (...args) => {
1516
+ if (verbose) {
1517
+ console.info(...args);
1518
+ }
1519
+ };
1520
+ }
1521
+ function getExecVerbose(verbose) {
1522
+ return (fn) => {
1523
+ if (verbose) {
1524
+ fn();
1525
+ }
1526
+ };
1527
+ }
1528
+ var verboseUtils = (verbose) => ({
1529
+ log: getLogVerbose(verbose),
1530
+ exec: getExecVerbose(verbose)
1531
+ });
1532
+
1510
1533
  // packages/core/src/lib/implementation/persist.ts
1511
1534
  var PersistDirError = class extends Error {
1512
1535
  constructor(outputDir) {
@@ -1521,7 +1544,7 @@ var PersistError = class extends Error {
1521
1544
  async function persistReport(report, options) {
1522
1545
  const { outputDir, filename, format } = options;
1523
1546
  const sortedScoredReport = sortReport(scoreReport(report));
1524
- console.info(reportToStdout(sortedScoredReport));
1547
+ console.info(generateStdoutSummary(sortedScoredReport));
1525
1548
  const results = [];
1526
1549
  if (format.includes("json")) {
1527
1550
  results.push({
@@ -1534,7 +1557,7 @@ async function persistReport(report, options) {
1534
1557
  validateCommitData(commitData);
1535
1558
  results.push({
1536
1559
  format: "md",
1537
- content: reportToMd(sortedScoredReport, commitData)
1560
+ content: generateMdReport(sortedScoredReport, commitData)
1538
1561
  });
1539
1562
  }
1540
1563
  if (!existsSync(outputDir)) {
@@ -1679,7 +1702,7 @@ function auditOutputsCorrelateWithPluginOutput(auditOutputs, pluginConfigAudits)
1679
1702
 
1680
1703
  // packages/core/package.json
1681
1704
  var name = "@code-pushup/core";
1682
- var version = "0.8.10";
1705
+ var version = "0.8.12";
1683
1706
 
1684
1707
  // packages/core/src/lib/implementation/collect.ts
1685
1708
  async function collect(options) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/core",
3
- "version": "0.8.10",
3
+ "version": "0.8.12",
4
4
  "dependencies": {
5
5
  "@code-pushup/models": "*",
6
6
  "@code-pushup/utils": "*",
@@ -1,8 +1,8 @@
1
1
  import { CategoryConfigRefType, IssueSourceType, IssueSeverity as PortalIssueSeverity } from '@code-pushup/portal-client';
2
2
  import { Report } from '@code-pushup/models';
3
3
  export declare function jsonToGql(report: Report): {
4
- packageName: string | undefined;
5
- packageVersion: string | undefined;
4
+ packageName: string;
5
+ packageVersion: string;
6
6
  commandStartDate: string;
7
7
  commandDuration: number;
8
8
  plugins: {
@@ -38,7 +38,7 @@ export declare function jsonToGql(report: Report): {
38
38
  weight: number;
39
39
  }[];
40
40
  }[] | undefined;
41
- icon: "slug" | "search" | "blink" | "key" | "folder-robot" | "folder-src" | "folder-dist" | "folder-css" | "folder-sass" | "folder-images" | "folder-scripts" | "folder-node" | "folder-javascript" | "folder-json" | "folder-font" | "folder-bower" | "folder-test" | "folder-jinja" | "folder-markdown" | "folder-php" | "folder-phpmailer" | "folder-sublime" | "folder-docs" | "folder-git" | "folder-github" | "folder-gitlab" | "folder-vscode" | "folder-views" | "folder-vue" | "folder-vuepress" | "folder-expo" | "folder-config" | "folder-i18n" | "folder-components" | "folder-verdaccio" | "folder-aurelia" | "folder-resource" | "folder-lib" | "folder-theme" | "folder-webpack" | "folder-global" | "folder-public" | "folder-include" | "folder-docker" | "folder-database" | "folder-log" | "folder-target" | "folder-temp" | "folder-aws" | "folder-audio" | "folder-video" | "folder-kubernetes" | "folder-import" | "folder-export" | "folder-wakatime" | "folder-circleci" | "folder-wordpress" | "folder-gradle" | "folder-coverage" | "folder-class" | "folder-other" | "folder-lua" | "folder-typescript" | "folder-graphql" | "folder-routes" | "folder-ci" | "folder-benchmark" | "folder-messages" | "folder-less" | "folder-gulp" | "folder-python" | "folder-mojo" | "folder-moon" | "folder-debug" | "folder-fastlane" | "folder-plugin" | "folder-middleware" | "folder-controller" | "folder-ansible" | "folder-server" | "folder-client" | "folder-tasks" | "folder-android" | "folder-ios" | "folder-upload" | "folder-download" | "folder-tools" | "folder-helper" | "folder-serverless" | "folder-api" | "folder-app" | "folder-apollo" | "folder-archive" | "folder-batch" | "folder-buildkite" | "folder-cluster" | "folder-command" | "folder-constant" | "folder-container" | "folder-content" | "folder-context" | "folder-core" | "folder-delta" | "folder-dump" | "folder-examples" | "folder-environment" | "folder-functions" | "folder-generator" | "folder-hook" | "folder-job" | "folder-keys" | "folder-layout" | "folder-mail" | "folder-mappings" | "folder-meta" | "folder-changesets" | "folder-packages" | "folder-shared" | "folder-shader" | "folder-stack" | "folder-template" | "folder-utils" | "folder-supabase" | "folder-private" | "folder-linux" | "folder-windows" | "folder-macos" | "folder-error" | "folder-event" | "folder-secure" | "folder-custom" | "folder-mock" | "folder-syntax" | "folder-vm" | "folder-stylus" | "folder-flow" | "folder-rules" | "folder-review" | "folder-animation" | "folder-guard" | "folder-prisma" | "folder-pipe" | "folder-svg" | "folder-terraform" | "folder-mobile" | "folder-stencil" | "folder-firebase" | "folder-svelte" | "folder-update" | "folder-intellij" | "folder-azure-pipelines" | "folder-mjml" | "folder-admin" | "folder-scala" | "folder-connection" | "folder-quasar" | "folder-next" | "folder-cobol" | "folder-yarn" | "folder-husky" | "folder-storybook" | "folder-base" | "folder-cart" | "folder-home" | "folder-project" | "folder-interface" | "folder-netlify" | "folder-enum" | "folder-contract" | "folder-queue" | "folder-vercel" | "folder-cypress" | "folder-decorators" | "folder-java" | "folder-resolver" | "folder-angular" | "folder-unity" | "folder-pdf" | "folder-proto" | "folder-plastic" | "folder-gamemaker" | "folder-mercurial" | "folder-godot" | "folder-lottie" | "folder-taskfile" | "folder-robot-open" | "folder-src-open" | "folder-dist-open" | "folder-css-open" | "folder-sass-open" | "folder-images-open" | "folder-scripts-open" | "folder-node-open" | "folder-javascript-open" | "folder-json-open" | "folder-font-open" | "folder-bower-open" | "folder-test-open" | "folder-jinja-open" | "folder-markdown-open" | "folder-php-open" | "folder-phpmailer-open" | "folder-sublime-open" | "folder-docs-open" | "folder-git-open" | "folder-github-open" | "folder-gitlab-open" | "folder-vscode-open" | "folder-views-open" | "folder-vue-open" | "folder-vuepress-open" | "folder-expo-open" | "folder-config-open" | "folder-i18n-open" | "folder-components-open" | "folder-verdaccio-open" | "folder-aurelia-open" | "folder-resource-open" | "folder-lib-open" | "folder-theme-open" | "folder-webpack-open" | "folder-global-open" | "folder-public-open" | "folder-include-open" | "folder-docker-open" | "folder-database-open" | "folder-log-open" | "folder-target-open" | "folder-temp-open" | "folder-aws-open" | "folder-audio-open" | "folder-video-open" | "folder-kubernetes-open" | "folder-import-open" | "folder-export-open" | "folder-wakatime-open" | "folder-circleci-open" | "folder-wordpress-open" | "folder-gradle-open" | "folder-coverage-open" | "folder-class-open" | "folder-other-open" | "folder-lua-open" | "folder-typescript-open" | "folder-graphql-open" | "folder-routes-open" | "folder-ci-open" | "folder-benchmark-open" | "folder-messages-open" | "folder-less-open" | "folder-gulp-open" | "folder-python-open" | "folder-mojo-open" | "folder-moon-open" | "folder-debug-open" | "folder-fastlane-open" | "folder-plugin-open" | "folder-middleware-open" | "folder-controller-open" | "folder-ansible-open" | "folder-server-open" | "folder-client-open" | "folder-tasks-open" | "folder-android-open" | "folder-ios-open" | "folder-upload-open" | "folder-download-open" | "folder-tools-open" | "folder-helper-open" | "folder-serverless-open" | "folder-api-open" | "folder-app-open" | "folder-apollo-open" | "folder-archive-open" | "folder-batch-open" | "folder-buildkite-open" | "folder-cluster-open" | "folder-command-open" | "folder-constant-open" | "folder-container-open" | "folder-content-open" | "folder-context-open" | "folder-core-open" | "folder-delta-open" | "folder-dump-open" | "folder-examples-open" | "folder-environment-open" | "folder-functions-open" | "folder-generator-open" | "folder-hook-open" | "folder-job-open" | "folder-keys-open" | "folder-layout-open" | "folder-mail-open" | "folder-mappings-open" | "folder-meta-open" | "folder-changesets-open" | "folder-packages-open" | "folder-shared-open" | "folder-shader-open" | "folder-stack-open" | "folder-template-open" | "folder-utils-open" | "folder-supabase-open" | "folder-private-open" | "folder-linux-open" | "folder-windows-open" | "folder-macos-open" | "folder-error-open" | "folder-event-open" | "folder-secure-open" | "folder-custom-open" | "folder-mock-open" | "folder-syntax-open" | "folder-vm-open" | "folder-stylus-open" | "folder-flow-open" | "folder-rules-open" | "folder-review-open" | "folder-animation-open" | "folder-guard-open" | "folder-prisma-open" | "folder-pipe-open" | "folder-svg-open" | "folder-terraform-open" | "folder-mobile-open" | "folder-stencil-open" | "folder-firebase-open" | "folder-svelte-open" | "folder-update-open" | "folder-intellij-open" | "folder-azure-pipelines-open" | "folder-mjml-open" | "folder-admin-open" | "folder-scala-open" | "folder-connection-open" | "folder-quasar-open" | "folder-next-open" | "folder-cobol-open" | "folder-yarn-open" | "folder-husky-open" | "folder-storybook-open" | "folder-base-open" | "folder-cart-open" | "folder-home-open" | "folder-project-open" | "folder-interface-open" | "folder-netlify-open" | "folder-enum-open" | "folder-contract-open" | "folder-queue-open" | "folder-vercel-open" | "folder-cypress-open" | "folder-decorators-open" | "folder-java-open" | "folder-resolver-open" | "folder-angular-open" | "folder-unity-open" | "folder-pdf-open" | "folder-proto-open" | "folder-plastic-open" | "folder-gamemaker-open" | "folder-mercurial-open" | "folder-godot-open" | "folder-lottie-open" | "folder-taskfile-open" | "html" | "pug" | "markdown" | "css" | "sass" | "less" | "json" | "hjson" | "jinja" | "proto" | "sublime" | "twine" | "yaml" | "xml" | "image" | "javascript" | "react" | "react_ts" | "routing" | "settings" | "typescript-def" | "markojs" | "astro" | "pdf" | "table" | "vscode" | "visualstudio" | "database" | "kusto" | "csharp" | "qsharp" | "zip" | "vala" | "zig" | "exe" | "hex" | "java" | "jar" | "javaclass" | "c" | "h" | "cpp" | "hpp" | "objective-c" | "objective-cpp" | "rc" | "go" | "python" | "python-misc" | "url" | "console" | "powershell" | "gradle" | "word" | "certificate" | "font" | "lib" | "ruby" | "fsharp" | "swift" | "arduino" | "docker" | "tex" | "powerpoint" | "video" | "virtual" | "email" | "audio" | "coffee" | "document" | "graphql" | "rust" | "raml" | "xaml" | "haskell" | "kotlin" | "otne" | "git" | "lua" | "clojure" | "groovy" | "r" | "dart" | "dart_generated" | "actionscript" | "mxml" | "autohotkey" | "flash" | "swc" | "cmake" | "assembly" | "vue" | "ocaml" | "odin" | "javascript-map" | "css-map" | "lock" | "handlebars" | "perl" | "haxe" | "test-ts" | "test-jsx" | "test-js" | "angular" | "angular-component" | "angular-guard" | "angular-service" | "angular-pipe" | "angular-directive" | "angular-resolver" | "puppet" | "elixir" | "livescript" | "erlang" | "twig" | "julia" | "elm" | "purescript" | "smarty" | "stylus" | "reason" | "bucklescript" | "merlin" | "verilog" | "mathematica" | "wolframlanguage" | "nunjucks" | "robot" | "solidity" | "autoit" | "haml" | "yang" | "mjml" | "terraform" | "laravel" | "applescript" | "cake" | "cucumber" | "nim" | "apiblueprint" | "riot" | "vfl" | "kl" | "postcss" | "todo" | "coldfusion" | "cabal" | "nix" | "slim" | "http" | "restql" | "kivy" | "graphcool" | "sbt" | "android" | "tune" | "gitlab" | "jenkins" | "figma" | "crystal" | "drone" | "cuda" | "log" | "dotjs" | "ejs" | "wakatime" | "processing" | "storybook" | "wepy" | "hcl" | "san" | "django" | "red" | "makefile" | "foxpro" | "i18n" | "webassembly" | "jupyter" | "d" | "mdx" | "mdsvex" | "ballerina" | "racket" | "bazel" | "mint" | "velocity" | "godot" | "godot-assets" | "azure-pipelines" | "azure" | "vagrant" | "prisma" | "razor" | "abc" | "asciidoc" | "edge" | "scheme" | "lisp" | "3d" | "svg" | "svelte" | "vim" | "moonscript" | "advpl_prw" | "advpl_ptm" | "advpl_tlpp" | "advpl_include" | "disc" | "fortran" | "tcl" | "liquid" | "prolog" | "coconut" | "sketch" | "pawn" | "forth" | "uml" | "meson" | "dhall" | "sml" | "opam" | "imba" | "drawio" | "pascal" | "shaderlab" | "sas" | "nuget" | "command" | "denizenscript" | "nginx" | "minecraft" | "rescript" | "rescript-interface" | "brainfuck" | "bicep" | "cobol" | "grain" | "lolcode" | "idris" | "pipeline" | "opa" | "windicss" | "scala" | "lilypond" | "vlang" | "chess" | "gemini" | "tsconfig" | "tauri" | "jsconfig" | "ada" | "horusec" | "coala" | "dinophp" | "teal" | "template" | "shader" | "siyuan" | "ndst" | "tobi" | "gleam" | "steadybit" | "tree" | "cadence" | "antlr" | "stylable" | "pinejs" | "taskfile" | "gamemaker" | "tldraw" | "typst" | "mermaid" | "mojo" | "roblox" | "spwn" | "templ" | "chrome" | "stan" | "abap" | "lottie" | "apps-script" | "playwright" | "go-mod" | "gemfile" | "rubocop" | "rspec" | "semgrep" | "vue-config" | "nuxt" | "vercel" | "verdaccio" | "next" | "remix" | "posthtml" | "webpack" | "ionic" | "gulp" | "nodejs" | "npm" | "yarn" | "turborepo" | "babel" | "blitz" | "contributing" | "readme" | "changelog" | "architecture" | "credits" | "authors" | "flow" | "favicon" | "karma" | "bithound" | "svgo" | "appveyor" | "travis" | "codecov" | "sonarcloud" | "protractor" | "fusebox" | "heroku" | "editorconfig" | "bower" | "eslint" | "conduct" | "watchman" | "aurelia" | "auto" | "mocha" | "firebase" | "rollup" | "hack" | "hardhat" | "stylelint" | "code-climate" | "prettier" | "renovate" | "apollo" | "nodemon" | "webhint" | "browserlist" | "snyk" | "sequelize" | "gatsby" | "circleci" | "cloudfoundry" | "grunt" | "jest" | "fastlane" | "helm" | "wallaby" | "stencil" | "semantic-release" | "bitbucket" | "istanbul" | "tailwindcss" | "buildkite" | "netlify" | "nest" | "moon" | "percy" | "gitpod" | "codeowners" | "gcp" | "husky" | "tilt" | "capacitor" | "adonis" | "commitlint" | "buck" | "nrwl" | "dune" | "roadmap" | "stryker" | "modernizr" | "stitches" | "replit" | "snowpack" | "quasar" | "dependabot" | "vite" | "vitest" | "lerna" | "textlint" | "sentry" | "phpunit" | "php-cs-fixer" | "robots" | "maven" | "serverless" | "supabase" | "ember" | "poetry" | "parcel" | "astyle" | "lighthouse" | "svgr" | "rome" | "cypress" | "plop" | "tobimake" | "pnpm" | "gridsome" | "caddy" | "bun" | "nano-staged" | "craco" | "mercurial" | "deno" | "plastic" | "unocss" | "ifanr-cloud" | "concourse" | "werf" | "panda" | "biome" | "esbuild" | "puppeteer" | "kubernetes" | "matlab" | "diff" | "typescript" | "php" | "salesforce" | "blink_light" | "jinja_light" | "crystal_light" | "drone_light" | "wakatime_light" | "hcl_light" | "uml_light" | "chess_light" | "tldraw_light" | "rubocop_light" | "vercel_light" | "next_light" | "remix_light" | "turborepo_light" | "auto_light" | "stylelint_light" | "code-climate_light" | "browserlist_light" | "circleci_light" | "semantic-release_light" | "netlify_light" | "stitches_light" | "snowpack_light" | "pnpm_light" | "bun_light" | "nano-staged_light" | "deno_light" | "folder-jinja_light" | "folder-intellij_light" | "folder-jinja-open_light" | "folder-intellij-open_light" | "file" | "folder" | "folder-open" | "folder-root" | "folder-root-open" | "php_elephant" | "php_elephant_pink" | "go_gopher" | "nodejs_alt" | "silverstripe";
41
+ icon: "slug" | "file" | "command" | "search" | "blink" | "key" | "folder-robot" | "folder-src" | "folder-dist" | "folder-css" | "folder-sass" | "folder-images" | "folder-scripts" | "folder-node" | "folder-javascript" | "folder-json" | "folder-font" | "folder-bower" | "folder-test" | "folder-jinja" | "folder-markdown" | "folder-php" | "folder-phpmailer" | "folder-sublime" | "folder-docs" | "folder-git" | "folder-github" | "folder-gitlab" | "folder-vscode" | "folder-views" | "folder-vue" | "folder-vuepress" | "folder-expo" | "folder-config" | "folder-i18n" | "folder-components" | "folder-verdaccio" | "folder-aurelia" | "folder-resource" | "folder-lib" | "folder-theme" | "folder-webpack" | "folder-global" | "folder-public" | "folder-include" | "folder-docker" | "folder-database" | "folder-log" | "folder-target" | "folder-temp" | "folder-aws" | "folder-audio" | "folder-video" | "folder-kubernetes" | "folder-import" | "folder-export" | "folder-wakatime" | "folder-circleci" | "folder-wordpress" | "folder-gradle" | "folder-coverage" | "folder-class" | "folder-other" | "folder-lua" | "folder-typescript" | "folder-graphql" | "folder-routes" | "folder-ci" | "folder-benchmark" | "folder-messages" | "folder-less" | "folder-gulp" | "folder-python" | "folder-mojo" | "folder-moon" | "folder-debug" | "folder-fastlane" | "folder-plugin" | "folder-middleware" | "folder-controller" | "folder-ansible" | "folder-server" | "folder-client" | "folder-tasks" | "folder-android" | "folder-ios" | "folder-upload" | "folder-download" | "folder-tools" | "folder-helper" | "folder-serverless" | "folder-api" | "folder-app" | "folder-apollo" | "folder-archive" | "folder-batch" | "folder-buildkite" | "folder-cluster" | "folder-command" | "folder-constant" | "folder-container" | "folder-content" | "folder-context" | "folder-core" | "folder-delta" | "folder-dump" | "folder-examples" | "folder-environment" | "folder-functions" | "folder-generator" | "folder-hook" | "folder-job" | "folder-keys" | "folder-layout" | "folder-mail" | "folder-mappings" | "folder-meta" | "folder-changesets" | "folder-packages" | "folder-shared" | "folder-shader" | "folder-stack" | "folder-template" | "folder-utils" | "folder-supabase" | "folder-private" | "folder-linux" | "folder-windows" | "folder-macos" | "folder-error" | "folder-event" | "folder-secure" | "folder-custom" | "folder-mock" | "folder-syntax" | "folder-vm" | "folder-stylus" | "folder-flow" | "folder-rules" | "folder-review" | "folder-animation" | "folder-guard" | "folder-prisma" | "folder-pipe" | "folder-svg" | "folder-terraform" | "folder-mobile" | "folder-stencil" | "folder-firebase" | "folder-svelte" | "folder-update" | "folder-intellij" | "folder-azure-pipelines" | "folder-mjml" | "folder-admin" | "folder-scala" | "folder-connection" | "folder-quasar" | "folder-next" | "folder-cobol" | "folder-yarn" | "folder-husky" | "folder-storybook" | "folder-base" | "folder-cart" | "folder-home" | "folder-project" | "folder-interface" | "folder-netlify" | "folder-enum" | "folder-contract" | "folder-queue" | "folder-vercel" | "folder-cypress" | "folder-decorators" | "folder-java" | "folder-resolver" | "folder-angular" | "folder-unity" | "folder-pdf" | "folder-proto" | "folder-plastic" | "folder-gamemaker" | "folder-mercurial" | "folder-godot" | "folder-lottie" | "folder-taskfile" | "folder-robot-open" | "folder-src-open" | "folder-dist-open" | "folder-css-open" | "folder-sass-open" | "folder-images-open" | "folder-scripts-open" | "folder-node-open" | "folder-javascript-open" | "folder-json-open" | "folder-font-open" | "folder-bower-open" | "folder-test-open" | "folder-jinja-open" | "folder-markdown-open" | "folder-php-open" | "folder-phpmailer-open" | "folder-sublime-open" | "folder-docs-open" | "folder-git-open" | "folder-github-open" | "folder-gitlab-open" | "folder-vscode-open" | "folder-views-open" | "folder-vue-open" | "folder-vuepress-open" | "folder-expo-open" | "folder-config-open" | "folder-i18n-open" | "folder-components-open" | "folder-verdaccio-open" | "folder-aurelia-open" | "folder-resource-open" | "folder-lib-open" | "folder-theme-open" | "folder-webpack-open" | "folder-global-open" | "folder-public-open" | "folder-include-open" | "folder-docker-open" | "folder-database-open" | "folder-log-open" | "folder-target-open" | "folder-temp-open" | "folder-aws-open" | "folder-audio-open" | "folder-video-open" | "folder-kubernetes-open" | "folder-import-open" | "folder-export-open" | "folder-wakatime-open" | "folder-circleci-open" | "folder-wordpress-open" | "folder-gradle-open" | "folder-coverage-open" | "folder-class-open" | "folder-other-open" | "folder-lua-open" | "folder-typescript-open" | "folder-graphql-open" | "folder-routes-open" | "folder-ci-open" | "folder-benchmark-open" | "folder-messages-open" | "folder-less-open" | "folder-gulp-open" | "folder-python-open" | "folder-mojo-open" | "folder-moon-open" | "folder-debug-open" | "folder-fastlane-open" | "folder-plugin-open" | "folder-middleware-open" | "folder-controller-open" | "folder-ansible-open" | "folder-server-open" | "folder-client-open" | "folder-tasks-open" | "folder-android-open" | "folder-ios-open" | "folder-upload-open" | "folder-download-open" | "folder-tools-open" | "folder-helper-open" | "folder-serverless-open" | "folder-api-open" | "folder-app-open" | "folder-apollo-open" | "folder-archive-open" | "folder-batch-open" | "folder-buildkite-open" | "folder-cluster-open" | "folder-command-open" | "folder-constant-open" | "folder-container-open" | "folder-content-open" | "folder-context-open" | "folder-core-open" | "folder-delta-open" | "folder-dump-open" | "folder-examples-open" | "folder-environment-open" | "folder-functions-open" | "folder-generator-open" | "folder-hook-open" | "folder-job-open" | "folder-keys-open" | "folder-layout-open" | "folder-mail-open" | "folder-mappings-open" | "folder-meta-open" | "folder-changesets-open" | "folder-packages-open" | "folder-shared-open" | "folder-shader-open" | "folder-stack-open" | "folder-template-open" | "folder-utils-open" | "folder-supabase-open" | "folder-private-open" | "folder-linux-open" | "folder-windows-open" | "folder-macos-open" | "folder-error-open" | "folder-event-open" | "folder-secure-open" | "folder-custom-open" | "folder-mock-open" | "folder-syntax-open" | "folder-vm-open" | "folder-stylus-open" | "folder-flow-open" | "folder-rules-open" | "folder-review-open" | "folder-animation-open" | "folder-guard-open" | "folder-prisma-open" | "folder-pipe-open" | "folder-svg-open" | "folder-terraform-open" | "folder-mobile-open" | "folder-stencil-open" | "folder-firebase-open" | "folder-svelte-open" | "folder-update-open" | "folder-intellij-open" | "folder-azure-pipelines-open" | "folder-mjml-open" | "folder-admin-open" | "folder-scala-open" | "folder-connection-open" | "folder-quasar-open" | "folder-next-open" | "folder-cobol-open" | "folder-yarn-open" | "folder-husky-open" | "folder-storybook-open" | "folder-base-open" | "folder-cart-open" | "folder-home-open" | "folder-project-open" | "folder-interface-open" | "folder-netlify-open" | "folder-enum-open" | "folder-contract-open" | "folder-queue-open" | "folder-vercel-open" | "folder-cypress-open" | "folder-decorators-open" | "folder-java-open" | "folder-resolver-open" | "folder-angular-open" | "folder-unity-open" | "folder-pdf-open" | "folder-proto-open" | "folder-plastic-open" | "folder-gamemaker-open" | "folder-mercurial-open" | "folder-godot-open" | "folder-lottie-open" | "folder-taskfile-open" | "html" | "pug" | "markdown" | "css" | "sass" | "less" | "json" | "hjson" | "jinja" | "proto" | "sublime" | "twine" | "yaml" | "xml" | "image" | "javascript" | "react" | "react_ts" | "routing" | "settings" | "typescript-def" | "markojs" | "astro" | "pdf" | "table" | "vscode" | "visualstudio" | "database" | "kusto" | "csharp" | "qsharp" | "zip" | "vala" | "zig" | "exe" | "hex" | "java" | "jar" | "javaclass" | "c" | "h" | "cpp" | "hpp" | "objective-c" | "objective-cpp" | "rc" | "go" | "python" | "python-misc" | "url" | "console" | "powershell" | "gradle" | "word" | "certificate" | "font" | "lib" | "ruby" | "fsharp" | "swift" | "arduino" | "docker" | "tex" | "powerpoint" | "video" | "virtual" | "email" | "audio" | "coffee" | "document" | "graphql" | "rust" | "raml" | "xaml" | "haskell" | "kotlin" | "otne" | "git" | "lua" | "clojure" | "groovy" | "r" | "dart" | "dart_generated" | "actionscript" | "mxml" | "autohotkey" | "flash" | "swc" | "cmake" | "assembly" | "vue" | "ocaml" | "odin" | "javascript-map" | "css-map" | "lock" | "handlebars" | "perl" | "haxe" | "test-ts" | "test-jsx" | "test-js" | "angular" | "angular-component" | "angular-guard" | "angular-service" | "angular-pipe" | "angular-directive" | "angular-resolver" | "puppet" | "elixir" | "livescript" | "erlang" | "twig" | "julia" | "elm" | "purescript" | "smarty" | "stylus" | "reason" | "bucklescript" | "merlin" | "verilog" | "mathematica" | "wolframlanguage" | "nunjucks" | "robot" | "solidity" | "autoit" | "haml" | "yang" | "mjml" | "terraform" | "laravel" | "applescript" | "cake" | "cucumber" | "nim" | "apiblueprint" | "riot" | "vfl" | "kl" | "postcss" | "todo" | "coldfusion" | "cabal" | "nix" | "slim" | "http" | "restql" | "kivy" | "graphcool" | "sbt" | "android" | "tune" | "gitlab" | "jenkins" | "figma" | "crystal" | "drone" | "cuda" | "log" | "dotjs" | "ejs" | "wakatime" | "processing" | "storybook" | "wepy" | "hcl" | "san" | "django" | "red" | "makefile" | "foxpro" | "i18n" | "webassembly" | "jupyter" | "d" | "mdx" | "mdsvex" | "ballerina" | "racket" | "bazel" | "mint" | "velocity" | "godot" | "godot-assets" | "azure-pipelines" | "azure" | "vagrant" | "prisma" | "razor" | "abc" | "asciidoc" | "edge" | "scheme" | "lisp" | "3d" | "svg" | "svelte" | "vim" | "moonscript" | "advpl_prw" | "advpl_ptm" | "advpl_tlpp" | "advpl_include" | "disc" | "fortran" | "tcl" | "liquid" | "prolog" | "coconut" | "sketch" | "pawn" | "forth" | "uml" | "meson" | "dhall" | "sml" | "opam" | "imba" | "drawio" | "pascal" | "shaderlab" | "sas" | "nuget" | "denizenscript" | "nginx" | "minecraft" | "rescript" | "rescript-interface" | "brainfuck" | "bicep" | "cobol" | "grain" | "lolcode" | "idris" | "pipeline" | "opa" | "windicss" | "scala" | "lilypond" | "vlang" | "chess" | "gemini" | "tsconfig" | "tauri" | "jsconfig" | "ada" | "horusec" | "coala" | "dinophp" | "teal" | "template" | "shader" | "siyuan" | "ndst" | "tobi" | "gleam" | "steadybit" | "tree" | "cadence" | "antlr" | "stylable" | "pinejs" | "taskfile" | "gamemaker" | "tldraw" | "typst" | "mermaid" | "mojo" | "roblox" | "spwn" | "templ" | "chrome" | "stan" | "abap" | "lottie" | "apps-script" | "playwright" | "go-mod" | "gemfile" | "rubocop" | "rspec" | "semgrep" | "vue-config" | "nuxt" | "vercel" | "verdaccio" | "next" | "remix" | "posthtml" | "webpack" | "ionic" | "gulp" | "nodejs" | "npm" | "yarn" | "turborepo" | "babel" | "blitz" | "contributing" | "readme" | "changelog" | "architecture" | "credits" | "authors" | "flow" | "favicon" | "karma" | "bithound" | "svgo" | "appveyor" | "travis" | "codecov" | "sonarcloud" | "protractor" | "fusebox" | "heroku" | "editorconfig" | "bower" | "eslint" | "conduct" | "watchman" | "aurelia" | "auto" | "mocha" | "firebase" | "rollup" | "hack" | "hardhat" | "stylelint" | "code-climate" | "prettier" | "renovate" | "apollo" | "nodemon" | "webhint" | "browserlist" | "snyk" | "sequelize" | "gatsby" | "circleci" | "cloudfoundry" | "grunt" | "jest" | "fastlane" | "helm" | "wallaby" | "stencil" | "semantic-release" | "bitbucket" | "istanbul" | "tailwindcss" | "buildkite" | "netlify" | "nest" | "moon" | "percy" | "gitpod" | "codeowners" | "gcp" | "husky" | "tilt" | "capacitor" | "adonis" | "commitlint" | "buck" | "nrwl" | "dune" | "roadmap" | "stryker" | "modernizr" | "stitches" | "replit" | "snowpack" | "quasar" | "dependabot" | "vite" | "vitest" | "lerna" | "textlint" | "sentry" | "phpunit" | "php-cs-fixer" | "robots" | "maven" | "serverless" | "supabase" | "ember" | "poetry" | "parcel" | "astyle" | "lighthouse" | "svgr" | "rome" | "cypress" | "plop" | "tobimake" | "pnpm" | "gridsome" | "caddy" | "bun" | "nano-staged" | "craco" | "mercurial" | "deno" | "plastic" | "unocss" | "ifanr-cloud" | "concourse" | "werf" | "panda" | "biome" | "esbuild" | "puppeteer" | "kubernetes" | "matlab" | "diff" | "typescript" | "php" | "salesforce" | "blink_light" | "jinja_light" | "crystal_light" | "drone_light" | "wakatime_light" | "hcl_light" | "uml_light" | "chess_light" | "tldraw_light" | "rubocop_light" | "vercel_light" | "next_light" | "remix_light" | "turborepo_light" | "auto_light" | "stylelint_light" | "code-climate_light" | "browserlist_light" | "circleci_light" | "semantic-release_light" | "netlify_light" | "stitches_light" | "snowpack_light" | "pnpm_light" | "bun_light" | "nano-staged_light" | "deno_light" | "folder-jinja_light" | "folder-intellij_light" | "folder-jinja-open_light" | "folder-intellij-open_light" | "folder" | "folder-open" | "folder-root" | "folder-root-open" | "php_elephant" | "php_elephant_pink" | "go_gopher" | "nodejs_alt" | "silverstripe";
42
42
  slug: string;
43
43
  title: string;
44
44
  packageName: string | undefined;