UNPKG

3.9 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3/**
4 * @since 20180510 14:02
5 * @author vivaxy
6 */
7const path = require('path');
8const execa = require('execa');
9const fse = require('fs-extra');
10const prompts = require('prompts');
11const logSymbols = require('log-symbols');
12const gitUrlParse = require('git-url-parse');
13const {
14 getCurrentRemoteUrl,
15 getUserName,
16 getUserEmail,
17} = require('@vivaxy/git');
18const copyFiles = require('./lib/template/copy-files.js');
19const createFiles = require('./lib/template/create-files.js');
20
21function padLeft(value, length = 2, padding = '0') {
22 if (typeof value !== 'string') {
23 value = String(value);
24 }
25 while (value.length < length) {
26 value = `${padding}${value}`;
27 }
28 return value;
29}
30(async () => {
31 const cwd = process.cwd();
32 logInfo();
33 await checkDir({ cwd });
34 const params = await getParams({ cwd });
35 await generateFiles(params);
36 const dependencies = [];
37 const devDependencies = [
38 // commit hook
39 'husky',
40 'lint-staged',
41 // commit lint
42 '@commitlint/cli',
43 '@commitlint/config-conventional',
44 // code style
45 'prettier',
46 // build
47 'typescript',
48 // test
49 'jest',
50 '@types/jest',
51 'ts-jest',
52 // changelog
53 'standard-version',
54 ];
55 await installDependencies(dependencies, devDependencies);
56 console.log('Create N success!');
57 process.exit(0);
58})().catch((ex) => {
59 console.log(ex);
60 process.exit(1);
61});
62
63function logInfo() {
64 console.log('Create-n version: ' + require('./package.json').version);
65}
66
67async function checkDir({ cwd }) {
68 const files = await fse.readdir(cwd);
69 if (files.length !== 0) {
70 const { override } = await prompts(
71 [
72 {
73 type: 'confirm',
74 name: 'override',
75 message: 'Directory not empty, override?',
76 initial: true,
77 },
78 ],
79 {
80 onCancel: () => {
81 console.log('Create cancelled.');
82 process.exit(1);
83 },
84 },
85 );
86 if (!override) {
87 console.log('Create cancelled.');
88 process.exit(0);
89 }
90 }
91}
92
93async function getParams({ cwd }) {
94 const { name } = await prompts(
95 [
96 {
97 type: 'text',
98 name: 'name',
99 message: 'package name',
100 initial: path.basename(process.cwd()),
101 },
102 ],
103 {
104 onCancel: () => {
105 console.log('Create cancelled.');
106 process.exit(1);
107 },
108 },
109 );
110
111 const [username, gitRemoteURL, userEmail] = await Promise.all([
112 getUserName({ cwd }),
113 getCurrentRemoteUrl({ cwd }), // => git@github.com:vivaxy/create-n.git
114 getUserEmail({ cwd }),
115 ]);
116 if (!gitRemoteURL) {
117 console.log('Create failed with error git remote URL: ' + gitRemoteURL);
118 process.exit(1);
119 }
120
121 const { name: repoName, owner: repoOwner, source } = gitUrlParse(
122 gitRemoteURL,
123 );
124 const nowDate = new Date();
125 const year = nowDate.getFullYear();
126 return {
127 name,
128 username,
129 userEmail,
130 repoOwner,
131 repoName,
132 gitRemoteURL,
133 hostname: source,
134 year,
135 fileHeadersTime: `${year}-${padLeft(nowDate.getMonth() + 1)}-${padLeft(
136 nowDate.getDate(),
137 )} ${padLeft(nowDate.getHours())}:${padLeft(
138 nowDate.getMinutes(),
139 )}:${padLeft(nowDate.getSeconds())}`,
140 };
141}
142
143async function generateFiles(params) {
144 console.log(logSymbols.info, 'create files ...');
145 const srcDir = path.join(__dirname, 'template');
146 await Promise.all([
147 copyFiles({ srcDir, distDir: process.cwd() }),
148 createFiles({
149 srcDir,
150 distDir: process.cwd(),
151 params,
152 }),
153 ]);
154}
155
156async function installDependencies(dependencies, devDependencies) {
157 console.log(logSymbols.info, 'yarn install ...');
158 if (dependencies.length) {
159 await execa('yarn', ['add', ...dependencies], { stdio: 'inherit' });
160 }
161 if (devDependencies.length) {
162 await execa('yarn', ['add', ...devDependencies, '--dev'], {
163 stdio: 'inherit',
164 });
165 }
166}