@code-pushup/create-cli 0.114.0 → 0.116.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/create-cli",
3
- "version": "0.114.0",
3
+ "version": "0.116.0",
4
4
  "license": "MIT",
5
5
  "bin": "index.js",
6
6
  "homepage": "https://github.com/code-pushup/cli/tree/main/packages/create-cli#readme",
@@ -26,8 +26,8 @@
26
26
  },
27
27
  "type": "module",
28
28
  "dependencies": {
29
- "@code-pushup/models": "0.114.0",
30
- "@code-pushup/utils": "0.114.0",
29
+ "@code-pushup/models": "0.116.0",
30
+ "@code-pushup/utils": "0.116.0",
31
31
  "@inquirer/prompts": "^8.0.0",
32
32
  "yargs": "^17.7.2"
33
33
  },
package/src/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  #! /usr/bin/env node
2
2
  import yargs from 'yargs';
3
3
  import { hideBin } from 'yargs/helpers';
4
+ import { parsePluginSlugs, validatePluginSlugs } from './lib/setup/plugins.js';
5
+ import { CONFIG_FILE_FORMATS, } from './lib/setup/types.js';
4
6
  import { runSetupWizard } from './lib/setup/wizard.js';
7
+ // TODO: create, import and pass plugin bindings (eslint, coverage, lighthouse, typescript, js-packages, jsdocs, axe)
8
+ const bindings = [];
5
9
  const argv = await yargs(hideBin(process.argv))
6
10
  .option('dry-run', {
7
11
  type: 'boolean',
@@ -13,8 +17,21 @@ const argv = await yargs(hideBin(process.argv))
13
17
  type: 'boolean',
14
18
  default: false,
15
19
  describe: 'Skip prompts and use defaults',
20
+ })
21
+ .option('config-format', {
22
+ type: 'string',
23
+ choices: CONFIG_FILE_FORMATS,
24
+ describe: 'Config file format (default: auto-detected from project)',
25
+ })
26
+ .option('plugins', {
27
+ type: 'string',
28
+ describe: 'Comma-separated plugin slugs to include (e.g. eslint,coverage)',
29
+ coerce: parsePluginSlugs,
30
+ })
31
+ .check(parsed => {
32
+ validatePluginSlugs(bindings, parsed.plugins);
33
+ return true;
16
34
  })
17
35
  .parse();
18
- // TODO: #1244 — provide plugin bindings from registry
19
- await runSetupWizard([], argv);
36
+ await runSetupWizard(bindings, argv);
20
37
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5C,MAAM,CAAC,SAAS,EAAE;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,uCAAuC;CAClD,CAAC;KACD,MAAM,CAAC,KAAK,EAAE;IACb,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,+BAA+B;CAC1C,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,sDAAsD;AACtD,MAAM,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,qHAAqH;AACrH,MAAM,QAAQ,GAAyB,EAAE,CAAC;AAE1C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5C,MAAM,CAAC,SAAS,EAAE;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,uCAAuC;CAClD,CAAC;KACD,MAAM,CAAC,KAAK,EAAE;IACb,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,+BAA+B;CAC1C,CAAC;KACD,MAAM,CAAC,eAAe,EAAE;IACvB,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,0DAA0D;CACrE,CAAC;KACD,MAAM,CAAC,SAAS,EAAE;IACjB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,gEAAgE;IAC1E,MAAM,EAAE,gBAAgB;CACzB,CAAC;KACD,KAAK,CAAC,MAAM,CAAC,EAAE;IACd,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
- import type { PluginCodegenResult } from './types.js';
2
- export declare function generateConfigSource(plugins: PluginCodegenResult[]): string;
1
+ import type { ConfigFileFormat, PluginCodegenResult } from './types.js';
2
+ export declare function generateConfigSource(plugins: PluginCodegenResult[], format: ConfigFileFormat): string;
@@ -27,26 +27,55 @@ function formatImport({ moduleSpecifier, defaultImport, namedImports, isTypeOnly
27
27
  const type = isTypeOnly ? 'type ' : '';
28
28
  return `import ${type}${from}'${moduleSpecifier}';`;
29
29
  }
30
- function collectImports(plugins) {
30
+ function collectTsImports(plugins) {
31
31
  return [
32
32
  CORE_CONFIG_IMPORT,
33
33
  ...plugins.flatMap(({ imports }) => imports),
34
34
  ].toSorted((a, b) => a.moduleSpecifier.localeCompare(b.moduleSpecifier));
35
35
  }
36
- export function generateConfigSource(plugins) {
37
- const builder = new CodeBuilder();
38
- builder.addLines(collectImports(plugins).map(formatImport));
39
- builder.addEmptyLine();
40
- builder.addLine('export default {');
36
+ function collectJsImports(plugins) {
37
+ return plugins
38
+ .flatMap(({ imports }) => imports)
39
+ .map(({ isTypeOnly: _, ...rest }) => rest)
40
+ .toSorted((a, b) => a.moduleSpecifier.localeCompare(b.moduleSpecifier));
41
+ }
42
+ function addPlugins(builder, plugins) {
41
43
  if (plugins.length === 0) {
42
- builder.addLine('plugins: [],', 1);
44
+ builder.addLine('plugins: [', 1);
45
+ builder.addLine('// TODO: register some plugins', 2);
46
+ builder.addLine('],', 1);
43
47
  }
44
48
  else {
45
49
  builder.addLine('plugins: [', 1);
46
50
  builder.addLines(plugins.map(({ pluginInit }) => `${pluginInit},`), 2);
47
51
  builder.addLine('],', 1);
48
52
  }
53
+ }
54
+ export function generateConfigSource(plugins, format) {
55
+ return format === 'ts'
56
+ ? generateTsConfig(plugins)
57
+ : generateJsConfig(plugins);
58
+ }
59
+ function generateTsConfig(plugins) {
60
+ const builder = new CodeBuilder();
61
+ builder.addLines(collectTsImports(plugins).map(formatImport));
62
+ builder.addEmptyLine();
63
+ builder.addLine('export default {');
64
+ addPlugins(builder, plugins);
49
65
  builder.addLine('} satisfies CoreConfig;');
50
66
  return builder.toString();
51
67
  }
68
+ function generateJsConfig(plugins) {
69
+ const builder = new CodeBuilder();
70
+ const pluginImports = collectJsImports(plugins);
71
+ if (pluginImports.length > 0) {
72
+ builder.addLines(pluginImports.map(formatImport));
73
+ builder.addEmptyLine();
74
+ }
75
+ builder.addLine("/** @type {import('@code-pushup/models').CoreConfig} */");
76
+ builder.addLine('export default {');
77
+ addPlugins(builder, plugins);
78
+ builder.addLine('};');
79
+ return builder.toString();
80
+ }
52
81
  //# sourceMappingURL=codegen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../../src/lib/setup/codegen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../../src/lib/setup/codegen.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GAA+B;IACrD,eAAe,EAAE,qBAAqB;IACtC,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,WAAW;IACP,KAAK,GAAa,EAAE,CAAC;IAE7B,OAAO,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,KAAe,EAAE,KAAK,GAAG,CAAC;QACjC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC,CAAC;CACF;AAED,SAAS,YAAY,CAAC,EACpB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,GACiB;IAC3B,MAAM,KAAK,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,OAAO,UAAU,IAAI,GAAG,IAAI,IAAI,eAAe,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CACvB,OAA8B;IAE9B,OAAO;QACL,kBAAkB;QAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;KAC7C,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CACvB,OAA8B;IAE9B,OAAO,OAAO;SACX,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;SACjC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;SACzC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CACjB,OAAoB,EACpB,OAA8B;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,CACd,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,EACjD,CAAC,CACF,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAA8B,EAC9B,MAAwB;IAExB,OAAO,MAAM,KAAK,IAAI;QACpB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAC3B,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA8B;IACtD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAE3C,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA8B;IACtD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,YAAY,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;IAC3E,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PackageJson } from 'type-fest';
2
+ import { type CliArgs, type ConfigFileFormat } from './types.js';
3
+ /** Resolves config file format from CLI arg, auto-detection, or interactive prompt. */
4
+ export declare function promptConfigFormat(targetDir: string, { 'config-format': format, yes }: CliArgs): Promise<ConfigFileFormat>;
5
+ /** Returns `code-pushup.config.{ts,js,mjs}` based on format and ESM context. */
6
+ export declare function resolveConfigFilename(format: ConfigFileFormat, isEsm: boolean): string;
7
+ export declare function readPackageJson(targetDir: string): Promise<PackageJson>;
@@ -0,0 +1,50 @@
1
+ import { select } from '@inquirer/prompts';
2
+ import { readdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { fileExists, readJsonFile } from '@code-pushup/utils';
5
+ import { CONFIG_FILE_FORMATS, } from './types.js';
6
+ const TSCONFIG_PATTERN = /^tsconfig(\..+)?\.json$/;
7
+ /** Resolves config file format from CLI arg, auto-detection, or interactive prompt. */
8
+ export async function promptConfigFormat(targetDir, { 'config-format': format, yes }) {
9
+ if (isConfigFileFormat(format)) {
10
+ return format;
11
+ }
12
+ const defaultFormat = await detectDefaultFormat(targetDir);
13
+ if (yes) {
14
+ return defaultFormat;
15
+ }
16
+ return select({
17
+ message: 'Config file format:',
18
+ choices: [
19
+ { name: 'TypeScript', value: 'ts' },
20
+ { name: 'JavaScript', value: 'js' },
21
+ ],
22
+ default: defaultFormat,
23
+ });
24
+ }
25
+ /** Returns `code-pushup.config.{ts,js,mjs}` based on format and ESM context. */
26
+ export function resolveConfigFilename(format, isEsm) {
27
+ if (format === 'ts') {
28
+ return 'code-pushup.config.ts';
29
+ }
30
+ if (format === 'js' && isEsm) {
31
+ return 'code-pushup.config.js';
32
+ }
33
+ return 'code-pushup.config.mjs';
34
+ }
35
+ export async function readPackageJson(targetDir) {
36
+ const packageJsonPath = path.join(targetDir, 'package.json');
37
+ if (await fileExists(packageJsonPath)) {
38
+ return readJsonFile(packageJsonPath);
39
+ }
40
+ return {};
41
+ }
42
+ async function detectDefaultFormat(targetDir) {
43
+ const files = await readdir(targetDir);
44
+ return files.some(file => TSCONFIG_PATTERN.test(file)) ? 'ts' : 'js';
45
+ }
46
+ function isConfigFileFormat(value) {
47
+ const validValues = CONFIG_FILE_FORMATS;
48
+ return value != null && validValues.includes(value);
49
+ }
50
+ //# sourceMappingURL=config-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-format.js","sourceRoot":"","sources":["../../../../src/lib/setup/config-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,mBAAmB,GAGpB,MAAM,YAAY,CAAC;AAEpB,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAInD,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAW;IAEzC,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAmB;QAC9B,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE;SACpC;QACD,OAAO,EAAE,aAAa;KACvB,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CACnC,MAAwB,EACxB,KAAc;IAEd,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC;QAC7B,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7D,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,OAAO,YAAY,CAAc,eAAe,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IAClD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAyB;IAEzB,MAAM,WAAW,GAAsB,mBAAmB,CAAC;IAC3D,OAAO,KAAK,IAAI,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tree } from './types.js';
2
+ export declare function resolveGitignore(tree: Tree): Promise<void>;
@@ -0,0 +1,32 @@
1
+ const GITIGNORE_FILENAME = '.gitignore';
2
+ const REPORTS_DIR = '.code-pushup';
3
+ const REPORTS_DIR_ENTRIES = new Set([REPORTS_DIR, `**/${REPORTS_DIR}`]);
4
+ const REPORTS_SECTION = `# Code PushUp reports\n${REPORTS_DIR}\n`;
5
+ export async function resolveGitignore(tree) {
6
+ const content = await tree.read(GITIGNORE_FILENAME);
7
+ const updated = resolveGitignoreContent(content);
8
+ if (updated != null) {
9
+ await tree.write(GITIGNORE_FILENAME, updated);
10
+ }
11
+ }
12
+ function resolveGitignoreContent(content) {
13
+ if (content == null) {
14
+ return REPORTS_SECTION;
15
+ }
16
+ if (gitignoreContainsEntry(content)) {
17
+ return null;
18
+ }
19
+ const separator = content.endsWith('\n\n')
20
+ ? ''
21
+ : content.endsWith('\n')
22
+ ? '\n'
23
+ : '\n\n';
24
+ return `${content}${separator}${REPORTS_SECTION}`;
25
+ }
26
+ function gitignoreContainsEntry(content) {
27
+ return content.split('\n').some(raw => {
28
+ const line = raw.trim();
29
+ return (line !== '' && !line.startsWith('#') && REPORTS_DIR_ENTRIES.has(line));
30
+ });
31
+ }
32
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../../../src/lib/setup/gitignore.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;AACxE,MAAM,eAAe,GAAG,0BAA0B,WAAW,IAAI,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAU;IAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAsB;IACrD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC;IAEb,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,eAAe,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CACL,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PluginSetupBinding } from './types.js';
2
+ /** Parses a comma-separated string of plugin slugs into a deduplicated array. */
3
+ export declare function parsePluginSlugs(value: string): string[];
4
+ /** Throws if any slug is not found in the available bindings. */
5
+ export declare function validatePluginSlugs(bindings: PluginSetupBinding[], plugins?: string[]): void;
@@ -0,0 +1,20 @@
1
+ /** Parses a comma-separated string of plugin slugs into a deduplicated array. */
2
+ export function parsePluginSlugs(value) {
3
+ return [
4
+ ...new Set(value
5
+ .split(',')
6
+ .map(s => s.trim())
7
+ .filter(Boolean)),
8
+ ];
9
+ }
10
+ /** Throws if any slug is not found in the available bindings. */
11
+ export function validatePluginSlugs(bindings, plugins) {
12
+ if (plugins == null || plugins.length === 0) {
13
+ return;
14
+ }
15
+ const unknown = plugins.filter(slug => !bindings.some(b => b.slug === slug));
16
+ if (unknown.length > 0) {
17
+ throw new TypeError(`Unknown plugin slugs: ${unknown.join(', ')}. Available: ${bindings.map(b => b.slug).join(', ')}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../../src/lib/setup/plugins.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO;QACL,GAAG,IAAI,GAAG,CACR,KAAK;aACF,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC,CACnB;KACF,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,mBAAmB,CACjC,QAA8B,EAC9B,OAAkB;IAElB,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,2 +1,11 @@
1
- import type { CliArgs, PluginPromptDescriptor } from './types.js';
1
+ import type { CliArgs, PluginPromptDescriptor, PluginSetupBinding } from './types.js';
2
+ /**
3
+ * Resolves which plugins to include in the generated config.
4
+ *
5
+ * Resolution order (first match wins):
6
+ * 1. `--plugins`: user-provided slugs
7
+ * 2. `--yes`: recommended plugins
8
+ * 3. Interactive: checkbox prompt with recommended plugins pre-checked
9
+ */
10
+ export declare function promptPluginSelection(bindings: PluginSetupBinding[], targetDir: string, { plugins, yes }: CliArgs): Promise<PluginSetupBinding[]>;
2
11
  export declare function promptPluginOptions(descriptors: PluginPromptDescriptor[], cliArgs: CliArgs): Promise<Record<string, string | string[]>>;
@@ -1,6 +1,49 @@
1
1
  import { checkbox, input, select } from '@inquirer/prompts';
2
2
  import { asyncSequential } from '@code-pushup/utils';
3
- // TODO: #1244 — add promptPluginSelection (multi-select prompt with pre-selection callbacks)
3
+ /**
4
+ * Resolves which plugins to include in the generated config.
5
+ *
6
+ * Resolution order (first match wins):
7
+ * 1. `--plugins`: user-provided slugs
8
+ * 2. `--yes`: recommended plugins
9
+ * 3. Interactive: checkbox prompt with recommended plugins pre-checked
10
+ */
11
+ export async function promptPluginSelection(bindings, targetDir, { plugins, yes }) {
12
+ if (bindings.length === 0) {
13
+ return [];
14
+ }
15
+ if (plugins != null && plugins.length > 0) {
16
+ return bindings.filter(b => plugins.includes(b.slug));
17
+ }
18
+ const recommended = await detectRecommended(bindings, targetDir);
19
+ if (yes) {
20
+ return bindings.filter(({ slug }) => recommended.has(slug));
21
+ }
22
+ const selected = await checkbox({
23
+ message: 'Plugins to include:',
24
+ required: true,
25
+ choices: bindings.map(({ title, slug }) => ({
26
+ name: title,
27
+ value: slug,
28
+ checked: recommended.has(slug),
29
+ })),
30
+ });
31
+ const selectedSet = new Set(selected);
32
+ return bindings.filter(({ slug }) => selectedSet.has(slug));
33
+ }
34
+ /**
35
+ * Calls each binding's `isRecommended` callback (if provided)
36
+ * and collects the slugs of bindings that returned `true`.
37
+ */
38
+ async function detectRecommended(bindings, targetDir) {
39
+ const recommended = new Set();
40
+ await Promise.all(bindings.map(async ({ slug, isRecommended }) => {
41
+ if (isRecommended && (await isRecommended(targetDir))) {
42
+ recommended.add(slug);
43
+ }
44
+ }));
45
+ return recommended;
46
+ }
4
47
  export async function promptPluginOptions(descriptors, cliArgs) {
5
48
  const fallback = cliArgs['yes']
6
49
  ? (descriptor) => descriptor.default
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/lib/setup/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,6FAA6F;AAE7F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAqC,EACrC,OAAgB;IAEhB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,CAAC,UAAkC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,EAAC,UAAU,EAAC,EAAE,CAAC;QACrE,UAAU,CAAC,GAAG;QACd,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClE,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,OAAgB;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,UAAkC;IAElC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;gBACX,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B,CAAC,CAAC;QACL,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;gBACZ,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;aACjC,CAAC,CAAC;QACL,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;aACjC,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../src/lib/setup/prompts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { PluginMeta } from '@code-pushup/models';
2
+ export declare const CONFIG_FILE_FORMATS: readonly ["ts", "js", "mjs"];
3
+ export type ConfigFileFormat = (typeof CONFIG_FILE_FORMATS)[number];
2
4
  /** Virtual file system that buffers writes in memory until flushed to disk. */
3
5
  export type Tree = {
4
6
  root: string;
@@ -21,10 +23,19 @@ export type FileSystemAdapter = {
21
23
  recursive: true;
22
24
  }) => Promise<string | undefined>;
23
25
  };
26
+ /**
27
+ * Defines how a plugin integrates with the setup wizard.
28
+ *
29
+ * Each supported plugin provides a binding that controls:
30
+ * - Pre-selection: `isRecommended` detects if the plugin is relevant for the repository
31
+ * - Configuration: `prompts` collect plugin-specific options interactively
32
+ * - Code generation: `generateConfig` produces the import and initialization code
33
+ */
24
34
  export type PluginSetupBinding = {
25
35
  slug: PluginMeta['slug'];
26
36
  title: PluginMeta['title'];
27
37
  packageName: NonNullable<PluginMeta['packageName']>;
38
+ isRecommended?: (targetDir: string) => Promise<boolean>;
28
39
  prompts?: PluginPromptDescriptor[];
29
40
  generateConfig: (answers: Record<string, string | string[]>) => PluginCodegenResult;
30
41
  };
@@ -64,6 +75,8 @@ export type PluginPromptDescriptor = InputPrompt | SelectPrompt | CheckboxPrompt
64
75
  export type CliArgs = {
65
76
  'dry-run'?: boolean;
66
77
  yes?: boolean;
78
+ 'config-format'?: string;
79
+ plugins?: string[];
67
80
  'target-dir'?: string;
68
81
  [key: string]: unknown;
69
82
  };
@@ -1,2 +1,2 @@
1
- export {};
1
+ export const CONFIG_FILE_FORMATS = ['ts', 'js', 'mjs'];
2
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/setup/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/setup/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC"}
@@ -1,2 +1,8 @@
1
1
  import type { CliArgs, PluginSetupBinding } from './types.js';
2
+ /**
3
+ * Runs the interactive setup wizard that generates a Code PushUp config file.
4
+ *
5
+ * All file changes are buffered in a virtual tree rooted at the git root,
6
+ * then flushed to disk in one step (or skipped on `--dry-run`).
7
+ */
2
8
  export declare function runSetupWizard(bindings: PluginSetupBinding[], cliArgs: CliArgs): Promise<void>;
@@ -1,30 +1,39 @@
1
- import { asyncSequential, formatAsciiTable, logger } from '@code-pushup/utils';
1
+ import { asyncSequential, formatAsciiTable, getGitRoot, logger, } from '@code-pushup/utils';
2
2
  import { generateConfigSource } from './codegen.js';
3
- import { promptPluginOptions } from './prompts.js';
3
+ import { promptConfigFormat, readPackageJson, resolveConfigFilename, } from './config-format.js';
4
+ import { resolveGitignore } from './gitignore.js';
5
+ import { promptPluginOptions, promptPluginSelection } from './prompts.js';
4
6
  import { createTree } from './virtual-fs.js';
7
+ /**
8
+ * Runs the interactive setup wizard that generates a Code PushUp config file.
9
+ *
10
+ * All file changes are buffered in a virtual tree rooted at the git root,
11
+ * then flushed to disk in one step (or skipped on `--dry-run`).
12
+ */
5
13
  export async function runSetupWizard(bindings, cliArgs) {
6
14
  const targetDir = cliArgs['target-dir'] ?? process.cwd();
7
15
  // TODO: #1245 — prompt for standalone vs monorepo mode
8
- // TODO: #1244 prompt user to select plugins from available bindings
9
- const pluginResults = await asyncSequential(bindings, binding => resolveBinding(binding, cliArgs));
10
- const tree = createTree(targetDir);
11
- // TODO: #1243 select config file format (TS/JS/MJS) based on user choice or tsconfig detection
12
- await tree.write('code-pushup.config.ts', generateConfigSource(pluginResults));
13
- const changes = tree.listChanges();
16
+ const selectedBindings = await promptPluginSelection(bindings, targetDir, cliArgs);
17
+ const format = await promptConfigFormat(targetDir, cliArgs);
18
+ const packageJson = await readPackageJson(targetDir);
19
+ const filename = resolveConfigFilename(format, packageJson.type === 'module');
20
+ const pluginResults = await asyncSequential(selectedBindings, binding => resolveBinding(binding, cliArgs));
21
+ const gitRoot = await getGitRoot();
22
+ const tree = createTree(gitRoot);
23
+ await tree.write(filename, generateConfigSource(pluginResults, format));
24
+ await resolveGitignore(tree);
25
+ logChanges(tree.listChanges());
14
26
  if (cliArgs['dry-run']) {
15
- logChanges(changes);
16
27
  logger.info('Dry run — no files written.');
28
+ return;
17
29
  }
18
- else {
19
- await tree.flush();
20
- logChanges(changes);
21
- logger.info('Setup complete.');
22
- logger.newline();
23
- logNextSteps([
24
- ['npx code-pushup', 'Collect your first report'],
25
- ['https://github.com/code-pushup/cli#readme', 'Documentation'],
26
- ]);
27
- }
30
+ await tree.flush();
31
+ logger.info('Setup complete.');
32
+ logger.newline();
33
+ logNextSteps([
34
+ ['npx code-pushup', 'Collect your first report'],
35
+ ['https://github.com/code-pushup/cli#readme', 'Documentation'],
36
+ ]);
28
37
  }
29
38
  async function resolveBinding(binding, cliArgs) {
30
39
  const answers = binding.prompts
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../../src/lib/setup/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA8B,EAC9B,OAAgB;IAEhB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzD,uDAAuD;IACvD,sEAAsE;IAEtE,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAC9D,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CACjC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,iGAAiG;IACjG,MAAM,IAAI,CAAC,KAAK,CACd,uBAAuB,EACvB,oBAAoB,CAAC,aAAa,CAAC,CACpC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEnC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,YAAY,CAAC;YACX,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;YAChD,CAAC,2CAA2C,EAAE,eAAe,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAA2B,EAC3B,OAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;QAC7B,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QACrD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,OAAqB;IACvC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,MAAM,CAAC,IAAI,CACT,gBAAgB,CACd;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,KAAK;KACZ,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../../src/lib/setup/wizard.ts"],"names":[],"mappings":"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"}