From d2c32f35d507603c9f11531cc2026412c1129f4c Mon Sep 17 00:00:00 2001 From: Cristi Ciobanu Date: Sun, 6 Jul 2025 19:40:57 +0200 Subject: [PATCH 1/3] allow for custom sides in cli dev script --- .../cli/src/commands/__tests__/dev.test.js | 19 +++++++++++++++++++ packages/cli/src/commands/dev.js | 16 +++++++++++----- packages/cli/src/commands/devHandler.js | 18 +++++++++++++++--- .../src/__tests__/config.test.ts | 4 ++++ packages/project-config/src/config.ts | 16 ++++++++++++++++ 5 files changed, 65 insertions(+), 8 deletions(-) diff --git a/packages/cli/src/commands/__tests__/dev.test.js b/packages/cli/src/commands/__tests__/dev.test.js index ca91aa3e4d..19d4c0ef9d 100644 --- a/packages/cli/src/commands/__tests__/dev.test.js +++ b/packages/cli/src/commands/__tests__/dev.test.js @@ -176,6 +176,25 @@ describe('yarn rw dev', () => { expect(generateCommand.command).toEqual('yarn rw-gen-watch') }) + it('Should run custom side', async () => { + getConfig.mockReturnValue({ + web: { port: 8910 }, + api: { port: 8911 }, + experimental: { + sides: { app: { workspace: 'app', devScript: 'android' } }, + dev: { defaultSides: ['app'] }, + }, + }) + + await handler({ side: ['app'] }) + + const concurrentlyArgs = concurrently.mock.lastCall[0] + + const appCommand = find(concurrentlyArgs, { name: 'app' }) + + expect(appCommand.command).toEqual('yarn workspace app run android') + }) + it('Debug port passed in command line overrides TOML', async () => { getConfig.mockReturnValue({ web: { diff --git a/packages/cli/src/commands/dev.js b/packages/cli/src/commands/dev.js index af91326da3..9b8bd3477d 100644 --- a/packages/cli/src/commands/dev.js +++ b/packages/cli/src/commands/dev.js @@ -1,22 +1,28 @@ import { terminalLink } from 'termi-link' +import { getConfig } from '@cedarjs/project-config' + import c from '../lib/colors.js' import { checkNodeVersion } from '../middleware/checkNodeVersion.js' export const command = 'dev [side..]' -export const description = 'Start development servers for api, and web' +export const description = 'Start development servers all your sides' export const builder = (yargs) => { - // The reason `forward` is hidden is that it's been broken with Vite - // and it's not clear how to fix it. + const projectConfig = getConfig() yargs .positional('side', { - choices: ['api', 'web'], - default: ['api', 'web'], + choices: ['api', 'web', ...Object.keys(projectConfig.experimental.sides)], + default: + projectConfig.experimental.dev.defaultSides.length > 0 + ? projectConfig.experimental.dev.defaultSides + : ['api', 'web'], description: 'Which dev server(s) to start', type: 'array', }) + // The reason `forward` is hidden is that it's been broken with Vite + // and it's not clear how to fix it. .option('forward', { alias: 'fwd', description: diff --git a/packages/cli/src/commands/devHandler.js b/packages/cli/src/commands/devHandler.js index 854ef2461f..07942b0eba 100644 --- a/packages/cli/src/commands/devHandler.js +++ b/packages/cli/src/commands/devHandler.js @@ -193,24 +193,35 @@ export const handler = async ({ NODE_ENV: 'development', NODE_OPTIONS: getDevNodeOptions(), }, - prefixColor: 'cyan', runWhen: () => fs.existsSync(rwjsPaths.api.src), }, web: { name: 'web', command: webCommand, - prefixColor: 'blue', cwd: rwjsPaths.web.base, runWhen: () => fs.existsSync(rwjsPaths.web.src), }, gen: { name: 'gen', command: 'yarn rw-gen-watch', - prefixColor: 'green', runWhen: () => generate, }, } + side + .filter((sideName) => sideName !== 'api' && sideName !== 'web') + .forEach((sideName) => { + const sideConfig = getConfig().experimental.sides[sideName] + + if (sideConfig) { + jobs[sideName] = { + name: sideName, + command: `yarn workspace ${sideConfig.workspace} run ${sideConfig.devScript}`, + runWhen: () => true, + } + } + }) + // TODO: Convert jobs to an array and supply cwd command. const { result } = concurrently( Object.keys(jobs) @@ -224,6 +235,7 @@ export const handler = async ({ prefix: '{name} |', timestampFormat: 'HH:mm:ss', handleInput: true, + prefixColors: 'auto', }, ) result.catch((e) => { diff --git a/packages/project-config/src/__tests__/config.test.ts b/packages/project-config/src/__tests__/config.test.ts index 30b929739e..c29c72d75e 100644 --- a/packages/project-config/src/__tests__/config.test.ts +++ b/packages/project-config/src/__tests__/config.test.ts @@ -55,6 +55,9 @@ describe('getConfig', () => { }, ], }, + "dev": { + "defaultSides": [], + }, "opentelemetry": { "enabled": false, "wrapApi": true, @@ -69,6 +72,7 @@ describe('getConfig', () => { "rsc": { "enabled": false, }, + "sides": {}, "streamingSsr": { "enabled": false, }, diff --git a/packages/project-config/src/config.ts b/packages/project-config/src/config.ts index a756db12a0..248da48487 100644 --- a/packages/project-config/src/config.ts +++ b/packages/project-config/src/config.ts @@ -73,6 +73,14 @@ interface StudioConfig { graphiql?: GraphiQLStudioConfig } +type Sides = Record< + string, + { + workspace: string + devScript: string + } +> + export interface Config { web: BrowserTargetConfig api: NodeTargetConfig @@ -119,6 +127,10 @@ export interface Config { enabled: boolean lintOnly: boolean } + sides: Sides + dev: { + defaultSides: string[] + } } } @@ -205,6 +217,10 @@ const DEFAULT_CONFIG: Config = { enabled: false, lintOnly: false, }, + sides: {}, + dev: { + defaultSides: [], + }, }, } From 24331f3f377c8678771bc9c6a7c951212b893af1 Mon Sep 17 00:00:00 2001 From: Cristi Ciobanu Date: Mon, 7 Jul 2025 16:43:02 +0200 Subject: [PATCH 2/3] move dev property under cli --- packages/cli/src/commands/__tests__/dev.test.js | 2 +- packages/cli/src/commands/dev.js | 4 ++-- packages/project-config/src/__tests__/config.test.ts | 6 +++--- packages/project-config/src/config.ts | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/__tests__/dev.test.js b/packages/cli/src/commands/__tests__/dev.test.js index 19d4c0ef9d..2f662e4fb2 100644 --- a/packages/cli/src/commands/__tests__/dev.test.js +++ b/packages/cli/src/commands/__tests__/dev.test.js @@ -182,7 +182,7 @@ describe('yarn rw dev', () => { api: { port: 8911 }, experimental: { sides: { app: { workspace: 'app', devScript: 'android' } }, - dev: { defaultSides: ['app'] }, + cli: { dev: { defaultSides: ['app'] } }, }, }) diff --git a/packages/cli/src/commands/dev.js b/packages/cli/src/commands/dev.js index 9b8bd3477d..c14985fa0d 100644 --- a/packages/cli/src/commands/dev.js +++ b/packages/cli/src/commands/dev.js @@ -15,8 +15,8 @@ export const builder = (yargs) => { .positional('side', { choices: ['api', 'web', ...Object.keys(projectConfig.experimental.sides)], default: - projectConfig.experimental.dev.defaultSides.length > 0 - ? projectConfig.experimental.dev.defaultSides + projectConfig.experimental.cli.dev.defaultSides.length > 0 + ? projectConfig.experimental.cli.dev.defaultSides : ['api', 'web'], description: 'Which dev server(s) to start', type: 'array', diff --git a/packages/project-config/src/__tests__/config.test.ts b/packages/project-config/src/__tests__/config.test.ts index c29c72d75e..97101fd927 100644 --- a/packages/project-config/src/__tests__/config.test.ts +++ b/packages/project-config/src/__tests__/config.test.ts @@ -46,6 +46,9 @@ describe('getConfig', () => { "experimental": { "cli": { "autoInstall": true, + "dev": { + "defaultSides": [], + }, "plugins": [ { "package": "@cedarjs/cli-storybook-vite", @@ -55,9 +58,6 @@ describe('getConfig', () => { }, ], }, - "dev": { - "defaultSides": [], - }, "opentelemetry": { "enabled": false, "wrapApi": true, diff --git a/packages/project-config/src/config.ts b/packages/project-config/src/config.ts index 248da48487..62d675f917 100644 --- a/packages/project-config/src/config.ts +++ b/packages/project-config/src/config.ts @@ -112,6 +112,9 @@ export interface Config { cli: { autoInstall: boolean plugins: CLIPlugin[] + dev: { + defaultSides: string[] + } } useSDLCodeGenForGraphQLTypes: boolean streamingSsr: { @@ -128,9 +131,6 @@ export interface Config { lintOnly: boolean } sides: Sides - dev: { - defaultSides: string[] - } } } @@ -202,6 +202,9 @@ const DEFAULT_CONFIG: Config = { package: '@cedarjs/cli-data-migrate', }, ], + dev: { + defaultSides: [], + }, }, useSDLCodeGenForGraphQLTypes: false, streamingSsr: { @@ -218,9 +221,6 @@ const DEFAULT_CONFIG: Config = { lintOnly: false, }, sides: {}, - dev: { - defaultSides: [], - }, }, } From 41aa04b2706f6f6165ae0ab9547e0629a892d337 Mon Sep 17 00:00:00 2001 From: Cristi Ciobanu Date: Wed, 9 Jul 2025 17:32:29 +0200 Subject: [PATCH 3/3] update description Co-authored-by: Tobbe Lundberg --- packages/cli/src/commands/dev.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/dev.js b/packages/cli/src/commands/dev.js index c14985fa0d..26f2bb1994 100644 --- a/packages/cli/src/commands/dev.js +++ b/packages/cli/src/commands/dev.js @@ -6,7 +6,7 @@ import c from '../lib/colors.js' import { checkNodeVersion } from '../middleware/checkNodeVersion.js' export const command = 'dev [side..]' -export const description = 'Start development servers all your sides' +export const description = 'Start development servers for your sides' export const builder = (yargs) => { const projectConfig = getConfig()