Skip to content

Commit 6de2212

Browse files
committed
refactor(*): separate the template from the scaffold
BREAKING CHANGE: The option `-t` of `mili init` command is no long supported. And each template will become a independent project. If you want to upgrade the template, you need to manually configure .milirc, then run mili upgrade. resolve #7
1 parent 6acad4a commit 6de2212

File tree

242 files changed

+823
-3991
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

242 files changed

+823
-3991
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ package-lock.json
2222

2323
# test
2424
demo/
25+
/templates

README.md

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,31 @@
55
[![dependencies](https://img.shields.io/david/Val-istar-Guo/mili.svg?style=flat-square)](https://www.npmjs.com/package/mili)
66

77

8-
## Install
8+
**Projects that derived from the same scaffolding, have evolved over time and become different.**
9+
Scaffolding lost control of the subsequent development of the project.
10+
When we need to improve some of the basic functions of scaffolding(e.g. eslint rules), we need to modify each project, and even have to design a customized solution for some unrecognizable projects.
911

10-
```bash
11-
// init an website
12-
npx mili@latest init
12+
Therefore, in order to improve the control ability of scaffolding for the subsequent development of the project,
13+
mili allows scaffolding to cure some files and provide upgrades for this part of the files.
1314

14-
// init an component
15-
npx mili@latest init -t component
16-
```
1715

1816
## Usage
1917

20-
### mili init [option] [app_name]
21-
22-
initial your project.
23-
if you don't set `app_name`, it will use the name of the current folder.
24-
by default, mili will init an website project, unless you set the `-t` or `--type`
18+
```
19+
npx mili init https://github.com/Val-istar-Guo/mili-template.git
2520
21+
mili upgrade
22+
```
2623

27-
| option | enum | default | description |
28-
|:----------:|------------------------------------|---------|-------------|
29-
| -t --type | web, component, pwa, assist-plugin | web | Which app type to build?
24+
## Shell
3025

26+
**mili init [option] [repository]**
3127

32-
### mili upgrade
28+
init project
29+
options:
30+
* `-n` or `--app-name` set application name(defaulted: name in package.json || progress.cwd())
3331

34-
upgrade your project
32+
**mili upgrade**
3533

36-
## Technology Stack
34+
upgrade you project if then template depended outdated.
3735

38-
- vue
39-
- - vuex
40-
- - vue-router
41-
- - vue-server-renderer
42-
- koa
43-
- - koa-router
44-
- - koa-logger
45-
- - koa-proxy
46-
- - koa-static
47-
- - koa-views
48-
- superagent
49-
- chalk
50-
- webpack
51-
- babel
52-
- pm2

bin/init

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,58 @@
11
#!/usr/bin/env node
2+
// const loadMiliConfig = require('../src/loadMiliConfig')
3+
const cloneRepository = require('../src/cloneRepository')
4+
const loadTemplateConfig = require('../src/loadTemplateConfig')
5+
const extractProgectBaseInfo = require('../src/extractProgectBaseInfo')
6+
const recommendFileEncoding = require('../src/recommendFileEncoding')
7+
const genFileList = require('../src/genFileList')
8+
const formatHandlers = require('../src/formatHandlers')
9+
const genTargetPath = require('../src/genTargetPath')
10+
const initialFolder = require('../src/initialFolder')
11+
const checkAndFormatView = require('../src/checkAndFormatView')
12+
const genMilirc = require('../src/genMilirc')
13+
const copy = require('../src/copy')
14+
const log = require('../src/log')
15+
const { join, basename } = require('path')
216

3-
const { join } = require('path')
4-
const { copyDir } = require('./utils')
517

18+
module.exports = async (name, repository) => {
19+
// const miliConfig = await loadMiliConfig()
20+
const templateProjectPath = await cloneRepository(repository)
21+
const templateConfig = await loadTemplateConfig(templateProjectPath)
22+
const templatePath = join(templateProjectPath, templateConfig.path)
23+
const baseInfo = await extractProgectBaseInfo(join(process.cwd()))
624

7-
module.exports = async (type, context) => {
8-
const from = join(__dirname, '../template', type)
9-
await copyDir({ from, to: process.cwd(), context })
25+
// basename(process.cwd())
26+
// OPTIMIZE: Check mili version and remind user
27+
// if (templateConfig.version > mili.version)
28+
29+
let files = await genFileList({ path: templatePath, upgrade: 'cover', handlers: [] }, templateConfig.rules)
30+
31+
const view = checkAndFormatView({
32+
name: name || baseInfo.name || basename(process.cwd()),
33+
repository: baseInfo.repository,
34+
remotes: baseInfo.remotes,
35+
template: { repository, version: templateConfig.version },
36+
})
37+
38+
39+
const targetPath = process.cwd()
40+
files = files
41+
.map(file => ({
42+
...file,
43+
view,
44+
// 初始化仓库需要将所有keep模式更为cover模式
45+
upgrade: file.upgrade === 'keep' ? 'cover' : file.upgrade,
46+
encoding: file.encoding || recommendFileEncoding(file.path),
47+
}))
48+
.map(formatHandlers)
49+
.map(genTargetPath(templatePath, targetPath))
50+
51+
52+
log.info('initial folder')
53+
await initialFolder(files)
54+
55+
log.info('copy files')
56+
await Promise.all(files.map(copy))
57+
await genMilirc(targetPath, view)
1058
}

bin/mili

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,50 @@
33
const { readdirSync } = require('fs')
44
const { join, basename } = require('path')
55
const program = require('commander')
6-
const log = require('./log')
6+
const log = require('../src/log')
77
const init = require('./init')
88
const upgrade = require('./upgrade')
9-
const { version: miliVersion } = require('../package.json')
9+
const { version } = require('../package.json')
1010

1111

12-
const types = readdirSync(join(__dirname, '../template')).reverse()
13-
1412
program
15-
.version('0.1.0')
13+
.version(version)
1614

1715
program
18-
.command('init [app_name]')
16+
.command('init [repository]')
17+
.usage('[options] <repository>')
1918
.description('initialize the project')
20-
.option('-t --type [type]', `Which app type to build.(${types.join(' | ')})`)
21-
.action((appName, option) => {
22-
if (!appName) appName = basename(process.cwd())
23-
24-
const { type = 'web' } = option
25-
if (!types.includes(type)) {
26-
log.error(
27-
'option',
28-
`-t --type [type] should be one of ${types.map(t => `'${t}'`).join(', ')}, but get '${type}'.`
29-
)
30-
return
31-
}
19+
.option('-n --app-name [app_name]', `Set your app name.`)
20+
.action((repository, option) => {
21+
if (!repository) program.help()
22+
23+
const { appName } = option
3224

3325
log.info('initialize project ...')
34-
init(type, { appName, miliVersion, encoding: 'utf8' })
26+
27+
return init(appName, repository)
3528
.then(() => log.info('initialize complete'))
3629
.catch(err => log.error('program', 'initialize break', err))
3730
})
3831

3932
program
4033
.command('upgrade')
41-
.description('upgrade the mili framework')
34+
.description('upgrade the template')
4235
.action(() => {
43-
log.info('upgrade project ...')
44-
upgrade({ miliVersion, encoding: 'utf8' })
36+
log.info('prepare upgrade')
37+
upgrade()
4538
.then(() => log.info('upgrade complete'))
46-
.catch(err => log.error('program', 'initialize break', err))
39+
.catch(err => log.error('program', 'upgrade break', err))
4740
})
4841

42+
43+
// error on unknown commands
44+
program.on('command:*', function () {
45+
log.error('command', 'Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
46+
process.exit(1);
47+
});
48+
49+
4950
program.parse(process.argv)
51+
52+
if (!process.argv.slice(2).length) program.help();

bin/upgrade

Lines changed: 53 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,68 @@
11
#!/usr/bin/env node
2+
const loadMiliConfig = require('../src/loadMiliConfig')
3+
const cloneRepository = require('../src/cloneRepository')
4+
const loadTemplateConfig = require('../src/loadTemplateConfig')
5+
const extractProgectBaseInfo = require('../src/extractProgectBaseInfo')
6+
const recommendFileEncoding = require('../src/recommendFileEncoding')
7+
const genFileList = require('../src/genFileList')
8+
const formatHandlers = require('../src/formatHandlers')
9+
const genTargetPath = require('../src/genTargetPath')
10+
const initialFolder = require('../src/initialFolder')
11+
const checkAndFormatView = require('../src/checkAndFormatView')
12+
const genMilirc = require('../src/genMilirc')
13+
const copy = require('../src/copy')
14+
const log = require('../src/log')
15+
const semver = require('semver')
16+
const { join, basename } = require('path')
217

3-
const { join, dirname } = require('path')
4-
const log = require('./log')
5-
const { copyFile, copyDir, mergePackageJson, readPackageJson } = require('./utils')
618

19+
module.exports = async () => {
20+
const miliConfig = await loadMiliConfig()
21+
const repository = miliConfig.repository
722

8-
const covered = {
9-
web: {
10-
folders: [
11-
'framework',
12-
'build',
13-
'.github',
14-
],
15-
files: [
16-
'.babelrc',
17-
'.editorconfig',
18-
'.gitignore.mustache',
19-
'.npmrc.mustache',
20-
'webpack.config.babel.js',
21-
'package.json.mustache',
22-
'ecosystem.config.js',
23-
'.huskyrc.yml',
24-
'.czrc',
25-
'.commitlintrc.yml',
23+
console.log(miliConfig)
24+
const templateProjectPath = await cloneRepository(repository)
25+
const templateConfig = await loadTemplateConfig(templateProjectPath)
2626

27-
'client/app.vue',
28-
'client/entry-ssr.js',
29-
'client/entry-client.js',
30-
'client/createApp.js',
31-
'client/createStore.js',
32-
'client/createRouter.js',
33-
'client/template.html',
34-
],
35-
},
36-
component: {
37-
folders: [
38-
'.github',
39-
],
40-
files: [
41-
'.babelrc',
42-
'.editorconfig',
43-
'.gitignore.mustache',
44-
'.npmignore.mustache',
45-
'.npmrc.mustache',
46-
'.huskyrc.yml',
47-
'.czrc',
48-
'.commitlintrc.yml',
49-
'package.json.mustache',
50-
'build.config.js',
51-
'.travis.yml',
52-
],
53-
},
54-
pwa: {
55-
folders: [
56-
'framework',
57-
'build',
58-
'.github',
59-
],
60-
files: [
61-
'.babelrc',
62-
'.editorconfig',
63-
'.gitignore.mustache',
64-
'.npmrc.mustache',
65-
'webpack.config.babel.js',
66-
'package.json.mustache',
67-
'ecosystem.config.js',
68-
'.huskyrc.yml',
69-
'.czrc',
70-
'.commitlintrc.yml',
27+
// miliConfig
28+
if (semver.gte(miliConfig.version, templateConfig.version)) {
29+
log.info('The template is already the latest version')
30+
return
31+
}
7132

72-
'client/app.vue',
73-
'client/entry-ssr.js',
74-
'client/entry-client.js',
75-
'client/createApp.js',
76-
'client/createStore.js',
77-
'client/createRouter.js',
78-
'client/template.html',
79-
],
80-
},
81-
}
33+
const templatePath = join(templateProjectPath, templateConfig.path)
34+
const baseInfo = await extractProgectBaseInfo(join(process.cwd()))
8235

83-
const upgrade = async ({ from, to, context, folders, files }) => {
84-
const copyDirPromise = folders.map(folder => (
85-
copyDir({ from: join(from, folder), to: join(to, folder), context })
86-
))
36+
// basename(process.cwd())
37+
// OPTIMIZE: Check mili version and remind user
38+
// if (templateConfig.version > mili.version)
8739

88-
const copyFilePromise = files.map(file => (
89-
copyFile({ from: join(from, file), to: join(to, file), context })
90-
))
40+
let files = await genFileList({ path: templatePath, upgrade: 'cover', handlers: [] }, templateConfig.rules)
9141

92-
return Promise.all([
93-
...copyDirPromise,
94-
...copyFilePromise,
95-
])
96-
}
42+
const view = checkAndFormatView({
43+
name: baseInfo.name || basename(process.cwd()),
44+
repository: baseInfo.repository,
45+
remotes: baseInfo.remotes,
46+
template: { repository, version: templateConfig.version },
47+
})
9748

98-
const uninitError = () => {
99-
throw new Error('please init project use mili init [app_name]')
100-
}
10149

102-
module.exports = async (context) => {
103-
const config = await readPackageJson(process.cwd(), context)
104-
if (!('type' in config.mili)) uninitError()
50+
const targetPath = process.cwd()
51+
files = files
52+
.filter(file => file.upgrade !== 'keep')
53+
.map(file => ({
54+
...file,
55+
view,
56+
encoding: file.encoding || recommendFileEncoding(file.path),
57+
}))
58+
.map(formatHandlers)
59+
.map(genTargetPath(templatePath, targetPath))
10560

106-
const { type } = config.mili
107-
log.info(`${type} project`)
10861

109-
const { folders, files } = covered[type]
110-
const from = join(__dirname, `../template`, type)
62+
log.info('check folder')
63+
await initialFolder(files)
11164

112-
await upgrade({ from, to: process.cwd(), folders, files, context })
65+
log.info('upgrading...')
66+
await Promise.all(files.map(copy))
67+
await genMilirc(targetPath, view)
11368
}

0 commit comments

Comments
 (0)