@code-pushup/cli 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
@@ -51,6 +51,46 @@ function errorItems(items, transform = (items2) => items2.join(", ")) {
51
51
  function exists(value) {
52
52
  return value != null;
53
53
  }
54
+ function getMissingRefsForCategories(categories, plugins) {
55
+ const missingRefs = [];
56
+ const auditRefsFromCategory = categories.flatMap(
57
+ ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
58
+ );
59
+ const auditRefsFromPlugins = plugins.flatMap(
60
+ ({ audits, slug: pluginSlug }) => {
61
+ return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
62
+ }
63
+ );
64
+ const missingAuditRefs = hasMissingStrings(
65
+ auditRefsFromCategory,
66
+ auditRefsFromPlugins
67
+ );
68
+ if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
69
+ missingRefs.push(...missingAuditRefs);
70
+ }
71
+ const groupRefsFromCategory = categories.flatMap(
72
+ ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
73
+ );
74
+ const groupRefsFromPlugins = plugins.flatMap(
75
+ ({ groups, slug: pluginSlug }) => {
76
+ return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
77
+ }
78
+ );
79
+ const missingGroupRefs = hasMissingStrings(
80
+ groupRefsFromCategory,
81
+ groupRefsFromPlugins
82
+ );
83
+ if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
84
+ missingRefs.push(...missingGroupRefs);
85
+ }
86
+ return missingRefs.length ? missingRefs : false;
87
+ }
88
+ function missingRefsForCategoriesErrorMsg(categories, plugins) {
89
+ const missingRefs = getMissingRefsForCategories(categories, plugins);
90
+ return `The following category references need to point to an audit or group: ${errorItems(
91
+ missingRefs
92
+ )}`;
93
+ }
54
94
 
55
95
  // packages/models/src/lib/implementation/schemas.ts
56
96
  function executionMetaSchema(options2 = {
@@ -109,15 +149,13 @@ function positiveIntSchema(description) {
109
149
  return z.number({ description }).int().nonnegative();
110
150
  }
111
151
  function packageVersionSchema(options2) {
112
- let { versionDescription, optional } = options2 || {};
113
- versionDescription = versionDescription || "NPM version of the package";
114
- optional = !!optional;
152
+ const { versionDescription = "NPM version of the package", required } = options2 ?? {};
115
153
  const packageSchema = z.string({ description: "NPM package name" });
116
154
  const versionSchema = z.string({ description: versionDescription });
117
155
  return z.object(
118
156
  {
119
- packageName: optional ? packageSchema.optional() : packageSchema,
120
- version: optional ? versionSchema.optional() : versionSchema
157
+ packageName: required ? packageSchema : packageSchema.optional(),
158
+ version: required ? versionSchema : versionSchema.optional()
121
159
  },
122
160
  { description: "NPM package name and version of a published package" }
123
161
  );
@@ -179,7 +217,7 @@ var pluginAuditsSchema = z2.array(auditSchema, {
179
217
  );
180
218
  function duplicateSlugsInAuditsErrorMsg(audits) {
181
219
  const duplicateRefs = getDuplicateSlugsInAudits(audits);
182
- return `In plugin audits the slugs are not unique: ${errorItems(
220
+ return `In plugin audits the following slugs are not unique: ${errorItems(
183
221
  duplicateRefs
184
222
  )}`;
185
223
  }
@@ -368,7 +406,9 @@ function getDuplicateRefsInGroups(groups) {
368
406
  }
369
407
  function duplicateSlugsInGroupsErrorMsg(groups) {
370
408
  const duplicateRefs = getDuplicateSlugsInGroups(groups);
371
- return `In groups the slugs are not unique: ${errorItems(duplicateRefs)}`;
409
+ return `In groups the following slugs are not unique: ${errorItems(
410
+ duplicateRefs
411
+ )}`;
372
412
  }
373
413
  function getDuplicateSlugsInGroups(groups) {
374
414
  return Array.isArray(groups) ? hasDuplicateStrings(groups.map(({ slug }) => slug)) : false;
@@ -394,9 +434,7 @@ var onProgressSchema = z8.function().args(z8.unknown()).returns(z8.void());
394
434
  var runnerFunctionSchema = z8.function().args(onProgressSchema.optional()).returns(z8.union([auditOutputsSchema, z8.promise(auditOutputsSchema)]));
395
435
 
396
436
  // packages/models/src/lib/plugin-config.ts
397
- var pluginMetaSchema = packageVersionSchema({
398
- optional: true
399
- }).merge(
437
+ var pluginMetaSchema = packageVersionSchema().merge(
400
438
  metaSchema({
401
439
  titleDescription: "Descriptive name",
402
440
  descriptionDescription: "Description (markdown)",
@@ -405,7 +443,7 @@ var pluginMetaSchema = packageVersionSchema({
405
443
  })
406
444
  ).merge(
407
445
  z9.object({
408
- slug: slugSchema("References plugin. ID (unique within core config)"),
446
+ slug: slugSchema("Unique plugin slug within core config"),
409
447
  icon: materialIconSchema
410
448
  })
411
449
  );
@@ -422,20 +460,17 @@ var pluginConfigSchema = pluginMetaSchema.merge(pluginDataSchema).refine(
422
460
  );
423
461
  function missingRefsFromGroupsErrorMsg(pluginCfg) {
424
462
  const missingRefs = getMissingRefsFromGroups(pluginCfg);
425
- return `In the groups, the following audit ref's needs to point to a audit in this plugin config: ${errorItems(
463
+ return `The following group references need to point to an existing audit in this plugin config: ${errorItems(
426
464
  missingRefs
427
465
  )}`;
428
466
  }
429
467
  function getMissingRefsFromGroups(pluginCfg) {
430
- if (pluginCfg?.groups?.length && pluginCfg?.audits?.length) {
431
- const groups = pluginCfg?.groups || [];
432
- const audits = pluginCfg?.audits || [];
433
- return hasMissingStrings(
434
- groups.flatMap(({ refs: audits2 }) => audits2.map(({ slug: ref }) => ref)),
435
- audits.map(({ slug }) => slug)
436
- );
437
- }
438
- return false;
468
+ return hasMissingStrings(
469
+ pluginCfg.groups?.flatMap(
470
+ ({ refs: audits }) => audits.map(({ slug: ref }) => ref)
471
+ ) ?? [],
472
+ pluginCfg.audits.map(({ slug }) => slug)
473
+ );
439
474
  }
440
475
 
441
476
  // packages/models/src/lib/upload-config.ts
@@ -445,19 +480,15 @@ var uploadConfigSchema = z10.object({
445
480
  apiKey: z10.string({
446
481
  description: "API key with write access to portal (use `process.env` for security)"
447
482
  }),
448
- organization: z10.string({
449
- description: "Organization in code versioning system"
450
- }),
451
- project: z10.string({
452
- description: "Project in code versioning system"
453
- })
483
+ organization: slugSchema("Organization slug from Code PushUp portal"),
484
+ project: slugSchema("Project slug from Code PushUp portal")
454
485
  });
455
486
 
456
487
  // packages/models/src/lib/core-config.ts
457
488
  var unrefinedCoreConfigSchema = z11.object({
458
489
  plugins: z11.array(pluginConfigSchema, {
459
490
  description: "List of plugins to be used (official, community-provided, or custom)"
460
- }),
491
+ }).min(1),
461
492
  /** portal configuration for persisting results */
462
493
  persist: persistConfigSchema.optional(),
463
494
  /** portal configuration for uploading results */
@@ -467,52 +498,15 @@ var unrefinedCoreConfigSchema = z11.object({
467
498
  var coreConfigSchema = refineCoreConfig(unrefinedCoreConfigSchema);
468
499
  function refineCoreConfig(schema) {
469
500
  return schema.refine(
470
- (coreCfg) => !getMissingRefsForCategories(coreCfg),
501
+ (coreCfg) => !getMissingRefsForCategories(coreCfg.categories, coreCfg.plugins),
471
502
  (coreCfg) => ({
472
- message: missingRefsForCategoriesErrorMsg(coreCfg)
503
+ message: missingRefsForCategoriesErrorMsg(
504
+ coreCfg.categories,
505
+ coreCfg.plugins
506
+ )
473
507
  })
474
508
  );
475
509
  }
476
- function missingRefsForCategoriesErrorMsg(coreCfg) {
477
- const missingRefs = getMissingRefsForCategories(coreCfg);
478
- return `In the categories, the following plugin refs do not exist in the provided plugins: ${errorItems(
479
- missingRefs
480
- )}`;
481
- }
482
- function getMissingRefsForCategories(coreCfg) {
483
- const missingRefs = [];
484
- const auditRefsFromCategory = coreCfg.categories.flatMap(
485
- ({ refs }) => refs.filter(({ type }) => type === "audit").map(({ plugin, slug }) => `${plugin}/${slug}`)
486
- );
487
- const auditRefsFromPlugins = coreCfg.plugins.flatMap(
488
- ({ audits, slug: pluginSlug }) => {
489
- return audits.map(({ slug }) => `${pluginSlug}/${slug}`);
490
- }
491
- );
492
- const missingAuditRefs = hasMissingStrings(
493
- auditRefsFromCategory,
494
- auditRefsFromPlugins
495
- );
496
- if (Array.isArray(missingAuditRefs) && missingAuditRefs.length > 0) {
497
- missingRefs.push(...missingAuditRefs);
498
- }
499
- const groupRefsFromCategory = coreCfg.categories.flatMap(
500
- ({ refs }) => refs.filter(({ type }) => type === "group").map(({ plugin, slug }) => `${plugin}#${slug} (group)`)
501
- );
502
- const groupRefsFromPlugins = coreCfg.plugins.flatMap(
503
- ({ groups, slug: pluginSlug }) => {
504
- return Array.isArray(groups) ? groups.map(({ slug }) => `${pluginSlug}#${slug} (group)`) : [];
505
- }
506
- );
507
- const missingGroupRefs = hasMissingStrings(
508
- groupRefsFromCategory,
509
- groupRefsFromPlugins
510
- );
511
- if (Array.isArray(missingGroupRefs) && missingGroupRefs.length > 0) {
512
- missingRefs.push(...missingGroupRefs);
513
- }
514
- return missingRefs.length ? missingRefs : false;
515
- }
516
510
 
517
511
  // packages/models/src/lib/implementation/constants.ts
518
512
  var PERSIST_OUTPUT_DIR = ".code-pushup";
@@ -532,9 +526,32 @@ var pluginReportSchema = pluginMetaSchema.merge(
532
526
  audits: z12.array(auditReportSchema),
533
527
  groups: z12.array(groupSchema).optional()
534
528
  })
529
+ ).refine(
530
+ (pluginReport) => !getMissingRefsFromGroups2(pluginReport.audits, pluginReport.groups ?? []),
531
+ (pluginReport) => ({
532
+ message: missingRefsFromGroupsErrorMsg2(
533
+ pluginReport.audits,
534
+ pluginReport.groups ?? []
535
+ )
536
+ })
535
537
  );
538
+ function missingRefsFromGroupsErrorMsg2(audits, groups) {
539
+ const missingRefs = getMissingRefsFromGroups2(audits, groups);
540
+ return `group references need to point to an existing audit in this plugin report: ${errorItems(
541
+ missingRefs
542
+ )}`;
543
+ }
544
+ function getMissingRefsFromGroups2(audits, groups) {
545
+ return hasMissingStrings(
546
+ groups.flatMap(
547
+ ({ refs: auditRefs }) => auditRefs.map(({ slug: ref }) => ref)
548
+ ),
549
+ audits.map(({ slug }) => slug)
550
+ );
551
+ }
536
552
  var reportSchema = packageVersionSchema({
537
- versionDescription: "NPM version of the CLI"
553
+ versionDescription: "NPM version of the CLI",
554
+ required: true
538
555
  }).merge(
539
556
  executionMetaSchema({
540
557
  descriptionDate: "Start date and time of the collect run",
@@ -544,10 +561,18 @@ var reportSchema = packageVersionSchema({
544
561
  z12.object(
545
562
  {
546
563
  categories: z12.array(categoryConfigSchema),
547
- plugins: z12.array(pluginReportSchema)
564
+ plugins: z12.array(pluginReportSchema).min(1)
548
565
  },
549
566
  { description: "Collect output data" }
550
567
  )
568
+ ).refine(
569
+ (report) => !getMissingRefsForCategories(report.categories, report.plugins),
570
+ (report) => ({
571
+ message: missingRefsForCategoriesErrorMsg(
572
+ report.categories,
573
+ report.plugins
574
+ )
575
+ })
551
576
  );
552
577
 
553
578
  // packages/utils/src/lib/constants.ts
@@ -1690,7 +1715,7 @@ function auditOutputsCorrelateWithPluginOutput(auditOutputs, pluginConfigAudits)
1690
1715
 
1691
1716
  // packages/core/package.json
1692
1717
  var name = "@code-pushup/core";
1693
- var version = "0.8.10";
1718
+ var version = "0.8.11";
1694
1719
 
1695
1720
  // packages/core/src/lib/implementation/collect.ts
1696
1721
  async function collect(options2) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/cli",
3
- "version": "0.8.10",
3
+ "version": "0.8.11",
4
4
  "bin": {
5
5
  "code-pushup": "index.js"
6
6
  },
@@ -1,17 +1,30 @@
1
1
  import { CoreConfig } from '@code-pushup/models';
2
2
  import { GeneralCliOptions, OnlyPluginsOptions } from './model';
3
3
  export declare function configMiddleware<T extends Partial<GeneralCliOptions & CoreConfig & OnlyPluginsOptions>>(processArgs: T): Promise<{
4
- plugins: {
4
+ categories: {
5
+ slug: string;
6
+ refs: {
7
+ slug: string;
8
+ weight: number;
9
+ type: "audit" | "group";
10
+ plugin: string;
11
+ }[];
5
12
  title: string;
13
+ description?: string | undefined;
14
+ docsUrl?: string | undefined;
15
+ isBinary?: boolean | undefined;
16
+ }[];
17
+ plugins: {
6
18
  slug: string;
7
- 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";
19
+ title: string;
20
+ 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";
8
21
  runner: ({
9
22
  command: string;
10
23
  outputFile: string;
11
24
  args?: string[] | undefined;
12
25
  outputTransform?: ((args_0: unknown, ...args_1: unknown[]) => {
13
- value: number;
14
26
  slug: string;
27
+ value: number;
15
28
  score: number;
16
29
  displayValue?: string | undefined;
17
30
  details?: {
@@ -30,8 +43,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
30
43
  }[];
31
44
  } | undefined;
32
45
  }[] | Promise<{
33
- value: number;
34
46
  slug: string;
47
+ value: number;
35
48
  score: number;
36
49
  displayValue?: string | undefined;
37
50
  details?: {
@@ -51,8 +64,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
51
64
  } | undefined;
52
65
  }[]>) | undefined;
53
66
  } | ((args_0: ((args_0: unknown, ...args_1: unknown[]) => void) | undefined, ...args_1: unknown[]) => {
54
- value: number;
55
67
  slug: string;
68
+ value: number;
56
69
  score: number;
57
70
  displayValue?: string | undefined;
58
71
  details?: {
@@ -71,8 +84,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
71
84
  }[];
72
85
  } | undefined;
73
86
  }[] | Promise<{
74
- value: number;
75
87
  slug: string;
88
+ value: number;
76
89
  score: number;
77
90
  displayValue?: string | undefined;
78
91
  details?: {
@@ -95,8 +108,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
95
108
  outputFile: string;
96
109
  args?: string[] | undefined;
97
110
  outputTransform?: ((args_0: unknown, ...args_1: unknown[]) => {
98
- value: number;
99
111
  slug: string;
112
+ value: number;
100
113
  score: number;
101
114
  displayValue?: string | undefined;
102
115
  details?: {
@@ -115,8 +128,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
115
128
  }[];
116
129
  } | undefined;
117
130
  }[] | Promise<{
118
- value: number;
119
131
  slug: string;
132
+ value: number;
120
133
  score: number;
121
134
  displayValue?: string | undefined;
122
135
  details?: {
@@ -136,8 +149,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
136
149
  } | undefined;
137
150
  }[]>) | undefined;
138
151
  } | ((args_0: ((args_0: unknown, ...args_1: unknown[]) => void) | undefined, ...args_1: unknown[]) => {
139
- value: number;
140
152
  slug: string;
153
+ value: number;
141
154
  score: number;
142
155
  displayValue?: string | undefined;
143
156
  details?: {
@@ -156,8 +169,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
156
169
  }[];
157
170
  } | undefined;
158
171
  }[] | Promise<{
159
- value: number;
160
172
  slug: string;
173
+ value: number;
161
174
  score: number;
162
175
  displayValue?: string | undefined;
163
176
  details?: {
@@ -177,8 +190,8 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
177
190
  } | undefined;
178
191
  }[]>) | undefined);
179
192
  audits: {
180
- title: string;
181
193
  slug: string;
194
+ title: string;
182
195
  description?: string | undefined;
183
196
  docsUrl?: string | undefined;
184
197
  }[];
@@ -187,29 +200,16 @@ export declare function configMiddleware<T extends Partial<GeneralCliOptions & C
187
200
  packageName?: string | undefined;
188
201
  version?: string | undefined;
189
202
  groups?: {
190
- title: string;
191
203
  slug: string;
192
204
  refs: {
193
205
  slug: string;
194
206
  weight: number;
195
207
  }[];
208
+ title: string;
196
209
  description?: string | undefined;
197
210
  docsUrl?: string | undefined;
198
211
  }[] | undefined;
199
212
  }[];
200
- categories: {
201
- title: string;
202
- slug: string;
203
- refs: {
204
- type: "audit" | "group";
205
- slug: string;
206
- weight: number;
207
- plugin: string;
208
- }[];
209
- description?: string | undefined;
210
- docsUrl?: string | undefined;
211
- isBinary?: boolean | undefined;
212
- }[];
213
213
  persist?: {
214
214
  outputDir?: string | undefined;
215
215
  filename?: string | undefined;