Skip to content

Commit 4ef69fb

Browse files
author
levy
committed
Merge branch 'dev' of https://github.com/FEMessage/create-nuxt-app into dev
2 parents 6ebd0fd + 3757e6f commit 4ef69fb

Some content is hidden

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

41 files changed

+1130
-357
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ Create an enterprise nuxt app in seconds.
2727

2828
## Features
2929

30+
- [x] [typescript](https://www.typescriptlang.org/) TypeScript extends JavaScript by adding types.
31+
- [x] [composition-api](https://composition-api.vuejs.org/) a set of additive, function-based APIs that allow flexible composition of component logic.
3032
- [x] [prettier](https://prettier.io/) Prettier is an opinionated code formatter
3133
- [x] [eslint](https://eslint.org/) A fully pluggable tool for identifying and reporting on patterns in JavaScript
3234
- [x] [stylelint](https://stylelint.io/) A mighty, modern style linter
@@ -64,6 +66,10 @@ API_SERVER=https://mockapi.eolinker.com/IeZWjzy87c204a1f7030b2a17b00f3776ce0a07a
6466
APP_ID=1204701543597604893
6567
```
6668

69+
## Links
70+
- [TypeScript FAQ](https://deepexi.yuque.com/docs/share/ec81b0e7-b1b4-426c-a66c-8c293e7185c2)
71+
- [Composition API Best Practices](https://deepexi.yuque.com/docs/share/54bd68ca-27bb-4db8-8b26-f2dd1de406ff)
72+
6773
## Usage
6874

6975
Make sure you have [npx](https://www.npmjs.com/package/npx) installed (`npx` is shipped by default since [npm](https://www.npmjs.com/get-npm) `5.2.0`)

bin/cli.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ function run(config, outDir) {
3636
configs.forEach(item => console.log(item.template))
3737
} else if (options.a) {
3838
configs.forEach(c =>
39-
run({...c, docker: 'd' in options, cypress: false}, outDir),
39+
run(
40+
{...c, docker: 'd' in options, cypress: false, language: 'JavaScript'},
41+
outDir,
42+
),
4043
)
4144
} else {
4245
const config = {

generator/modules.js

+208
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
const path = require('path')
2+
const glob = require('glob')
3+
const {mergeJson, sortObj} = require('./utils')
4+
5+
const resolveDir = dir => path.resolve(__dirname, '../template', dir)
6+
7+
const getDockerRunScript = () => {
8+
const scripts = {
9+
postinstall: 'sh ./.postinstall.sh',
10+
}
11+
12+
return {
13+
scripts,
14+
}
15+
}
16+
17+
function getDockerModule(opts) {
18+
if (!opts.config.docker) return []
19+
20+
return [
21+
{
22+
type: 'add',
23+
files: '**',
24+
templateDir: resolveDir('docker-cmd'),
25+
},
26+
]
27+
}
28+
29+
function getE2eModule(opts) {
30+
if (!opts.config.cypress) return []
31+
32+
const cypressModulePath = resolveDir('modules/cypress')
33+
34+
return [
35+
{
36+
type: 'add',
37+
files: '**',
38+
templateDir: resolveDir('modules/cypress'),
39+
},
40+
{
41+
type: 'move',
42+
patterns: {
43+
[path.resolve(
44+
opts.outDir,
45+
'test/e2e/_.eslintrc.js',
46+
)]: 'test/e2e/.eslintrc.js',
47+
},
48+
},
49+
{
50+
type: 'modify',
51+
files: 'package.json',
52+
handler(basePackage) {
53+
const customPackage = require(path.resolve(
54+
cypressModulePath,
55+
'_package.json',
56+
))
57+
58+
let result = mergeJson(basePackage, customPackage)
59+
60+
;['dependencies', 'devDependencies'].forEach(k => sortObj(result[k]))
61+
return result
62+
},
63+
},
64+
{
65+
type: 'remove',
66+
files: '_package.json',
67+
},
68+
]
69+
}
70+
71+
function getTypeScriptModule(opts) {
72+
if (opts.config.language !== 'TypeScript') return []
73+
const typescriptModulePath = resolveDir('modules/typescript')
74+
75+
return [
76+
{
77+
type: 'add',
78+
files: '**',
79+
templateDir: resolveDir('modules/typescript'),
80+
},
81+
{
82+
type: 'modify',
83+
files: 'package.json',
84+
handler(basePackage) {
85+
const customPackage = require(path.resolve(
86+
typescriptModulePath,
87+
'_package.json',
88+
))
89+
90+
let result = mergeJson(basePackage, customPackage)
91+
92+
;['dependencies', 'devDependencies'].forEach(k => sortObj(result[k]))
93+
return result
94+
},
95+
},
96+
{
97+
type: 'remove',
98+
files: ['_package.json', 'jsconfig.json'],
99+
},
100+
]
101+
}
102+
103+
function getModules(opts) {
104+
const addBaseFramework = {
105+
type: 'add',
106+
files: '**',
107+
templateDir: resolveDir('framework-base'),
108+
}
109+
110+
// 这些配置文件在模板中是加了'_'前缀的(防止影响到本项目),移到生成的项目后要去掉前缀
111+
// 同时也防止这些文件无法发布至 npm
112+
const restoreConfigsName = {
113+
type: 'move',
114+
patterns: {
115+
'_.eslintrc.js': '.eslintrc.js',
116+
'_.gitignore': '.gitignore',
117+
'_package.json': 'package.json',
118+
},
119+
}
120+
121+
const addCustomFramework = {
122+
type: 'add',
123+
files: '**',
124+
templateDir: resolveDir(`framework-${opts.config.template}`),
125+
}
126+
127+
// 合并基础模板和特定模板的 package.json
128+
const mergePackageJson = [
129+
{
130+
type: 'modify',
131+
files: 'package.json',
132+
handler(basePackage) {
133+
const customPackage = require(path.resolve(
134+
opts.outDir,
135+
'_package.json',
136+
))
137+
let result = mergeJson(basePackage, {
138+
...customPackage,
139+
name: opts.config.folder,
140+
})
141+
if (opts.config.docker) {
142+
result = mergeJson(result, getDockerRunScript())
143+
}
144+
result['create-nuxt-app'] = require('../package.json').version
145+
;['dependencies', 'devDependencies'].forEach(k => sortObj(result[k]))
146+
return result
147+
},
148+
},
149+
{
150+
type: 'remove',
151+
files: '_package.json',
152+
},
153+
]
154+
155+
const skipModules = ['folder', 'template', 'docker', 'cypress', 'language']
156+
157+
const addModules = Object.keys(opts.config)
158+
.filter(k => !skipModules.includes(k))
159+
.map(k => {
160+
return {
161+
type: 'add',
162+
files: '**',
163+
templateDir: resolveDir(`modules/${opts.config[k]}`),
164+
}
165+
})
166+
167+
// 生成的nuxt项目的srcDir配置=src。这里我们把除test以外的文件夹移动到src目录下
168+
const moveDirsToSrc = {
169+
type: 'move',
170+
patterns: {
171+
...[addBaseFramework, addCustomFramework, ...addModules]
172+
.filter(a => a.templateDir)
173+
.map(a =>
174+
glob.sync('!(test)/', {
175+
cwd: a.templateDir,
176+
}),
177+
)
178+
.reduce((dirs1, dirs2) => [...dirs1, ...dirs2])
179+
.reduce((res, dir) => ({...res, [dir]: `src/${dir}`}), {}),
180+
},
181+
}
182+
183+
const moveJestEslintrc = {
184+
type: 'move',
185+
patterns: {
186+
[path.resolve(
187+
opts.outDir,
188+
'test/unit/_.eslintrc.js',
189+
)]: 'test/unit/.eslintrc.js',
190+
'_.babelrc': '.babelrc',
191+
},
192+
}
193+
194+
return [
195+
addBaseFramework,
196+
restoreConfigsName,
197+
addCustomFramework,
198+
mergePackageJson,
199+
addModules,
200+
moveDirsToSrc,
201+
moveJestEslintrc,
202+
...getDockerModule(opts),
203+
...getE2eModule(opts),
204+
...getTypeScriptModule(opts),
205+
].reduce((r, a) => r.concat(a), []) // 和 flat(node >= 11.15.0) 效果一样,性能差点
206+
}
207+
208+
module.exports = {getModules}

0 commit comments

Comments
 (0)