@code-pushup/models 0.8.10 → 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
@@ -32,6 +32,46 @@ function errorItems(items, transform = (items2) => items2.join(", ")) {
32
32
  function exists(value) {
33
33
  return value != null;
34
34
  }
35
+ function getMissingRefsForCategories(categories, plugins) {
36
+ const missingRefs = [];
37
+ const auditRefsFromCategory = categories.flatMap(
38
+ ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
39
+ );
40
+ const auditRefsFromPlugins = plugins.flatMap(
41
+ ({ audits, slug: pluginSlug }) => {
42
+ return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
43
+ }
44
+ );
45
+ const missingAuditRefs = hasMissingStrings(
46
+ auditRefsFromCategory,
47
+ auditRefsFromPlugins
48
+ );
49
+ if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
50
+ missingRefs.push(...missingAuditRefs);
51
+ }
52
+ const groupRefsFromCategory = categories.flatMap(
53
+ ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
54
+ );
55
+ const groupRefsFromPlugins = plugins.flatMap(
56
+ ({ groups, slug: pluginSlug }) => {
57
+ return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
58
+ }
59
+ );
60
+ const missingGroupRefs = hasMissingStrings(
61
+ groupRefsFromCategory,
62
+ groupRefsFromPlugins
63
+ );
64
+ if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
65
+ missingRefs.push(...missingGroupRefs);
66
+ }
67
+ return missingRefs.length ? missingRefs : false;
68
+ }
69
+ function missingRefsForCategoriesErrorMsg(categories, plugins) {
70
+ const missingRefs = getMissingRefsForCategories(categories, plugins);
71
+ return `The following category references need to point to an audit or group: ${errorItems(
72
+ missingRefs
73
+ )}`;
74
+ }
35
75
 
36
76
  // packages/models/src/lib/implementation/schemas.ts
37
77
  function executionMetaSchema(options = {
@@ -90,15 +130,13 @@ function positiveIntSchema(description) {
90
130
  return z.number({ description }).int().nonnegative();
91
131
  }
92
132
  function packageVersionSchema(options) {
93
- let { versionDescription, optional } = options || {};
94
- versionDescription = versionDescription || "NPM version of the package";
95
- optional = !!optional;
133
+ const { versionDescription = "NPM version of the package", required } = options ?? {};
96
134
  const packageSchema = z.string({ description: "NPM package name" });
97
135
  const versionSchema = z.string({ description: versionDescription });
98
136
  return z.object(
99
137
  {
100
- packageName: optional ? packageSchema.optional() : packageSchema,
101
- version: optional ? versionSchema.optional() : versionSchema
138
+ packageName: required ? packageSchema : packageSchema.optional(),
139
+ version: required ? versionSchema : versionSchema.optional()
102
140
  },
103
141
  { description: "NPM package name and version of a published package" }
104
142
  );
@@ -160,7 +198,7 @@ var pluginAuditsSchema = z2.array(auditSchema, {
160
198
  );
161
199
  function duplicateSlugsInAuditsErrorMsg(audits) {
162
200
  const duplicateRefs = getDuplicateSlugsInAudits(audits);
163
- return `In plugin audits the slugs are not unique: ${errorItems(
201
+ return `In plugin audits the following slugs are not unique: ${errorItems(
164
202
  duplicateRefs
165
203
  )}`;
166
204
  }
@@ -349,7 +387,9 @@ function getDuplicateRefsInGroups(groups) {
349
387
  }
350
388
  function duplicateSlugsInGroupsErrorMsg(groups) {
351
389
  const duplicateRefs = getDuplicateSlugsInGroups(groups);
352
- return `In groups the slugs are not unique: ${errorItems(duplicateRefs)}`;
390
+ return `In groups the following slugs are not unique: ${errorItems(
391
+ duplicateRefs
392
+ )}`;
353
393
  }
354
394
  function getDuplicateSlugsInGroups(groups) {
355
395
  return Array.isArray(groups) ? hasDuplicateStrings(groups.map(({ slug }) => slug)) : false;
@@ -375,9 +415,7 @@ var onProgressSchema = z8.function().args(z8.unknown()).returns(z8.void());
375
415
  var runnerFunctionSchema = z8.function().args(onProgressSchema.optional()).returns(z8.union([auditOutputsSchema, z8.promise(auditOutputsSchema)]));
376
416
 
377
417
  // packages/models/src/lib/plugin-config.ts
378
- var pluginMetaSchema = packageVersionSchema({
379
- optional: true
380
- }).merge(
418
+ var pluginMetaSchema = packageVersionSchema().merge(
381
419
  metaSchema({
382
420
  titleDescription: "Descriptive name",
383
421
  descriptionDescription: "Description (markdown)",
@@ -386,7 +424,7 @@ var pluginMetaSchema = packageVersionSchema({
386
424
  })
387
425
  ).merge(
388
426
  z9.object({
389
- slug: slugSchema("References plugin. ID (unique within core config)"),
427
+ slug: slugSchema("Unique plugin slug within core config"),
390
428
  icon: materialIconSchema
391
429
  })
392
430
  );
@@ -403,20 +441,17 @@ var pluginConfigSchema = pluginMetaSchema.merge(pluginDataSchema).refine(
403
441
  );
404
442
  function missingRefsFromGroupsErrorMsg(pluginCfg) {
405
443
  const missingRefs = getMissingRefsFromGroups(pluginCfg);
406
- return `In the groups, the following audit ref's needs to point to a audit in this plugin config: ${errorItems(
444
+ return `The following group references need to point to an existing audit in this plugin config: ${errorItems(
407
445
  missingRefs
408
446
  )}`;
409
447
  }
410
448
  function getMissingRefsFromGroups(pluginCfg) {
411
- if (pluginCfg?.groups?.length && pluginCfg?.audits?.length) {
412
- const groups = pluginCfg?.groups || [];
413
- const audits = pluginCfg?.audits || [];
414
- return hasMissingStrings(
415
- groups.flatMap(({ refs: audits2 }) => audits2.map(({ slug: ref }) => ref)),
416
- audits.map(({ slug }) => slug)
417
- );
418
- }
419
- return false;
449
+ return hasMissingStrings(
450
+ pluginCfg.groups?.flatMap(
451
+ ({ refs: audits }) => audits.map(({ slug: ref }) => ref)
452
+ ) ?? [],
453
+ pluginCfg.audits.map(({ slug }) => slug)
454
+ );
420
455
  }
421
456
 
422
457
  // packages/models/src/lib/upload-config.ts
@@ -426,19 +461,15 @@ var uploadConfigSchema = z10.object({
426
461
  apiKey: z10.string({
427
462
  description: "API key with write access to portal (use `process.env` for security)"
428
463
  }),
429
- organization: z10.string({
430
- description: "Organization in code versioning system"
431
- }),
432
- project: z10.string({
433
- description: "Project in code versioning system"
434
- })
464
+ organization: slugSchema("Organization slug from Code PushUp portal"),
465
+ project: slugSchema("Project slug from Code PushUp portal")
435
466
  });
436
467
 
437
468
  // packages/models/src/lib/core-config.ts
438
469
  var unrefinedCoreConfigSchema = z11.object({
439
470
  plugins: z11.array(pluginConfigSchema, {
440
471
  description: "List of plugins to be used (official, community-provided, or custom)"
441
- }),
472
+ }).min(1),
442
473
  /** portal configuration for persisting results */
443
474
  persist: persistConfigSchema.optional(),
444
475
  /** portal configuration for uploading results */
@@ -448,52 +479,15 @@ var unrefinedCoreConfigSchema = z11.object({
448
479
  var coreConfigSchema = refineCoreConfig(unrefinedCoreConfigSchema);
449
480
  function refineCoreConfig(schema) {
450
481
  return schema.refine(
451
- (coreCfg) => !getMissingRefsForCategories(coreCfg),
482
+ (coreCfg) => !getMissingRefsForCategories(coreCfg.categories, coreCfg.plugins),
452
483
  (coreCfg) => ({
453
- message: missingRefsForCategoriesErrorMsg(coreCfg)
484
+ message: missingRefsForCategoriesErrorMsg(
485
+ coreCfg.categories,
486
+ coreCfg.plugins
487
+ )
454
488
  })
455
489
  );
456
490
  }
457
- function missingRefsForCategoriesErrorMsg(coreCfg) {
458
- const missingRefs = getMissingRefsForCategories(coreCfg);
459
- return `In the categories, the following plugin refs do not exist in the provided plugins: ${errorItems(
460
- missingRefs
461
- )}`;
462
- }
463
- function getMissingRefsForCategories(coreCfg) {
464
- const missingRefs = [];
465
- const auditRefsFromCategory = coreCfg.categories.flatMap(
466
- ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
467
- );
468
- const auditRefsFromPlugins = coreCfg.plugins.flatMap(
469
- ({ audits, slug: pluginSlug }) => {
470
- return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
471
- }
472
- );
473
- const missingAuditRefs = hasMissingStrings(
474
- auditRefsFromCategory,
475
- auditRefsFromPlugins
476
- );
477
- if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
478
- missingRefs.push(...missingAuditRefs);
479
- }
480
- const groupRefsFromCategory = coreCfg.categories.flatMap(
481
- ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
482
- );
483
- const groupRefsFromPlugins = coreCfg.plugins.flatMap(
484
- ({ groups, slug: pluginSlug }) => {
485
- return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
486
- }
487
- );
488
- const missingGroupRefs = hasMissingStrings(
489
- groupRefsFromCategory,
490
- groupRefsFromPlugins
491
- );
492
- if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
493
- missingRefs.push(...missingGroupRefs);
494
- }
495
- return missingRefs.length ? missingRefs : false;
496
- }
497
491
 
498
492
  // packages/models/src/lib/implementation/constants.ts
499
493
  var PERSIST_OUTPUT_DIR = ".code-pushup";
@@ -513,9 +507,32 @@ var pluginReportSchema = pluginMetaSchema.merge(
513
507
  audits: z12.array(auditReportSchema),
514
508
  groups: z12.array(groupSchema).optional()
515
509
  })
510
+ ).refine(
511
+ (pluginReport) => !getMissingRefsFromGroups2(pluginReport.audits, pluginReport.groups ?? []),
512
+ (pluginReport) => ({
513
+ message: missingRefsFromGroupsErrorMsg2(
514
+ pluginReport.audits,
515
+ pluginReport.groups ?? []
516
+ )
517
+ })
516
518
  );
519
+ function missingRefsFromGroupsErrorMsg2(audits, groups) {
520
+ const missingRefs = getMissingRefsFromGroups2(audits, groups);
521
+ return `group references need to point to an existing audit in this plugin report: ${errorItems(
522
+ missingRefs
523
+ )}`;
524
+ }
525
+ function getMissingRefsFromGroups2(audits, groups) {
526
+ return hasMissingStrings(
527
+ groups.flatMap(
528
+ ({ refs: auditRefs }) => auditRefs.map(({ slug: ref }) => ref)
529
+ ),
530
+ audits.map(({ slug }) => slug)
531
+ );
532
+ }
517
533
  var reportSchema = packageVersionSchema({
518
- versionDescription: "NPM version of the CLI"
534
+ versionDescription: "NPM version of the CLI",
535
+ required: true
519
536
  }).merge(
520
537
  executionMetaSchema({
521
538
  descriptionDate: "Start date and time of the collect run",
@@ -525,10 +542,18 @@ var reportSchema = packageVersionSchema({
525
542
  z12.object(
526
543
  {
527
544
  categories: z12.array(categoryConfigSchema),
528
- plugins: z12.array(pluginReportSchema)
545
+ plugins: z12.array(pluginReportSchema).min(1)
529
546
  },
530
547
  { description: "Collect output data" }
531
548
  )
549
+ ).refine(
550
+ (report) => !getMissingRefsForCategories(report.categories, report.plugins),
551
+ (report) => ({
552
+ message: missingRefsForCategoriesErrorMsg(
553
+ report.categories,
554
+ report.plugins
555
+ )
556
+ })
532
557
  );
533
558
  export {
534
559
  MAX_DESCRIPTION_LENGTH,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/models",
3
- "version": "0.8.10",
3
+ "version": "0.8.11",
4
4
  "dependencies": {
5
5
  "zod": "^3.22.1",
6
6
  "@code-pushup/portal-client": "^0.3.0"
@@ -98,8 +98,8 @@ export declare const auditOutputSchema: z.ZodObject<{
98
98
  }[];
99
99
  }>>;
100
100
  }, "strip", z.ZodTypeAny, {
101
- value: number;
102
101
  slug: string;
102
+ value: number;
103
103
  score: number;
104
104
  displayValue?: string | undefined;
105
105
  details?: {
@@ -118,8 +118,8 @@ export declare const auditOutputSchema: z.ZodObject<{
118
118
  }[];
119
119
  } | undefined;
120
120
  }, {
121
- value: number;
122
121
  slug: string;
122
+ value: number;
123
123
  score: number;
124
124
  displayValue?: string | undefined;
125
125
  details?: {
@@ -238,8 +238,8 @@ export declare const auditOutputsSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
238
238
  }[];
239
239
  }>>;
240
240
  }, "strip", z.ZodTypeAny, {
241
- value: number;
242
241
  slug: string;
242
+ value: number;
243
243
  score: number;
244
244
  displayValue?: string | undefined;
245
245
  details?: {
@@ -258,8 +258,8 @@ export declare const auditOutputsSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
258
258
  }[];
259
259
  } | undefined;
260
260
  }, {
261
- value: number;
262
261
  slug: string;
262
+ value: number;
263
263
  score: number;
264
264
  displayValue?: string | undefined;
265
265
  details?: {
@@ -278,8 +278,8 @@ export declare const auditOutputsSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
278
278
  }[];
279
279
  } | undefined;
280
280
  }>, "many">, {
281
- value: number;
282
281
  slug: string;
282
+ value: number;
283
283
  score: number;
284
284
  displayValue?: string | undefined;
285
285
  details?: {
@@ -298,8 +298,8 @@ export declare const auditOutputsSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
298
298
  }[];
299
299
  } | undefined;
300
300
  }[], {
301
- value: number;
302
301
  slug: string;
302
+ value: number;
303
303
  score: number;
304
304
  displayValue?: string | undefined;
305
305
  details?: {
@@ -5,13 +5,13 @@ export declare const auditSchema: z.ZodObject<{
5
5
  description: z.ZodOptional<z.ZodString>;
6
6
  docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
7
7
  }, "strip", z.ZodTypeAny, {
8
- title: string;
9
8
  slug: string;
9
+ title: string;
10
10
  description?: string | undefined;
11
11
  docsUrl?: string | undefined;
12
12
  }, {
13
- title: string;
14
13
  slug: string;
14
+ title: string;
15
15
  description?: string | undefined;
16
16
  docsUrl?: string | undefined;
17
17
  }>;
@@ -22,23 +22,23 @@ export declare const pluginAuditsSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
22
22
  description: z.ZodOptional<z.ZodString>;
23
23
  docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
24
24
  }, "strip", z.ZodTypeAny, {
25
- title: string;
26
25
  slug: string;
26
+ title: string;
27
27
  description?: string | undefined;
28
28
  docsUrl?: string | undefined;
29
29
  }, {
30
- title: string;
31
30
  slug: string;
31
+ title: string;
32
32
  description?: string | undefined;
33
33
  docsUrl?: string | undefined;
34
34
  }>, "many">, {
35
- title: string;
36
35
  slug: string;
36
+ title: string;
37
37
  description?: string | undefined;
38
38
  docsUrl?: string | undefined;
39
39
  }[], {
40
- title: string;
41
40
  slug: string;
41
+ title: string;
42
42
  description?: string | undefined;
43
43
  docsUrl?: string | undefined;
44
44
  }[]>;
@@ -5,80 +5,80 @@ export declare const categoryRefSchema: z.ZodObject<{
5
5
  type: z.ZodEnum<["audit", "group"]>;
6
6
  plugin: z.ZodString;
7
7
  }, "strip", z.ZodTypeAny, {
8
- type: "audit" | "group";
9
8
  slug: string;
10
9
  weight: number;
10
+ type: "audit" | "group";
11
11
  plugin: string;
12
12
  }, {
13
- type: "audit" | "group";
14
13
  slug: string;
15
14
  weight: number;
15
+ type: "audit" | "group";
16
16
  plugin: string;
17
17
  }>;
18
18
  export type CategoryRef = z.infer<typeof categoryRefSchema>;
19
19
  export declare const categoryConfigSchema: z.ZodObject<{
20
- description: z.ZodOptional<z.ZodString>;
21
- title: z.ZodString;
22
- docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
23
20
  slug: z.ZodString;
21
+ description: z.ZodOptional<z.ZodString>;
24
22
  refs: z.ZodEffects<z.ZodEffects<z.ZodArray<z.ZodObject<{
25
23
  slug: z.ZodString;
26
24
  weight: z.ZodNumber;
27
25
  type: z.ZodEnum<["audit", "group"]>;
28
26
  plugin: z.ZodString;
29
27
  }, "strip", z.ZodTypeAny, {
30
- type: "audit" | "group";
31
28
  slug: string;
32
29
  weight: number;
30
+ type: "audit" | "group";
33
31
  plugin: string;
34
32
  }, {
35
- type: "audit" | "group";
36
33
  slug: string;
37
34
  weight: number;
35
+ type: "audit" | "group";
38
36
  plugin: string;
39
37
  }>, "many">, {
40
- type: "audit" | "group";
41
38
  slug: string;
42
39
  weight: number;
40
+ type: "audit" | "group";
43
41
  plugin: string;
44
42
  }[], {
45
- type: "audit" | "group";
46
43
  slug: string;
47
44
  weight: number;
45
+ type: "audit" | "group";
48
46
  plugin: string;
49
47
  }[]>, {
50
- type: "audit" | "group";
51
48
  slug: string;
52
49
  weight: number;
50
+ type: "audit" | "group";
53
51
  plugin: string;
54
52
  }[], {
55
- type: "audit" | "group";
56
53
  slug: string;
57
54
  weight: number;
55
+ type: "audit" | "group";
58
56
  plugin: string;
59
57
  }[]>;
58
+ title: z.ZodString;
59
+ docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
60
60
  isBinary: z.ZodOptional<z.ZodBoolean>;
61
61
  }, "strip", z.ZodTypeAny, {
62
- title: string;
63
62
  slug: string;
64
63
  refs: {
65
- type: "audit" | "group";
66
64
  slug: string;
67
65
  weight: number;
66
+ type: "audit" | "group";
68
67
  plugin: string;
69
68
  }[];
69
+ title: string;
70
70
  description?: string | undefined;
71
71
  docsUrl?: string | undefined;
72
72
  isBinary?: boolean | undefined;
73
73
  }, {
74
- title: string;
75
74
  slug: string;
76
75
  refs: {
77
- type: "audit" | "group";
78
76
  slug: string;
79
77
  weight: number;
78
+ type: "audit" | "group";
80
79
  plugin: string;
81
80
  }[];
81
+ title: string;
82
82
  description?: string | undefined;
83
83
  docsUrl?: string | undefined;
84
84
  isBinary?: boolean | undefined;
@@ -86,92 +86,92 @@ export declare const categoryConfigSchema: z.ZodObject<{
86
86
  export type CategoryConfig = z.infer<typeof categoryConfigSchema>;
87
87
  export declare function duplicateRefsInCategoryMetricsErrorMsg(metrics: CategoryRef[]): string;
88
88
  export declare const categoriesSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
89
- description: z.ZodOptional<z.ZodString>;
90
- title: z.ZodString;
91
- docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
92
89
  slug: z.ZodString;
90
+ description: z.ZodOptional<z.ZodString>;
93
91
  refs: z.ZodEffects<z.ZodEffects<z.ZodArray<z.ZodObject<{
94
92
  slug: z.ZodString;
95
93
  weight: z.ZodNumber;
96
94
  type: z.ZodEnum<["audit", "group"]>;
97
95
  plugin: z.ZodString;
98
96
  }, "strip", z.ZodTypeAny, {
99
- type: "audit" | "group";
100
97
  slug: string;
101
98
  weight: number;
99
+ type: "audit" | "group";
102
100
  plugin: string;
103
101
  }, {
104
- type: "audit" | "group";
105
102
  slug: string;
106
103
  weight: number;
104
+ type: "audit" | "group";
107
105
  plugin: string;
108
106
  }>, "many">, {
109
- type: "audit" | "group";
110
107
  slug: string;
111
108
  weight: number;
109
+ type: "audit" | "group";
112
110
  plugin: string;
113
111
  }[], {
114
- type: "audit" | "group";
115
112
  slug: string;
116
113
  weight: number;
114
+ type: "audit" | "group";
117
115
  plugin: string;
118
116
  }[]>, {
119
- type: "audit" | "group";
120
117
  slug: string;
121
118
  weight: number;
119
+ type: "audit" | "group";
122
120
  plugin: string;
123
121
  }[], {
124
- type: "audit" | "group";
125
122
  slug: string;
126
123
  weight: number;
124
+ type: "audit" | "group";
127
125
  plugin: string;
128
126
  }[]>;
127
+ title: z.ZodString;
128
+ docsUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodString]>;
129
129
  isBinary: z.ZodOptional<z.ZodBoolean>;
130
130
  }, "strip", z.ZodTypeAny, {
131
- title: string;
132
131
  slug: string;
133
132
  refs: {
134
- type: "audit" | "group";
135
133
  slug: string;
136
134
  weight: number;
135
+ type: "audit" | "group";
137
136
  plugin: string;
138
137
  }[];
138
+ title: string;
139
139
  description?: string | undefined;
140
140
  docsUrl?: string | undefined;
141
141
  isBinary?: boolean | undefined;
142
142
  }, {
143
- title: string;
144
143
  slug: string;
145
144
  refs: {
146
- type: "audit" | "group";
147
145
  slug: string;
148
146
  weight: number;
147
+ type: "audit" | "group";
149
148
  plugin: string;
150
149
  }[];
150
+ title: string;
151
151
  description?: string | undefined;
152
152
  docsUrl?: string | undefined;
153
153
  isBinary?: boolean | undefined;
154
154
  }>, "many">, {
155
- title: string;
156
155
  slug: string;
157
156
  refs: {
158
- type: "audit" | "group";
159
157
  slug: string;
160
158
  weight: number;
159
+ type: "audit" | "group";
161
160
  plugin: string;
162
161
  }[];
162
+ title: string;
163
163
  description?: string | undefined;
164
164
  docsUrl?: string | undefined;
165
165
  isBinary?: boolean | undefined;
166
166
  }[], {
167
- title: string;
168
167
  slug: string;
169
168
  refs: {
170
- type: "audit" | "group";
171
169
  slug: string;
172
170
  weight: number;
171
+ type: "audit" | "group";
173
172
  plugin: string;
174
173
  }[];
174
+ title: string;
175
175
  description?: string | undefined;
176
176
  docsUrl?: string | undefined;
177
177
  isBinary?: boolean | undefined;