@artegha/create-node-server
Version:
Create Node servers with no build configuration.
127 lines (120 loc) • 3.35 kB
text/typescript
import chalk from 'chalk'
import { execSync } from 'child_process'
import fs from 'fs-extra'
import os from 'os'
import path from 'path'
// import semver from 'semver'
import prompts from 'prompts'
import tools from '../utils/tools'
export default async (server: Server) => {
// if (!semver.satisfies(process.version, '>=10')) {
// console.log(
// chalk.yellow(
// `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\n\n` +
// 'Please update to Node 10 or higher for a better, fully supported experience.\n'
// )
// )
// }
if (!server.name) {
console.error('Please specify the project directory:')
console.log(` ${chalk.cyan(server.programName)} ${chalk.green('<project-directory>')}`)
console.log()
console.log('For example:')
console.log(` ${chalk.cyan(server.programName)} ${chalk.green('my-node-server')}`)
console.log()
console.log(`Run ${chalk.cyan(`${server.programName} --help`)} to see all options.`)
const response = await prompts(
[
{
type: 'text',
name: 'name',
message: 'Specify a name for your project',
},
],
{
onCancel: () => {
throw new Error('You cancel prompt commands')
},
}
)
server.name = response.name
}
server.root = path.resolve(server.name)
// let appNameIsValid = false
// while (!appNameIsValid) {
// response = await prompts(
// [
// {
// type: 'text',
// name: 'name',
// message: 'Specify a name for your project',
// },
// ],
// {
// onCancel: () => {
// console.log('You cancel prompt commands')
// process.exit(1)
// },
// }
// )
// name = response.name
// appNameIsValid = tools.checkAppName(name)
// }
console.log()
console.log(`Creating a new Node Project in ${chalk.green(server.root)}.`)
console.log()
if (!fs.existsSync(server.name)) {
fs.mkdirSync(server.name)
} else {
console.log(`The directory ${chalk.green(server.name)} already exist :`)
const response = await prompts(
[
{
type: 'toggle',
name: 'remove',
message: 'Do you want to remove it ?',
initial: true,
active: 'no',
inactive: 'yes',
},
],
{
onCancel: () => {
throw new Error('You cancel prompt commands')
},
}
)
console.log()
if (!response.remove) {
fs.removeSync(path.join(server.name))
fs.mkdirSync(server.name)
} else {
console.log('Please moove the directory or choose another name for your project')
process.exit(0)
}
}
const packageJson = {
name: server.name,
version: '0.0.1',
private: true,
}
fs.writeFileSync(path.join(server.root, 'package.json'), JSON.stringify(packageJson, null, 2) + os.EOL)
server.originalRoot = process.cwd() // store the original root
process.chdir(server.root) // change the process root
if (!server.useYarn && !tools.checkThatNpmCanReadCwd()) {
throw new Error('NPM can\'t read cwd')
}
if (server.useYarn) {
let yarnUsesDefaultRegistry = true
try {
yarnUsesDefaultRegistry =
execSync('yarnpkg config get registry').toString().trim() === 'https://registry.yarnpkg.com'
} catch (e) {
throw new Error(e)
}
if (yarnUsesDefaultRegistry) {
fs.copySync(require.resolve('./yarn.lock.cached'), path.join(server.root, 'yarn.lock'))
}
}
return server
}