From 10ca503e5927d94879feedd54331fa6e3f5bce46 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Tue, 6 Aug 2019 15:40:16 +0700 Subject: [PATCH] Add script to create new package from template --- packages/argparse/src/argparse.ts | 4 ++ packages/scripts/src/commands/index.ts | 1 + packages/scripts/src/commands/newlib.ts | 64 +++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 packages/scripts/src/commands/newlib.ts diff --git a/packages/argparse/src/argparse.ts b/packages/argparse/src/argparse.ts index 1682c8c..0fcfc77 100644 --- a/packages/argparse/src/argparse.ts +++ b/packages/argparse/src/argparse.ts @@ -106,6 +106,10 @@ function getValue( return isPositional ? argument : it.next() } +export function isHelp(argv: string[]) { + return argv.some(a => /^(-h|--help)$/.test(a)) +} + function checkChoice(argument: string, choice: T, choices?: T[]) { if (choices) { assert( diff --git a/packages/scripts/src/commands/index.ts b/packages/scripts/src/commands/index.ts index 6501a0c..ead3824 100644 --- a/packages/scripts/src/commands/index.ts +++ b/packages/scripts/src/commands/index.ts @@ -1,2 +1,3 @@ export * from './help' export * from './build' +export * from './newlib' diff --git a/packages/scripts/src/commands/newlib.ts b/packages/scripts/src/commands/newlib.ts new file mode 100644 index 0000000..e8fa132 --- /dev/null +++ b/packages/scripts/src/commands/newlib.ts @@ -0,0 +1,64 @@ +import {argparse, arg, isHelp} from '@rondo/argparse' +import {run} from '../run' +import * as fs from 'fs' +import * as path from 'path' + +export async function newlib(...argv: string[]) { + const {parse, help} = argparse({ + name: arg('string', {positional: true, required: true}), + namespace: arg('string', {default: '@rondo'}), + help: arg('boolean', { + alias: 'h', + description: 'Print help message', + }), + // frontend: arg('boolean', {alias: 'f'}), + }) + if (isHelp(argv)) { + console.log('Usage: rondo newlib ' + help()) + return + } + const args = parse(argv) + + const destDir = path.join('./packages', args.name) + + console.log('mkdir %s', destDir) + fs.mkdirSync(destDir) + + const libraryName = `${args.namespace}/${args.name}` + + const templateDir = path.join('.', 'template') + for (const file of await walk(templateDir)) { + const src = file + const dest = path.join(destDir, path.relative(templateDir, file)) + if (dest === path.join(destDir, 'package.json')) { + console.log('Add %s', dest) + const libPkg = JSON.parse(fs.readFileSync(src, 'utf8')) + libPkg.name = libraryName + fs.writeFileSync(dest, JSON.stringify(libPkg, null, ' ')) + } else { + console.log('Copy %s', src) + fs.copyFileSync(src, dest) + } + } + + console.log('Update main package.json') + const pkgFile = path.join(process.cwd(), 'package.json') + const pkg = require(pkgFile) + pkg.dependencies = pkg.dependencies || {} + pkg.dependencies[libraryName] = `file:packages/${args.name}` + fs.writeFileSync(pkgFile, JSON.stringify(pkg, null, ' ')) +} + +export async function walk( + file: string, + files: string[] = [], +): Promise { + files.push(file) + const stat = fs.statSync(file) + if (stat.isDirectory()) { + for (const f of fs.readdirSync(file)) { + walk(path.join(file, f), files) + } + } + return files +}