napi-rs/cli/src/rename.ts
2023-01-19 00:32:52 +08:00

121 lines
3 KiB
TypeScript

import { join } from 'path'
import { Command, Option } from 'clipanion'
import * as chalk from 'colorette'
import inquirer from 'inquirer'
import { load, dump } from 'js-yaml'
import { debugFactory } from './debug'
import { spawn } from './spawn'
import { readFileAsync, writeFileAsync } from './utils'
const debug = debugFactory('rename')
export class RenameCommand extends Command {
static paths = [['rename']]
name = Option.String('-n', {
required: false,
description: 'The new name of the project',
})
napiName = Option.String('--napi-name', {
required: false,
description: 'The new napi addon name',
})
repository = Option.String('--repository', {
required: false,
description: 'The repository of the package',
})
description = Option.String('-d,--description', {
required: false,
description: 'The description of the package',
})
cwd = Option.String({
required: false,
description: 'The working directory, default is [process.cwd()]',
})
async execute() {
const cwd = this.cwd ?? process.cwd()
const packageJson = await readFileAsync(join(cwd, 'package.json'), 'utf8')
const packageJsonData = JSON.parse(packageJson)
const name =
this.name ??
(
await inquirer.prompt({
name: 'name',
type: 'input',
suffix: chalk.dim(' name field in package.json'),
})
).name
const napiName =
this.napiName ??
(
await inquirer.prompt({
name: 'napi name',
type: 'input',
default: name.split('/')[1],
})
)['napi name']
debug('name: %s, napi name: %s', name, napiName)
packageJsonData.name = name
packageJsonData.napi.name = napiName
const repository =
this.repository ??
(
await inquirer.prompt({
name: 'repository',
type: 'input',
suffix: chalk.dim(' Leave empty to skip'),
})
).repository
if (repository) {
packageJsonData.repository = repository
}
const description =
this.description ??
(
await inquirer.prompt({
name: 'description',
type: 'input',
suffix: chalk.dim(' Leave empty to skip'),
})
).description
if (description) {
packageJsonData.description = description
}
await writeFileAsync(
join(cwd, 'package.json'),
JSON.stringify(packageJsonData, null, 2),
)
const CI = await readFileAsync(
join(cwd, '.github', 'workflows', 'CI.yml'),
'utf8',
)
const CIObject = load(CI) as any
CIObject.env.APP_NAME = napiName
await writeFileAsync(
join(cwd, '.github', 'workflows', 'CI.yml'),
dump(CIObject, {
lineWidth: 1000,
}),
)
let tomlContent = await readFileAsync(join(cwd, 'Cargo.toml'), 'utf8')
tomlContent = tomlContent.replace(
'name = "napi-package-template"',
`name = "${napiName}"`,
)
await writeFileAsync(join(cwd, 'Cargo.toml'), tomlContent)
await spawn('napi create-npm-dir -t .')
}
}