diff --git a/.changeset/poor-llamas-taste.md b/.changeset/poor-llamas-taste.md new file mode 100644 index 00000000000..639c688bb13 --- /dev/null +++ b/.changeset/poor-llamas-taste.md @@ -0,0 +1,5 @@ +--- +'@shopify/polaris-migrator': minor +--- + +Updated the CLI to accept a file list via `stdin` diff --git a/polaris-migrator/src/cli.ts b/polaris-migrator/src/cli.ts index fb113eb1627..e6554478807 100644 --- a/polaris-migrator/src/cli.ts +++ b/polaris-migrator/src/cli.ts @@ -57,6 +57,11 @@ export const cliConfig = createCLIConfig({ description: 'Bypass Git safety checks and forcibly run migrations', type: 'boolean', }, + stdin: { + alias: 's', + type: 'boolean', + description: 'If true, each line of the standard input is used as a path', + }, }, }); @@ -89,5 +94,23 @@ const {input, flags} = meow({ }); export async function run() { - await migrate(input[0], input[1], flags); + let files: string | string[]; + + if (flags.stdin) { + let buffer = ''; + + for await (const chunk of process.stdin) { + buffer += chunk.toString(); + } + + files = buffer.split('\n').filter(Boolean); + + if (files.length === 0) { + throw new Error('No files provided via stdin'); + } + } else { + files = input[1]; + } + + await migrate(input[0], files, flags); } diff --git a/polaris-migrator/src/migrate.ts b/polaris-migrator/src/migrate.ts index b52629311de..1970433bfd1 100644 --- a/polaris-migrator/src/migrate.ts +++ b/polaris-migrator/src/migrate.ts @@ -11,11 +11,12 @@ export interface MigrateOptions { dry?: boolean; print?: boolean; force?: boolean; + stdin?: boolean; } export async function migrate( migration: string, - files: string, + files: string | string[], options: MigrateOptions = {}, ) { const migrationFile = path.join( @@ -28,7 +29,9 @@ export async function migrate( throw new Error(`No migration found for ${migration}`); } - if (!files) throw new Error(`No path provided for migration`); + if (!options.stdin && !files) { + throw new Error(`No path provided for migration`); + } if (!options.dry) { checkGitStatus(options.force);