diff --git a/package-lock.json b/package-lock.json index 5bb37f4b4..e82735aa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "MIT", "dependencies": { - "@nx/nx-darwin-x64": "*", + "@nx/nx-darwin-x64": "^16.9.1", "bundle-require": "^4.0.1", "chalk": "^5.3.0", "cliui": "^8.0.1", diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 75ba31ff4..fe5203fc4 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,13 +1,17 @@ import { yargsCli } from './lib/cli'; -import { yargsGlobalOptionsDefinition } from './lib/options'; +import { options } from './lib/options'; import { middlewares } from './lib/middlewares'; import { commands } from './lib/commands'; +export { options } from './lib/options'; +export { middlewares } from './lib/middlewares'; +export { commands } from './lib/commands'; + export const cli = (args: string[]) => yargsCli(args, { usageMessage: 'Code PushUp CLI', scriptName: 'code-pushup', - options: yargsGlobalOptionsDefinition(), + options, middlewares, commands, }); diff --git a/packages/cli/src/lib/cli.spec.ts b/packages/cli/src/lib/cli.spec.ts index c6d9b4d60..3cc61a693 100644 --- a/packages/cli/src/lib/cli.spec.ts +++ b/packages/cli/src/lib/cli.spec.ts @@ -1,16 +1,16 @@ import { join } from 'path'; import { describe, expect, it } from 'vitest'; import { yargsCli } from './cli'; -import { CommandBase } from './implementation/base-command-config'; import { getDirname } from './implementation/utils'; import { middlewares } from './middlewares'; -import { yargsGlobalOptionsDefinition } from './options'; +import { options as defaultOptions } from './options'; +import { CommandBase } from './implementation/model'; const __dirname = getDirname(import.meta.url); const withDirName = (path: string) => join(__dirname, path); const validConfigPath = withDirName('implementation/mock/cli-config.mock.js'); -const options = yargsGlobalOptionsDefinition(); +const options = defaultOptions; const demandCommand: [number, string] = [0, 'no command required']; describe('CLI arguments parsing', () => { diff --git a/packages/cli/src/lib/collect/command-object.spec.ts b/packages/cli/src/lib/collect/command-object.spec.ts index aa98da328..ff09303eb 100644 --- a/packages/cli/src/lib/collect/command-object.spec.ts +++ b/packages/cli/src/lib/collect/command-object.spec.ts @@ -6,7 +6,7 @@ import { join } from 'node:path'; import { yargsCli } from '../cli'; import { getDirname, logErrorBeforeThrow } from '../implementation/utils'; import { middlewares } from '../middlewares'; -import { yargsGlobalOptionsDefinition } from '../options'; +import { yargsGlobalOptionsDefinition } from '../implementation/global-options'; import { yargsCollectCommandObject } from './command-object'; const command = { diff --git a/packages/cli/src/lib/implementation/base-command-config.ts b/packages/cli/src/lib/implementation/base-command-config.ts deleted file mode 100644 index 107c7a9f5..000000000 --- a/packages/cli/src/lib/implementation/base-command-config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - globalCliArgsSchema, - refineCoreConfig, - unrefinedCoreConfigSchema, -} from '@quality-metrics/models'; -import { z } from 'zod'; - -export const commandBaseSchema = refineCoreConfig( - globalCliArgsSchema.merge(unrefinedCoreConfigSchema), -); -export type CommandBase = z.infer; diff --git a/packages/cli/src/lib/implementation/config-middleware.ts b/packages/cli/src/lib/implementation/config-middleware.ts index 228c1d13e..3ca80af0f 100644 --- a/packages/cli/src/lib/implementation/config-middleware.ts +++ b/packages/cli/src/lib/implementation/config-middleware.ts @@ -1,8 +1,7 @@ import { bundleRequire } from 'bundle-require'; import { stat } from 'fs/promises'; - -import { GlobalCliArgs, globalCliArgsSchema } from '@quality-metrics/models'; -import { CommandBase, commandBaseSchema } from './base-command-config'; +import { GlobalOptions, globalOptionsSchema } from '../model'; +import { CommandBase, commandBaseSchema } from './model'; export class ConfigParseError extends Error { constructor(configPath: string) { @@ -13,7 +12,7 @@ export class ConfigParseError extends Error { export async function configMiddleware( processArgs: T, ): Promise { - const globalCfg: GlobalCliArgs = globalCliArgsSchema.parse(processArgs); + const globalCfg: GlobalOptions = globalOptionsSchema.parse(processArgs); const { configPath } = globalCfg; try { const stats = await stat(configPath); diff --git a/packages/cli/src/lib/implementation/global-options.ts b/packages/cli/src/lib/implementation/global-options.ts new file mode 100644 index 000000000..4e31edc53 --- /dev/null +++ b/packages/cli/src/lib/implementation/global-options.ts @@ -0,0 +1,26 @@ +import { GlobalOptions } from '../model'; +import { Options } from 'yargs'; + +export function yargsGlobalOptionsDefinition(): Record< + keyof GlobalOptions, + Options +> { + return { + interactive: { + describe: 'When false disables interactive input prompts for options.', + type: 'boolean', + default: true, + }, + verbose: { + describe: + 'When true creates more verbose output. This is helpful when debugging.', + type: 'boolean', + default: false, + }, + configPath: { + describe: 'Path the the config file, e.g. code-pushup.config.js', + type: 'string', + default: 'code-pushup.config.js', + }, + }; +} diff --git a/packages/cli/src/lib/implementation/model.ts b/packages/cli/src/lib/implementation/model.ts new file mode 100644 index 000000000..3f021cc82 --- /dev/null +++ b/packages/cli/src/lib/implementation/model.ts @@ -0,0 +1,24 @@ +import { + globalOptionsSchema as coreGlobalOptionsSchema, + refineCoreConfig, + unrefinedCoreConfigSchema, +} from '@quality-metrics/models'; +import { z } from 'zod'; + +export const globalOptionsSchema = coreGlobalOptionsSchema.merge( + z.object({ + interactive: z + .boolean({ + description: + 'flag if interactivity should be considered. Useful for CI runs.', + }) + .default(true), + }), +); + +export type GlobalOptions = z.infer; + +export const commandBaseSchema = refineCoreConfig( + globalOptionsSchema.merge(unrefinedCoreConfigSchema), +); +export type CommandBase = z.infer; diff --git a/packages/cli/src/lib/model.ts b/packages/cli/src/lib/model.ts new file mode 100644 index 000000000..a9a03c7d4 --- /dev/null +++ b/packages/cli/src/lib/model.ts @@ -0,0 +1,15 @@ +import { globalOptionsSchema as coreGlobalOptionsSchema } from '@quality-metrics/models'; +import { z } from 'zod'; + +export const globalOptionsSchema = coreGlobalOptionsSchema.merge( + z.object({ + interactive: z + .boolean({ + description: + 'flag if interactivity should be considered. Useful for CI runs.', + }) + .default(true), + }), +); + +export type GlobalOptions = z.infer; diff --git a/packages/cli/src/lib/options.ts b/packages/cli/src/lib/options.ts index e3d7a2a1a..92370fe49 100644 --- a/packages/cli/src/lib/options.ts +++ b/packages/cli/src/lib/options.ts @@ -1,22 +1,5 @@ -import { Options } from 'yargs'; +import { yargsGlobalOptionsDefinition } from './implementation/global-options'; -export function yargsGlobalOptionsDefinition(): Record { - return { - interactive: { - describe: 'When false disables interactive input prompts for options.', - type: 'boolean', - default: true, - }, - verbose: { - describe: - 'When true creates more verbose output. This is helpful when debugging.', - type: 'boolean', - default: false, - }, - configPath: { - describe: 'Path the the config file, e.g. code-pushup.config.js', - type: 'string', - default: 'code-pushup.config.js', - }, - }; -} +export const options = { + ...yargsGlobalOptionsDefinition(), +}; diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts index 2fb8596c0..d472b7c12 100644 --- a/packages/models/src/index.ts +++ b/packages/models/src/index.ts @@ -1,5 +1,5 @@ export { CategoryConfig, categoryConfigSchema } from './lib/category-config'; -export { GlobalCliArgs, globalCliArgsSchema } from './lib/global-cli-options'; +export { GlobalOptions, globalOptionsSchema } from './lib/global-options'; export { CoreConfig, coreConfigSchema, diff --git a/packages/models/src/lib/global-cli-options.ts b/packages/models/src/lib/global-options.ts similarity index 60% rename from packages/models/src/lib/global-cli-options.ts rename to packages/models/src/lib/global-options.ts index f07083aa6..11132256b 100644 --- a/packages/models/src/lib/global-cli-options.ts +++ b/packages/models/src/lib/global-options.ts @@ -1,13 +1,7 @@ import { z } from 'zod'; import { generalFilePathSchema } from './implementation/schemas'; -export const globalCliArgsSchema = z.object({ - interactive: z - .boolean({ - description: - 'flag if interactivity should be considered. Useful for CI runs.', - }) - .default(true), +export const globalOptionsSchema = z.object({ verbose: z .boolean({ description: 'Outputs additional information for a run', @@ -20,4 +14,4 @@ export const globalCliArgsSchema = z.object({ .default('code-pushup.config.js'), }); -export type GlobalCliArgs = z.infer; +export type GlobalOptions = z.infer; diff --git a/packages/utils/src/lib/collect/index.ts b/packages/utils/src/lib/collect/index.ts index 58505175e..4675b1773 100644 --- a/packages/utils/src/lib/collect/index.ts +++ b/packages/utils/src/lib/collect/index.ts @@ -1,4 +1,4 @@ -import { CoreConfig, GlobalCliArgs, Report } from '@quality-metrics/models'; +import { CoreConfig, GlobalOptions, Report } from '@quality-metrics/models'; import { executePlugins } from './implementation/execute-plugin'; import { calcDuration } from './implementation/utils'; @@ -17,7 +17,7 @@ export class CollectOutputError extends Error { } } -export type CollectOptions = GlobalCliArgs & CoreConfig; +export type CollectOptions = GlobalOptions & CoreConfig; /** * Run audits, collect plugin output and aggregate it into a JSON object