@code-pushup/create-cli 0.113.1 → 0.115.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/README.md CHANGED
@@ -4,29 +4,40 @@
4
4
  [![downloads](https://img.shields.io/npm/dm/%40code-pushup%2Fcreate-cli)](https://npmtrends.com/@code-pushup/create-cli)
5
5
  [![dependencies](https://img.shields.io/librariesio/release/npm/%40code-pushup/create-cli)](https://www.npmjs.com/package/@code-pushup/create-cli?activeTab=dependencies)
6
6
 
7
- A CLI tool to set up Code PushUp in your repository.
7
+ An interactive setup wizard that scaffolds a `code-pushup.config.ts` file in your repository.
8
8
 
9
9
  ## Usage
10
10
 
11
- To set up Code PushUp, run the following command:
12
-
13
11
  ```bash
14
- npx init @code-pushup/cli
12
+ npm init @code-pushup/cli
15
13
  ```
16
14
 
17
- alternatives:
15
+ The wizard will prompt you to select plugins and configure their options, then generate a `code-pushup.config.ts` file.
16
+
17
+ ## Options
18
+
19
+ | Flag | Description | Default |
20
+ | ------------- | -------------------------------------- | ------- |
21
+ | `--plugins` | Comma-separated plugin slugs to enable | |
22
+ | `--dry-run` | Preview changes without writing files | `false` |
23
+ | `--yes`, `-y` | Skip prompts and use defaults | `false` |
24
+
25
+ ### Examples
26
+
27
+ Run interactively (default):
18
28
 
19
29
  ```bash
20
- npx @code-pushup/create-cli
21
- npm exec @code-pushup/create-cli
30
+ npm init @code-pushup/cli
22
31
  ```
23
32
 
24
- It should generate the following output:
33
+ Skip prompts and enable specific plugins:
25
34
 
26
35
  ```bash
27
- > <✓> Generating @code-pushup/nx-plugin:init
36
+ npm init @code-pushup/cli -y --plugins=eslint,coverage
37
+ ```
28
38
 
29
- > <✓> Generating @code-pushup/nx-plugin:configuration
39
+ Preview the generated config without writing:
30
40
 
31
- CREATE code-pushup.config.ts
41
+ ```bash
42
+ npm init @code-pushup/cli -y --dry-run
32
43
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/create-cli",
3
- "version": "0.113.1",
3
+ "version": "0.115.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,10 @@
26
26
  },
27
27
  "type": "module",
28
28
  "dependencies": {
29
- "@code-pushup/nx-plugin": "0.113.1",
30
- "@code-pushup/utils": "0.113.1"
29
+ "@code-pushup/models": "0.115.0",
30
+ "@code-pushup/utils": "0.115.0",
31
+ "@inquirer/prompts": "^8.0.0",
32
+ "yargs": "^17.7.2"
31
33
  },
32
34
  "files": [
33
35
  "src",
package/src/index.js CHANGED
@@ -1,4 +1,26 @@
1
1
  #! /usr/bin/env node
2
- import { initCodePushup } from './lib/init.js';
3
- await initCodePushup();
2
+ import yargs from 'yargs';
3
+ import { hideBin } from 'yargs/helpers';
4
+ import { CONFIG_FILE_FORMATS } from './lib/setup/types.js';
5
+ import { runSetupWizard } from './lib/setup/wizard.js';
6
+ const argv = await yargs(hideBin(process.argv))
7
+ .option('dry-run', {
8
+ type: 'boolean',
9
+ default: false,
10
+ describe: 'Preview changes without writing files',
11
+ })
12
+ .option('yes', {
13
+ alias: 'y',
14
+ type: 'boolean',
15
+ default: false,
16
+ describe: 'Skip prompts and use defaults',
17
+ })
18
+ .option('config-format', {
19
+ type: 'string',
20
+ choices: CONFIG_FILE_FORMATS,
21
+ describe: 'Config file format (default: auto-detected from project)',
22
+ })
23
+ .parse();
24
+ // TODO: #1244 — provide plugin bindings from registry
25
+ await runSetupWizard([], argv);
4
26
  //# 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,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,cAAc,EAAE,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,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,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,MAAM,CAAC,eAAe,EAAE;IACvB,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,0DAA0D;CACrE,CAAC;KACD,KAAK,EAAE,CAAC;AAEX,sDAAsD;AACtD,MAAM,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ConfigFileFormat, PluginCodegenResult } from './types.js';
2
+ export declare function generateConfigSource(plugins: PluginCodegenResult[], format: ConfigFileFormat): string;
@@ -0,0 +1,79 @@
1
+ const CORE_CONFIG_IMPORT = {
2
+ moduleSpecifier: '@code-pushup/models',
3
+ namedImports: ['CoreConfig'],
4
+ isTypeOnly: true,
5
+ };
6
+ class CodeBuilder {
7
+ lines = [];
8
+ addLine(text, depth = 0) {
9
+ this.lines.push(`${' '.repeat(depth)}${text}`);
10
+ }
11
+ addLines(texts, depth = 0) {
12
+ texts.forEach(text => {
13
+ this.addLine(text, depth);
14
+ });
15
+ }
16
+ addEmptyLine() {
17
+ this.lines.push('');
18
+ }
19
+ toString() {
20
+ return `${this.lines.join('\n')}\n`;
21
+ }
22
+ }
23
+ function formatImport({ moduleSpecifier, defaultImport, namedImports, isTypeOnly, }) {
24
+ const named = namedImports?.length ? `{ ${namedImports.join(', ')} }` : '';
25
+ const bindings = [defaultImport, named].filter(Boolean).join(', ');
26
+ const from = bindings ? `${bindings} from ` : '';
27
+ const type = isTypeOnly ? 'type ' : '';
28
+ return `import ${type}${from}'${moduleSpecifier}';`;
29
+ }
30
+ function collectTsImports(plugins) {
31
+ return [
32
+ CORE_CONFIG_IMPORT,
33
+ ...plugins.flatMap(({ imports }) => imports),
34
+ ].toSorted((a, b) => a.moduleSpecifier.localeCompare(b.moduleSpecifier));
35
+ }
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) {
43
+ if (plugins.length === 0) {
44
+ builder.addLine('plugins: [],', 1);
45
+ }
46
+ else {
47
+ builder.addLine('plugins: [', 1);
48
+ builder.addLines(plugins.map(({ pluginInit }) => `${pluginInit},`), 2);
49
+ builder.addLine('],', 1);
50
+ }
51
+ }
52
+ export function generateConfigSource(plugins, format) {
53
+ return format === 'ts'
54
+ ? generateTsConfig(plugins)
55
+ : generateJsConfig(plugins);
56
+ }
57
+ function generateTsConfig(plugins) {
58
+ const builder = new CodeBuilder();
59
+ builder.addLines(collectTsImports(plugins).map(formatImport));
60
+ builder.addEmptyLine();
61
+ builder.addLine('export default {');
62
+ addPlugins(builder, plugins);
63
+ builder.addLine('} satisfies CoreConfig;');
64
+ return builder.toString();
65
+ }
66
+ function generateJsConfig(plugins) {
67
+ const builder = new CodeBuilder();
68
+ const pluginImports = collectJsImports(plugins);
69
+ if (pluginImports.length > 0) {
70
+ builder.addLines(pluginImports.map(formatImport));
71
+ builder.addEmptyLine();
72
+ }
73
+ builder.addLine("/** @type {import('@code-pushup/models').CoreConfig} */");
74
+ builder.addLine('export default {');
75
+ addPlugins(builder, plugins);
76
+ builder.addLine('};');
77
+ return builder.toString();
78
+ }
79
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../../src/lib/setup/codegen.ts"],"names":[],"mappings":"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"}
@@ -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 { CliArgs, PluginPromptDescriptor } from './types.js';
2
+ export declare function promptPluginOptions(descriptors: PluginPromptDescriptor[], cliArgs: CliArgs): Promise<Record<string, string | string[]>>;
@@ -0,0 +1,37 @@
1
+ import { checkbox, input, select } from '@inquirer/prompts';
2
+ import { asyncSequential } from '@code-pushup/utils';
3
+ // TODO: #1244 — add promptPluginSelection (multi-select prompt with pre-selection callbacks)
4
+ export async function promptPluginOptions(descriptors, cliArgs) {
5
+ const fallback = cliArgs['yes']
6
+ ? (descriptor) => descriptor.default
7
+ : runPrompt;
8
+ const entries = await asyncSequential(descriptors, async (descriptor) => [
9
+ descriptor.key,
10
+ cliValue(descriptor.key, cliArgs) ?? (await fallback(descriptor)),
11
+ ]);
12
+ return Object.fromEntries(entries);
13
+ }
14
+ function cliValue(key, cliArgs) {
15
+ const value = cliArgs[key];
16
+ return typeof value === 'string' ? value : undefined;
17
+ }
18
+ async function runPrompt(descriptor) {
19
+ switch (descriptor.type) {
20
+ case 'input':
21
+ return input({
22
+ message: descriptor.message,
23
+ default: descriptor.default,
24
+ });
25
+ case 'select':
26
+ return select({
27
+ message: descriptor.message,
28
+ choices: [...descriptor.choices],
29
+ });
30
+ case 'checkbox':
31
+ return checkbox({
32
+ message: descriptor.message,
33
+ choices: [...descriptor.choices],
34
+ });
35
+ }
36
+ }
37
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +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"}
@@ -0,0 +1,73 @@
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];
4
+ /** Virtual file system that buffers writes in memory until flushed to disk. */
5
+ export type Tree = {
6
+ root: string;
7
+ exists: (filePath: string) => Promise<boolean>;
8
+ read: (filePath: string) => Promise<string | null>;
9
+ write: (filePath: string, content: string) => Promise<void>;
10
+ listChanges: () => FileChange[];
11
+ flush: () => Promise<void>;
12
+ };
13
+ export type FileChange = {
14
+ path: string;
15
+ type: 'CREATE' | 'UPDATE';
16
+ content: string;
17
+ };
18
+ export type FileSystemAdapter = {
19
+ readFile: (path: string, encoding: 'utf8') => Promise<string>;
20
+ writeFile: (path: string, content: string) => Promise<void>;
21
+ exists: (path: string) => Promise<boolean>;
22
+ mkdir: (path: string, options: {
23
+ recursive: true;
24
+ }) => Promise<string | undefined>;
25
+ };
26
+ export type PluginSetupBinding = {
27
+ slug: PluginMeta['slug'];
28
+ title: PluginMeta['title'];
29
+ packageName: NonNullable<PluginMeta['packageName']>;
30
+ prompts?: PluginPromptDescriptor[];
31
+ generateConfig: (answers: Record<string, string | string[]>) => PluginCodegenResult;
32
+ };
33
+ export type ImportDeclarationStructure = {
34
+ moduleSpecifier: string;
35
+ defaultImport?: string;
36
+ namedImports?: string[];
37
+ isTypeOnly?: boolean;
38
+ };
39
+ export type PluginCodegenResult = {
40
+ imports: ImportDeclarationStructure[];
41
+ pluginInit: string;
42
+ };
43
+ type PromptBase = {
44
+ key: string;
45
+ message: string;
46
+ };
47
+ type PromptChoice<T extends string> = {
48
+ name: string;
49
+ value: T;
50
+ };
51
+ type InputPrompt = PromptBase & {
52
+ type: 'input';
53
+ default: string;
54
+ };
55
+ type SelectPrompt<T extends string = string> = PromptBase & {
56
+ type: 'select';
57
+ choices: PromptChoice<T>[];
58
+ default: T;
59
+ };
60
+ type CheckboxPrompt<T extends string = string> = PromptBase & {
61
+ type: 'checkbox';
62
+ choices: PromptChoice<T>[];
63
+ default: T[];
64
+ };
65
+ export type PluginPromptDescriptor = InputPrompt | SelectPrompt | CheckboxPrompt;
66
+ export type CliArgs = {
67
+ 'dry-run'?: boolean;
68
+ yes?: boolean;
69
+ 'config-format'?: string;
70
+ 'target-dir'?: string;
71
+ [key: string]: unknown;
72
+ };
73
+ export {};
@@ -0,0 +1,2 @@
1
+ export const CONFIG_FILE_FORMATS = ['ts', 'js', 'mjs'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ import type { FileSystemAdapter, Tree } from './types.js';
2
+ export declare function createTree(root: string, fs?: FileSystemAdapter): Tree;
@@ -0,0 +1,46 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileExists } from '@code-pushup/utils';
4
+ const DEFAULT_FS = {
5
+ readFile,
6
+ writeFile,
7
+ exists: fileExists,
8
+ mkdir,
9
+ };
10
+ export function createTree(root, fs = DEFAULT_FS) {
11
+ const pending = new Map();
12
+ const resolve = (filePath) => path.resolve(root, filePath);
13
+ return {
14
+ root,
15
+ exists: async (filePath) => pending.has(filePath) || fs.exists(resolve(filePath)),
16
+ read: async (filePath) => {
17
+ const entry = pending.get(filePath);
18
+ if (entry) {
19
+ return entry.content;
20
+ }
21
+ const absolutePath = resolve(filePath);
22
+ if (!(await fs.exists(absolutePath))) {
23
+ return null;
24
+ }
25
+ return fs.readFile(absolutePath, 'utf8');
26
+ },
27
+ write: async (filePath, content) => {
28
+ const type = (await fs.exists(resolve(filePath))) ? 'UPDATE' : 'CREATE';
29
+ pending.set(filePath, { content, type });
30
+ },
31
+ listChanges: () => [...pending.entries()].map(([filePath, { content, type }]) => ({
32
+ path: filePath,
33
+ type,
34
+ content,
35
+ })),
36
+ async flush() {
37
+ await Promise.all([...pending.entries()].map(async ([filePath, { content }]) => {
38
+ const absolutePath = resolve(filePath);
39
+ await fs.mkdir(path.dirname(absolutePath), { recursive: true });
40
+ await fs.writeFile(absolutePath, content);
41
+ }));
42
+ pending.clear();
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=virtual-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-fs.js","sourceRoot":"","sources":["../../../../src/lib/setup/virtual-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,UAAU,GAAsB;IACpC,QAAQ;IACR,SAAS;IACT,MAAM,EAAE,UAAU;IAClB,KAAK;CACN,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,KAAwB,UAAU;IAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgD,CAAC;IAExE,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3E,OAAO;QACL,IAAI;QAEJ,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAoB,EAAE,CACnD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,EAAE,KAAK,EAAE,QAAgB,EAA0B,EAAE;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB,CAAC;YACD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,OAAe,EAAiB,EAAE;YAChE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,WAAW,EAAE,GAAiB,EAAE,CAC9B,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,OAAO;SACR,CAAC,CAAC;QAEL,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;gBAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC,CAAC,CACH,CAAC;YACF,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliArgs, PluginSetupBinding } from './types.js';
2
+ /** Runs the interactive setup wizard that generates a Code PushUp config file. */
3
+ export declare function runSetupWizard(bindings: PluginSetupBinding[], cliArgs: CliArgs): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { asyncSequential, formatAsciiTable, logger } from '@code-pushup/utils';
2
+ import { generateConfigSource } from './codegen.js';
3
+ import { promptConfigFormat, readPackageJson, resolveConfigFilename, } from './config-format.js';
4
+ import { promptPluginOptions } from './prompts.js';
5
+ import { createTree } from './virtual-fs.js';
6
+ /** Runs the interactive setup wizard that generates a Code PushUp config file. */
7
+ export async function runSetupWizard(bindings, cliArgs) {
8
+ const targetDir = cliArgs['target-dir'] ?? process.cwd();
9
+ // TODO: #1245 — prompt for standalone vs monorepo mode
10
+ // TODO: #1244 — prompt user to select plugins from available bindings
11
+ const format = await promptConfigFormat(targetDir, cliArgs);
12
+ const packageJson = await readPackageJson(targetDir);
13
+ const filename = resolveConfigFilename(format, packageJson.type === 'module');
14
+ const pluginResults = await asyncSequential(bindings, binding => resolveBinding(binding, cliArgs));
15
+ const tree = createTree(targetDir);
16
+ await tree.write(filename, generateConfigSource(pluginResults, format));
17
+ const changes = tree.listChanges();
18
+ if (cliArgs['dry-run']) {
19
+ logChanges(changes);
20
+ logger.info('Dry run — no files written.');
21
+ }
22
+ else {
23
+ await tree.flush();
24
+ logChanges(changes);
25
+ logger.info('Setup complete.');
26
+ logger.newline();
27
+ logNextSteps([
28
+ ['npx code-pushup', 'Collect your first report'],
29
+ ['https://github.com/code-pushup/cli#readme', 'Documentation'],
30
+ ]);
31
+ }
32
+ }
33
+ async function resolveBinding(binding, cliArgs) {
34
+ const answers = binding.prompts
35
+ ? await promptPluginOptions(binding.prompts, cliArgs)
36
+ : {};
37
+ return binding.generateConfig(answers);
38
+ }
39
+ function logChanges(changes) {
40
+ changes.forEach(change => {
41
+ logger.info(`${change.type} ${change.path}`);
42
+ });
43
+ }
44
+ function logNextSteps(steps) {
45
+ logger.info(formatAsciiTable({
46
+ title: 'Next steps:',
47
+ rows: steps,
48
+ }, { borderless: true }));
49
+ }
50
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +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,EACL,kBAAkB,EAClB,eAAe,EACf,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,kFAAkF;AAClF,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,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAE9E,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,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAExE,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,5 +0,0 @@
1
- export declare const NX_JSON_FILENAME = "nx.json";
2
- export declare const NX_JSON_CONTENT: string;
3
- export declare const PROJECT_NAME = "source-root";
4
- export declare const PROJECT_JSON_FILENAME = "project.json";
5
- export declare const PROJECT_JSON_CONTENT: string;
@@ -1,12 +0,0 @@
1
- export const NX_JSON_FILENAME = 'nx.json';
2
- export const NX_JSON_CONTENT = JSON.stringify({
3
- $schema: './node_modules/nx/schemas/nx-schema.json',
4
- targetDefaults: {},
5
- });
6
- export const PROJECT_NAME = 'source-root';
7
- export const PROJECT_JSON_FILENAME = 'project.json';
8
- export const PROJECT_JSON_CONTENT = JSON.stringify({
9
- $schema: 'node_modules/nx/schemas/project-schema.json',
10
- name: PROJECT_NAME,
11
- });
12
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5C,OAAO,EAAE,0CAA0C;IACnD,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC;IACjD,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE,YAAY;CACnB,CAAC,CAAC"}
package/src/lib/init.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { type ProcessConfig } from '@code-pushup/utils';
2
- export declare function nxPluginGenerator(generator: 'init' | 'configuration', opt?: Record<string, unknown>): ProcessConfig;
3
- export declare function initCodePushup(): Promise<void>;
package/src/lib/init.js DELETED
@@ -1,27 +0,0 @@
1
- import { executeProcess, objectToCliArgs, } from '@code-pushup/utils';
2
- import { parseNxProcessOutput, setupNxContext, teardownNxContext, } from './utils.js';
3
- export function nxPluginGenerator(generator, opt = {}) {
4
- return {
5
- command: 'npx',
6
- args: objectToCliArgs({
7
- _: ['nx', 'g', `@code-pushup/nx-plugin:${generator}`],
8
- ...opt,
9
- }),
10
- };
11
- }
12
- export async function initCodePushup() {
13
- const setupResult = await setupNxContext();
14
- await executeProcess({
15
- ...nxPluginGenerator('init', {
16
- skipNxJson: true,
17
- }),
18
- });
19
- const { stdout: configStdout, stderr: configStderr } = await executeProcess(nxPluginGenerator('configuration', {
20
- skipTarget: true,
21
- project: setupResult.projectName,
22
- }));
23
- console.info(parseNxProcessOutput(configStdout));
24
- console.warn(parseNxProcessOutput(configStderr));
25
- await teardownNxContext(setupResult);
26
- }
27
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,iBAAiB,CAC/B,SAAmC,EACnC,MAA+B,EAAE;IAEjC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,eAAe,CAAC;YACpB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,0BAA0B,SAAS,EAAE,CAAC;YACrD,GAAG,GAAG;SACP,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAE3C,MAAM,cAAc,CAAC;QACnB,GAAG,iBAAiB,CAAC,MAAM,EAAE;YAC3B,UAAU,EAAE,IAAI;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,cAAc,CACzE,iBAAiB,CAAC,eAAe,EAAE;QACjC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,WAAW,CAAC,WAAW;KACjC,CAAC,CACH,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjD,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
@@ -1,15 +0,0 @@
1
- export type SetupResult = {
2
- filename: string;
3
- teardown: boolean;
4
- };
5
- export declare function setupFile(filename: string, content?: string): Promise<SetupResult>;
6
- export declare function parseNxProcessOutput(output: string): string;
7
- export declare function setupNxContext(): Promise<{
8
- nxJsonTeardown: boolean;
9
- projectJsonTeardown: boolean;
10
- projectName: string;
11
- }>;
12
- export declare function teardownNxContext({ nxJsonTeardown, projectJsonTeardown, }: {
13
- nxJsonTeardown: boolean;
14
- projectJsonTeardown: boolean;
15
- }): Promise<void>;
package/src/lib/utils.js DELETED
@@ -1,51 +0,0 @@
1
- import { readFile, rm, stat, writeFile } from 'node:fs/promises';
2
- import { CODE_PUSHUP_UNICODE_LOGO } from '@code-pushup/utils';
3
- import { NX_JSON_CONTENT, NX_JSON_FILENAME, PROJECT_JSON_CONTENT, PROJECT_JSON_FILENAME, PROJECT_NAME, } from './constants.js';
4
- export async function setupFile(filename, content = '') {
5
- const setupResult = {
6
- filename,
7
- teardown: false,
8
- };
9
- try {
10
- const stats = await stat(filename);
11
- if (!stats.isFile()) {
12
- await writeFile(filename, content);
13
- }
14
- }
15
- catch (error) {
16
- if (error instanceof Error &&
17
- error.message.includes('no such file or directory')) {
18
- await writeFile(filename, content);
19
- return {
20
- ...setupResult,
21
- teardown: true,
22
- };
23
- }
24
- else {
25
- console.error(error);
26
- }
27
- }
28
- return setupResult;
29
- }
30
- export function parseNxProcessOutput(output) {
31
- return output.trim().replace('NX', CODE_PUSHUP_UNICODE_LOGO);
32
- }
33
- export async function setupNxContext() {
34
- const { teardown: nxJsonTeardown } = await setupFile(NX_JSON_FILENAME, NX_JSON_CONTENT);
35
- const { teardown: projectJsonTeardown } = await setupFile(PROJECT_JSON_FILENAME, PROJECT_JSON_CONTENT);
36
- const projectJsonContent = await readFile(PROJECT_JSON_FILENAME, 'utf8');
37
- const { name = PROJECT_NAME } = JSON.parse(projectJsonContent);
38
- return {
39
- nxJsonTeardown,
40
- projectJsonTeardown,
41
- projectName: name,
42
- };
43
- }
44
- export async function teardownNxContext({ nxJsonTeardown, projectJsonTeardown, }) {
45
- const filesToDelete = [
46
- ...(nxJsonTeardown ? [NX_JSON_FILENAME] : []),
47
- ...(projectJsonTeardown ? [PROJECT_JSON_FILENAME] : []),
48
- ];
49
- await Promise.all(filesToDelete.map(file => rm(file)));
50
- }
51
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAOxB,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAO,GAAG,EAAE;IAEZ,MAAM,WAAW,GAAgB;QAC/B,QAAQ;QACR,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EACnD,CAAC;YACD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO;gBACL,GAAG,WAAW;gBACd,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAKlC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,SAAS,CAClD,gBAAgB,EAChB,eAAe,CAChB,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,MAAM,SAAS,CACvD,qBAAqB,EACrB,oBAAoB,CACrB,CAAC;IAEF,MAAM,kBAAkB,GAAG,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,EAAE,IAAI,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAE5D,CAAC;IAEF,OAAO;QACL,cAAc;QACd,mBAAmB;QACnB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,cAAc,EACd,mBAAmB,GAIpB;IACC,MAAM,aAAa,GAAG;QACpB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}