const yargs = require('yargs'); const execa = require('execa'); const fs = require('fs-extra'); const path = require('path'); const rootDir = path.resolve(__dirname, '..'); const defaultExample = 'packages/create-razzle-app/templates/default'; let argv = yargs .usage('$0 [...] [-s|--stage=] [-c|--copy-only] [-a|--all]') .command({ command: '*', builder: yargs => { return yargs .option('c', { alias: 'copy-only', describe: 'only copy', type: 'boolean', default: false, }) .option('a', { alias: 'all', describe: 'bootstrap all', type: 'boolean', default: false, }) .option('s', { alias: 'stage', describe: 'stage directory', default: false, type: 'string' }) .option('d', { alias: 'default', describe: 'bootstrap default example', type: 'boolean', default: false, }); }, handler: async argv => { const packageJsonData = JSON.parse( await fs.readFile(path.join(rootDir, 'package.json')) ); const packageMetaData = JSON.parse( await fs.readFile(path.join(rootDir, 'package.meta.json')) ); const examples = ( await fs.readdir(path.join(rootDir, 'examples'), { withFileTypes: true, }) ) .filter(item => item.isDirectory()) .map(item => item.name); const exampleNamesMap = (argv.all ? [defaultExample].concat(examples) : argv._).map(example => { return [example, example.includes('/') ? example : `examples/${example}`]; }); const exampleDirs = exampleNamesMap.map(example =>example[1]); let extraWorkspaceDirs = []; let extraNoHoist = []; if (exampleDirs) { const missing = exampleDirs .map(example => { const examplePackageJson = path.join(rootDir, example, 'package.json'); if (!fs.existsSync(examplePackageJson)) { return example; } let examplePackageJsonData = {}; try { examplePackageJsonData = JSON.parse(fs.readFileSync(examplePackageJson)); } catch { console.log(`failed to read json ${examplePackageJson}`); process.exit(1); } const razzle_meta = examplePackageJsonData.razzle_meta||{}; extraNoHoist = extraNoHoist.concat((razzle_meta.nohoist||[]).map(nohoist=>`${example}/${nohoist}`)) extraWorkspaceDirs = extraWorkspaceDirs .concat([example]) .concat(razzle_meta.extraWorkspacedirs || []); return false; }) .filter(x => Boolean(x)); if (missing.length) { console.log(`${missing.join(', ')} not found in ${rootDir}`); process.exit(1); } } packageJsonData.workspaces = packageJsonData.workspaces.concat(extraWorkspaceDirs); packageJsonData.workspaces.nohoist = (packageJsonData.workspaces.nohoist||[]).concat(extraNoHoist); const jsonString = JSON.stringify(packageJsonData, null, ' ') + '\n'; if (jsonString) { try { fs.writeFileSync(path.join(rootDir, 'package.json'), jsonString); } catch { console.log(`failed to write json ${item}`); } } else { console.log(`not writing empty json ${item}`); } await execa("yarn install --no-lockfile", { shell: true, stdio: 'inherit' }); exampleDirs .map(example => { fs.ensureDirSync(path.join(rootDir, example, 'node_modules', '.bin')) fs.writeFileSync(path.join(rootDir, example, 'node_modules', '.bin', 'restrap'), `#!/usr/bin/env node 'use strict'; const execa = require('execa'); execa("cd ${rootDir} && yarn bootstrap-examples ${example}", { shell: true, stdio: 'inherit' });`); fs.chmodSync(path.join(rootDir, example, 'node_modules', '.bin', 'restrap'), 0o775) }) packageJsonData.workspaces = packageMetaData.workspaces; const resetJsonString = JSON.stringify(packageJsonData, null, ' ') + '\n'; if (resetJsonString) { try { fs.writeFileSync(path.join(rootDir, 'package.json'), resetJsonString); } catch { console.log(`failed to write json ${item}`); } } else { console.log(`not writing empty json ${item}`); } }, }) .help().argv;