Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
feat: 修复多个项目同时运行时循环询问, 并重新优化scripts模块
Browse files Browse the repository at this point in the history
  • Loading branch information
hormers committed Jan 31, 2023
1 parent 41a8ef5 commit f44b76c
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 68 deletions.
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@
"lint:stylelint": "stylelint --fix ",
"reinstall": "pnpm turbo run clean && rimraf pnpm-lock.yaml && rimraf node_modules && npm run bootstrap",
"stub": "pnpm --filter @config/** prepack",
"turbo:build": "turbo run build",
"test": "vitest",
"turbo:build": "turbo run build --parallel",
"turbo:dev": "turbo run dev --parallel",
"turbo:preview": "turbo run preview --parallel",
"version": "pnpm run changeset version"
},
"resolutions": {
Expand Down
1 change: 1 addition & 0 deletions packages/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export {
isUndefined,
clone,
isArray,
isString,
} from 'lodash-es'
// @ts-ignore
import Sortable from 'sortablejs'
Expand Down
14 changes: 13 additions & 1 deletion scripts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,24 @@
"bin": {},
"scripts": {
"clean": "pnpm rimraf node_modules && pnpm rimraf dist && pnpm rimraf .turbo",
"build": "pnpm esno ./src/build.ts",
"dev": "pnpm esno ./src/dev.ts",
"build": "pnpm esno ./src/build.ts"
"preview": "esno src/preview.ts"
},
"devDependencies": {
"@types/inquirer": "^9.0.3",
"@types/fs-extra": "^9.0.13",
"@types/js-yaml": "^4.0.5",
"@types/minimist": "^1.2.2",
"@types/prompts": "^2.4.1",
"@vben/utils": "workspace:*",
"execa": "^6.1.0",
"fs-extra": "^10.1.0",
"inquirer": "^9.1.4",
"js-yaml": "^4.1.0",
"minimist": "^1.2.7",
"ora": "^6.1.2",
"picocolors": "^1.0.0",
"prompts": "^2.4.2"
}
}
80 changes: 80 additions & 0 deletions scripts/src/base.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { execa } from 'execa'
import {
commandArgv,
error,
filterWorkspace,
getWorkspacePackages,
} from './helper'
import { isArray, isString } from '@vben/utils'
import { DEFAULT_SELECT_TYPE } from './constant'
import ora from 'ora'
const spinner = ora({
text: 'Loading...',
color: 'yellow',
})
const prompts = require('prompts')

async function runScript(argv: string[], script: string) {
spinner.stop()
execa('pnpm', ['-w', 'run', `turbo:${script}`].concat(argv), {
stdio: 'inherit',
preferLocal: true,
})
}

async function baseScript(command: string, isFilterWorkspace: boolean) {
const argv = commandArgv('filter')
let filterArgv: string[] = []
try {
if (isArray(argv)) {
filterArgv = argv
.map((argvItem) => ['--filter', `../${argvItem}`])
.flatMap((argvItem) => argvItem)
} else if (isString(argv)) {
filterArgv = ['--filter', argv]
} else {
filterArgv = isFilterWorkspace ? await filterWorkspace() : []
}
const workspacePackages = await getWorkspacePackages(filterArgv)
if (!workspacePackages.length) {
throw new Error('No items meet the requirements!')
}
if (workspacePackages.length === 1) {
await runScript(['--filter', workspacePackages[0].name], command)
return
}
const choices = workspacePackages.map((item) => ({
title: item.name,
value: item.name,
}))
const answer = await prompts([
{
type: DEFAULT_SELECT_TYPE,
message: `Choose the package to run ${command} script: `,
name: 'packages',
choices,
validate: function (val) {
if (val && val.length) return true
return 'Please choose at least one: '
},
},
])

const scriptArgv = isArray(answer.packages)
? answer.packages
.map((argvItem) => ['--filter', argvItem])
.flatMap((argvItem) => argvItem)
: ['--filter', answer.packages || '']
await runScript(scriptArgv, command)
} catch (e) {
throw e
}
}

export function run(command: string, isFilterWorkspace = false) {
spinner.start()
baseScript(command, isFilterWorkspace).catch((err) => {
error(err)
process.exit(1)
})
}
4 changes: 2 additions & 2 deletions scripts/src/build.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { run } from './helper'
import { run } from './base';

run('build')
run('build', true);
8 changes: 8 additions & 0 deletions scripts/src/constant.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export const IGNORE_WORKSPACE = ['packages/*', 'configs/*', 'scripts']

export enum SelectTypeEnum {
SINGLE = 'select',
MULTI = 'multiselect',
}

export const DEFAULT_SELECT_TYPE = SelectTypeEnum.MULTI
4 changes: 2 additions & 2 deletions scripts/src/dev.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { run } from './helper'
import { run } from './base';

run('dev')
run('dev', true);
110 changes: 48 additions & 62 deletions scripts/src/helper.ts
Original file line number Diff line number Diff line change
@@ -1,76 +1,62 @@
import { green, red } from 'picocolors'
import { load as yamlLoad } from 'js-yaml'
import { readFile } from 'fs-extra'
import { IGNORE_WORKSPACE } from './constant'
import minimist = require('minimist')
import { execa } from 'execa'
import prompts from 'prompts'
import scriptPkg from '../package.json'
import rootPkg from '../../package.json'

type WorkspacePackage = { name: string; version?: string; path: string }
export type WorkspacePackage = { name: string; version?: string; path: string }

async function getPackages() {
const { stdout } = await execa('pnpm', [
'ls',
'-r',
'--depth',
'-1',
'--json',
])

return (JSON.parse(stdout) as WorkspacePackage[]).filter(
(p) =>
p.name !== scriptPkg.name &&
p.name !== rootPkg.name &&
p.name.startsWith('@apps') &&
p.name !== '@apps/api-server',
)
export function error(err: any) {
console.log(red(err))
}

async function runScript(pkg: WorkspacePackage, script: string) {
execa('pnpm', ['run', script, '--filter', `${pkg.name}...`, '--parallel'], {
stdio: 'inherit',
preferLocal: true,
})
export function succeed(msg: any) {
console.log(green(msg))
}

async function runSingleScript(pkg: WorkspacePackage, script: string) {
execa('pnpm', ['--filter', `${pkg.name}`, script], {
stdio: 'inherit',
preferLocal: true,
})
/**
* Get command line parameters
* @param argvName
*/
export function commandArgv(argvName: string | undefined = undefined) {
const argv = minimist(process.argv.slice(2))
return argvName ? argv[argvName] || undefined : argv
}

export async function run(command: string) {
const main = async () => {
const packages = await getPackages()
if (!packages.length) {
return
}

if (packages.length === 1) {
runSingleScript(packages[0], command)
return
}

const { name } = await prompts([
{
name: 'name',
message: `Choose the package to run ${command} script`,
type: 'select',
choices: packages.map((p) => {
return {
title: p.name,
value: p.name,
}
}),
},
])
/**
* Read Workspace
*/
export async function readWorkspace() {
const path = '../pnpm-workspace.yaml'
try {
const workspace = yamlLoad(await readFile(path, { encoding: 'utf8' }), {
json: true,
}) as any
return workspace.packages as string[]
} catch (e) {
throw e
}
}

runScript(
packages.find((p) => p.name === name),
command,
export async function filterWorkspace() {
try {
const filterArgv = (await readWorkspace()).filter(
(wr) => !IGNORE_WORKSPACE.includes(wr),
)
return filterArgv
.map((argv) => ['--filter', '../' + argv])
.flatMap((argv) => argv)
} catch (e) {
throw e
}
}

main().catch((error) => {
console.error(error)
process.exit(1)
})
export async function getWorkspacePackages(filterArgv = []) {
const { stdout } = await execa(
'pnpm',
['ls', '-r', '--depth', '-1', '--json'].concat(filterArgv),
)
if (!stdout) return []
return JSON.parse(stdout) as WorkspacePackage[]
}
3 changes: 3 additions & 0 deletions scripts/src/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { run } from './base';

run('preview', true);
3 changes: 3 additions & 0 deletions turbo.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
},
"dev": {
"cache": false
},
"preview": {
"cache": false
}
}
}

0 comments on commit f44b76c

Please sign in to comment.