1
0
Fork 0
freesewing/packages/create-freesewing-pattern/lib/create-library.js

161 lines
3.2 KiB
JavaScript
Raw Normal View History

2018-03-04 15:43:18 -05:00
'use strict'
const handlebars = require('handlebars')
2018-03-04 15:43:18 -05:00
const execa = require('execa')
const fs = require('fs')
const globby = require('globby')
const mkdirp = require('make-dir')
const ora = require('ora')
const path = require('path')
const pEachSeries = require('p-each-series')
const pkg = require('../package')
2019-03-03 10:13:05 -05:00
const templateBlacklist = new Set([
'example/public/favicon.ico'
])
2018-03-04 15:43:18 -05:00
module.exports = async (info) => {
const {
2018-03-09 18:45:50 -05:00
manager,
template,
name,
templatePath,
git
2018-03-04 15:43:18 -05:00
} = info
2018-03-09 18:45:50 -05:00
// handle scoped package names
const parts = name.split('/')
info.shortName = parts[parts.length - 1]
const dest = path.join(process.cwd(), info.shortName)
2018-03-14 10:31:34 -04:00
info.dest = dest
2018-03-04 15:43:18 -05:00
await mkdirp(dest)
const source = template === 'custom'
? path.join(process.cwd(), templatePath)
: path.join(__dirname, '..', 'template', template)
2018-03-04 15:43:18 -05:00
const files = await globby(source, {
dot: true
})
{
const promise = pEachSeries(files, async (file) => {
return module.exports.copyTemplateFile({
file,
source,
dest,
info
})
})
ora.promise(promise, `Copying ${template} template to ${dest}`)
2018-03-04 15:43:18 -05:00
await promise
}
{
const promise = module.exports.initPackageManager({ dest, info })
ora.promise(promise, `Running ${manager} install and ${manager} link`)
await promise
}
if (git) {
2018-03-04 15:43:18 -05:00
const promise = module.exports.initGitRepo({ dest })
ora.promise(promise, 'Initializing git repo')
await promise
}
2018-03-09 18:45:50 -05:00
return dest
2018-03-04 15:43:18 -05:00
}
module.exports.copyTemplateFile = async (opts) => {
const {
file,
source,
dest,
info
} = opts
const fileRelativePath = path.relative(source, file)
const destFilePath = path.join(dest, fileRelativePath)
const destFileDir = path.parse(destFilePath).dir
await mkdirp(destFileDir)
2019-03-03 10:13:05 -05:00
if (templateBlacklist.has(fileRelativePath)) {
const content = fs.readFileSync(file)
fs.writeFileSync(destFilePath, content)
} else {
const template = handlebars.compile(fs.readFileSync(file, 'utf8'))
const content = template({
...info,
yarn: (info.manager === 'yarn')
})
fs.writeFileSync(destFilePath, content, 'utf8')
}
2018-03-04 15:43:18 -05:00
return fileRelativePath
}
module.exports.initPackageManager = async (opts) => {
const {
dest,
info
} = opts
2018-05-11 18:32:26 -04:00
const example = path.join(dest, 'example')
2018-03-04 15:43:18 -05:00
const commands = [
{
2018-03-06 22:42:54 -05:00
cmd: `${info.manager} install`,
2018-03-04 15:43:18 -05:00
cwd: dest
},
{
cmd: `${info.manager} link`,
cwd: dest
},
2018-05-11 18:32:26 -04:00
{
cmd: `${info.manager} install`,
2018-05-11 18:32:26 -04:00
cwd: example
}
]
2018-03-04 15:43:18 -05:00
return pEachSeries(commands, async ({ cmd, cwd }) => {
return execa.shell(cmd, { cwd })
})
}
module.exports.initGitRepo = async (opts) => {
const {
dest
} = opts
2018-03-04 19:44:19 -05:00
const gitIgnorePath = path.join(dest, '.gitignore')
fs.writeFileSync(gitIgnorePath, `
# See https://help.github.com/ignore-files/ for more about ignoring files.
# dependencies
node_modules
# builds
build
dist
2018-10-01 13:39:09 -04:00
.rpt2_cache
2018-03-04 19:44:19 -05:00
# misc
.DS_Store
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
`, 'utf8')
const cmd = `git init && git add . && git commit -m ":tada: Initialized ${pkg.name}@${pkg.version} with create-freesewing-pattern"`
2018-03-04 15:43:18 -05:00
return execa.shell(cmd, { cwd: dest })
}