/** * Copy a project template and log created files if successful. */ function copyTemplate(templateDir, targetDir, templateVars, cb) { copyTemplateDir(templateDir, targetDir, templateVars, (err, createdFiles) => { if (err) return cb(err) createdFiles.sort().forEach(createdFile => { let relativePath = path.relative(targetDir, createdFile) console.log(` ${chalk.green('create')} ${relativePath}`) }) cb() }) }
module.exports = function(template, target, vars) { var inDir = path.join(process.cwd(), 'templates', template); copy(inDir, target, vars, (err, createdFiles) => { console.log('in:' + inDir); if (err) throw err createdFiles.forEach(filePath => console.log(`Created ${filePath}`)) console.log('done!') }); };
getWebModulePrefs(args, ({umd, globalVariable, jsNext}) => { let templateDir = path.join(__dirname, `../templates/${WEB_MODULE}`) let templateVars = npmModuleVars( {umd, globalVariable, jsNext, name, nwbVersion} ) copyTemplateDir(templateDir, targetDir, templateVars, (err, createdFiles) => { if (err) return cb(err) logCreatedFiles(targetDir, createdFiles) cb() }) })
before(done => { originalCwd = process.cwd() originalNodeEnv = process.env.NODE_ENV delete process.env.NODE_ENV tmpDir = temp.mkdirSync('async-await') copyTemplateDir(path.join(__dirname, '../fixtures/projects/async-await'), tmpDir, {}, err => { if (err) return done(err) process.chdir(tmpDir) execSync('npm install', {stdio: [0, 1, 2]}) done() }) })
getWebModulePrefs(args, ({umd, globalVariable, jsNext}) => { let templateDir = path.join(__dirname, `../templates/${REACT_COMPONENT}`) let templateVars = npmModuleVars( {umd, globalVariable, jsNext, name, nwbVersion, REACT_VERSION} ) copyTemplateDir(templateDir, targetDir, templateVars, (err, createdFiles) => { if (err) return cb(err) logCreatedFiles(targetDir, createdFiles) console.log('nwb: installing dependencies') installReact(targetDir) cb() }) })
return new Promise(function(resolve, reject) { var inDir = path.join(__dirname, "..", "templates", template); copy(inDir, target, vars, function(err, createdFiles) { if (err) { throw err; } else { console.log("\n"); createdFiles.forEach(filePath => { let fileName = path.basename(filePath); let dirName = path.dirname(filePath); if (/react-component/g.test(fileName)) { const newFilePath = path.resolve( dirName, fileName.replace(/react-component/g, vars.componentName) ); renameFile(filePath, newFilePath); console.log(chalk.green("\tCreated ") + newFilePath); } else if (/package-name/g.test(fileName)) { const newFilePath = path.resolve( dirName, fileName.replace(/package-name/g, vars.packageName) ); renameFile(filePath, newFilePath); console.log(chalk.green("\tCreated ") + newFilePath); } else { console.log(chalk.green("\tCreated ") + filePath); } }); console.log("\n"); resolve(); } }); });
if (!projectType) { throw new UserError(`nwb: a project type must be provided, one of: ${PROJECT_TYPES.join(', ')}`) } if (PROJECT_TYPES.indexOf(projectType) === -1) { throw new UserError(`nwb: project type must be one of: ${PROJECT_TYPES.join(', ')}`) } } const PROJECT_CREATORS = { [REACT_APP](args, name, targetDir, cb) { let templateDir = path.join(__dirname, `../templates/${REACT_APP}`) let templateVars = {name, nwbVersion, REACT_VERSION} copyTemplateDir(templateDir, targetDir, templateVars, (err, createdFiles) => { if (err) return cb(err) logCreatedFiles(targetDir, createdFiles) console.log('nwb: installing dependencies') installReact(targetDir) cb() }) }, [REACT_COMPONENT](args, name, targetDir, cb) { getWebModulePrefs(args, ({umd, globalVariable, jsNext}) => { let templateDir = path.join(__dirname, `../templates/${REACT_COMPONENT}`) let templateVars = npmModuleVars( {umd, globalVariable, jsNext, name, nwbVersion, REACT_VERSION} ) copyTemplateDir(templateDir, targetDir, templateVars, (err, createdFiles) => { if (err) return cb(err) logCreatedFiles(targetDir, createdFiles) console.log('nwb: installing dependencies')
before(done => { process.env.NWB_EXPRESS_MIDDLEWARE = require.resolve('../../express') tmpDir = temp.mkdirSync('express-middleware') copyTemplateDir(path.join(__dirname, '../fixtures/projects/express-middleware'), tmpDir, {}, err => { if (err) return done(err) execSync('npm install', {cwd: tmpDir, stdio: [0, 1, 2]}) server = spawn('node', ['server.js'], {cwd: tmpDir}) // Start the HMR EventSource client when the initial build completes server.stdout.on('data', data => { console.log(`server stdout: ${data}`) if (state === States.INIT && /webpack built \w+ in \d+ms/.test(data)) { state = States.INIT_OK startHMRClient() } }) // Fail if there's any error logging server.stderr.on('data', data => { console.log(`server stderr: ${data}`) done(new Error(`stderr output received: ${data}`)) }) function startHMRClient() { hmrClient = new EventSource('http://localhost:3001/__webpack_hmr') // Change a file to trigger a reload after the HMR client connects hmrClient.onopen = () => { console.log('HMR open: changing file in 5s') setTimeout(() => { state = States.CHANGED_FILE let content = fs.readFileSync(path.join(tmpDir, 'src/App.js'), 'utf-8') fs.writeFileSync(path.join(tmpDir, 'src/App.js'), content.replace('Welcome to', 'Change')) }, 5000) } // Fail on EventSource errors hmrClient.onerror = err => { done(new Error(`HMR client error: ${err}`)) } hmrClient.onmessage = e => { if (e.data === '\uD83D\uDC93') { return } let data = JSON.parse(e.data) console.log(`HMR message: ${data.action}; state=${state}`) if (data.action === 'building') { if (state === States.CHANGED_FILE) { state = States.REBUILDING } } else if (data.action === 'built') { if (state === States.REBUILDING) { buildResults = data done() } } else { done(new Error(`HMR client received unexpected message: ${e.data}`)) } } } }) })
#!/usr/bin/env node var copy = require('copy-template-dir') var path = require('path') var argv = require('minimist')(process.argv.slice(2)) var cwd = process.cwd() var templateDir = path.resolve(__dirname, 'template') var input = argv._[0] var targetDir = path.resolve(cwd, input) copy(templateDir, targetDir, { name: input }, function (err) { if (err) { console.error(err) process.exit(1) } console.log('Done. Happy hacking!') })