@code-pushup/core 0.8.9 → 0.8.11

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
@@ -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,10 +553,18 @@ 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
570
  // packages/utils/src/lib/constants.ts
@@ -808,13 +833,13 @@ function getGroupWithAudits(refSlug, refPlugin, plugins) {
808
833
  },
809
834
  []
810
835
  );
811
- const audits = groupAudits.sort(sortCategoryAudits);
836
+ const audits = groupAudits.sort(compareCategoryAudits);
812
837
  return {
813
838
  ...groupWithAudits,
814
839
  audits
815
840
  };
816
841
  }
817
- function sortCategoryAudits(a, b) {
842
+ function compareCategoryAudits(a, b) {
818
843
  if (a.weight !== b.weight) {
819
844
  return b.weight - a.weight;
820
845
  }
@@ -826,7 +851,7 @@ function sortCategoryAudits(a, b) {
826
851
  }
827
852
  return a.title.localeCompare(b.title);
828
853
  }
829
- function sortAudits(a, b) {
854
+ function compareAudits(a, b) {
830
855
  if (a.score !== b.score) {
831
856
  return a.score - b.score;
832
857
  }
@@ -1120,23 +1145,18 @@ function reportToCategoriesSection(report) {
1120
1145
  category.score
1121
1146
  )} Score: ${style(formatReportScore(category.score))}`;
1122
1147
  const categoryDocs = getDocsAndDescription(category);
1123
- const auditsAndGroups = category.refs.reduce(
1124
- (acc2, ref) => ({
1125
- ...acc2,
1126
- ...ref.type === "group" ? {
1127
- groups: [
1128
- ...acc2.groups,
1129
- getGroupWithAudits(ref.slug, ref.plugin, plugins)
1130
- ]
1131
- } : {
1132
- audits: [...acc2.audits, getAuditByRef(ref, plugins)]
1133
- }
1134
- }),
1135
- { groups: [], audits: [] }
1136
- );
1137
- const audits = auditsAndGroups.audits.sort(sortCategoryAudits).map((audit) => auditItemToCategorySection(audit, plugins)).join(NEW_LINE);
1138
- const groups = auditsAndGroups.groups.map((group) => groupItemToCategorySection(group, plugins)).join("");
1139
- return acc + NEW_LINE + categoryTitle + NEW_LINE + NEW_LINE + categoryDocs + categoryScore + NEW_LINE + groups + NEW_LINE + audits;
1148
+ const categoryMDItems = category.refs.reduce((acc2, ref) => {
1149
+ if (ref.type === "group") {
1150
+ const group = getGroupWithAudits(ref.slug, ref.plugin, plugins);
1151
+ const mdGroupItem = groupItemToCategorySection(group, plugins);
1152
+ return acc2 + mdGroupItem + NEW_LINE;
1153
+ } else {
1154
+ const audit = getAuditByRef(ref, plugins);
1155
+ const mdAuditItem = auditItemToCategorySection(audit, plugins);
1156
+ return acc2 + mdAuditItem + NEW_LINE;
1157
+ }
1158
+ }, "");
1159
+ return acc + NEW_LINE + categoryTitle + NEW_LINE + NEW_LINE + categoryDocs + categoryScore + NEW_LINE + categoryMDItems;
1140
1160
  }, "");
1141
1161
  return h2("\u{1F3F7} Categories") + NEW_LINE + categoryDetails;
1142
1162
  }
@@ -1175,7 +1195,7 @@ function groupItemToCategorySection(group, plugins) {
1175
1195
  }
1176
1196
  function reportToAuditsSection(report) {
1177
1197
  const auditsSection = report.plugins.reduce((acc, plugin) => {
1178
- const auditsData = plugin.audits.sort(sortAudits).reduce((acc2, audit) => {
1198
+ const auditsData = plugin.audits.reduce((acc2, audit) => {
1179
1199
  const auditTitle = `${audit.title} (${getPluginNameFromSlug(
1180
1200
  audit.plugin,
1181
1201
  report.plugins
@@ -1198,7 +1218,7 @@ function reportToAuditsSection(report) {
1198
1218
  }
1199
1219
  const detailsTableData = [
1200
1220
  detailsTableHeaders,
1201
- ...audit.details.issues.sort(compareIssues).map((issue) => {
1221
+ ...audit.details.issues.map((issue) => {
1202
1222
  const severity = `${getSeverityIcon(issue.severity)} <i>${issue.severity}</i>`;
1203
1223
  const message = issue.message;
1204
1224
  if (!issue.source) {
@@ -1302,7 +1322,7 @@ function reportToDetailSection(report) {
1302
1322
  output += addLine(chalk3.magentaBright.bold(`${title} audits`));
1303
1323
  output += addLine();
1304
1324
  const ui = cliui({ width: 80 });
1305
- audits.sort(sortAudits).forEach(({ score, title: title2, displayValue, value }) => {
1325
+ audits.forEach(({ score, title: title2, displayValue, value }) => {
1306
1326
  ui.div(
1307
1327
  {
1308
1328
  text: withColor({ score, text: "\u25CF" }),
@@ -1462,6 +1482,56 @@ var verboseUtils = (verbose) => ({
1462
1482
  exec: getExecVerbose(verbose)
1463
1483
  });
1464
1484
 
1485
+ // packages/utils/src/lib/sort-report.ts
1486
+ function sortReport(report) {
1487
+ const { categories, plugins } = report;
1488
+ const sortedCategories = categories.map((category) => {
1489
+ const { audits, groups } = category.refs.reduce(
1490
+ (acc, ref) => ({
1491
+ ...acc,
1492
+ ...ref.type === "group" ? {
1493
+ groups: [
1494
+ ...acc.groups,
1495
+ getGroupWithAudits(ref.slug, ref.plugin, plugins)
1496
+ ]
1497
+ } : {
1498
+ audits: [...acc.audits, getAuditByRef(ref, plugins)]
1499
+ }
1500
+ }),
1501
+ { groups: [], audits: [] }
1502
+ );
1503
+ const sortedAuditsAndGroups = [
1504
+ ...groups,
1505
+ ...audits.sort(compareCategoryAudits)
1506
+ ];
1507
+ const sortedRefs = category.refs.slice().sort((a, b) => {
1508
+ const aIndex = sortedAuditsAndGroups.findIndex(
1509
+ (ref) => ref.slug === a.slug
1510
+ );
1511
+ const bIndex = sortedAuditsAndGroups.findIndex(
1512
+ (ref) => ref.slug === b.slug
1513
+ );
1514
+ return aIndex - bIndex;
1515
+ });
1516
+ return { ...category, refs: sortedRefs };
1517
+ });
1518
+ const sortedPlugins = plugins.map((plugin) => ({
1519
+ ...plugin,
1520
+ audits: plugin.audits.sort(compareAudits).map((audit) => ({
1521
+ ...audit,
1522
+ details: {
1523
+ ...audit.details,
1524
+ issues: audit?.details?.issues.slice().sort(compareIssues) || []
1525
+ }
1526
+ }))
1527
+ }));
1528
+ return {
1529
+ ...report,
1530
+ categories: sortedCategories,
1531
+ plugins: sortedPlugins
1532
+ };
1533
+ }
1534
+
1465
1535
  // packages/core/src/lib/implementation/persist.ts
1466
1536
  var PersistDirError = class extends Error {
1467
1537
  constructor(outputDir) {
@@ -1475,8 +1545,8 @@ var PersistError = class extends Error {
1475
1545
  };
1476
1546
  async function persistReport(report, options) {
1477
1547
  const { outputDir, filename, format } = options;
1478
- const scoredReport = scoreReport(report);
1479
- console.info(reportToStdout(scoredReport));
1548
+ const sortedScoredReport = sortReport(scoreReport(report));
1549
+ console.info(reportToStdout(sortedScoredReport));
1480
1550
  const results = [];
1481
1551
  if (format.includes("json")) {
1482
1552
  results.push({
@@ -1489,7 +1559,7 @@ async function persistReport(report, options) {
1489
1559
  validateCommitData(commitData);
1490
1560
  results.push({
1491
1561
  format: "md",
1492
- content: reportToMd(scoredReport, commitData)
1562
+ content: reportToMd(sortedScoredReport, commitData)
1493
1563
  });
1494
1564
  }
1495
1565
  if (!existsSync(outputDir)) {
@@ -1634,7 +1704,7 @@ function auditOutputsCorrelateWithPluginOutput(auditOutputs, pluginConfigAudits)
1634
1704
 
1635
1705
  // packages/core/package.json
1636
1706
  var name = "@code-pushup/core";
1637
- var version = "0.8.9";
1707
+ var version = "0.8.11";
1638
1708
 
1639
1709
  // packages/core/src/lib/implementation/collect.ts
1640
1710
  async function collect(options) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/core",
3
- "version": "0.8.9",
3
+ "version": "0.8.11",
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;