Skip to content

Commit 7088701

Browse files
authored
feat: 赋能自动化 npm 配套设施 (#121)
1 parent 5492384 commit 7088701

File tree

14 files changed

+155
-50
lines changed

14 files changed

+155
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
/components
33
.idea
44
.DS_Store
5+
v-test

README-zh.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,22 +85,24 @@ yarn publish
8585

8686
`-u`, `--upgrade`
8787

88-
根据 template目录下模板,生成新的文件,更新到当前组件中。使用的是覆盖策略,默认覆盖的文件定义在 update-files.js。常用于使用最新版本vue-sfc-cli对旧组件的配置进行升级
88+
根据 template 目录下模板,生成新的文件,更新到当前组件中。使用的是覆盖策略,默认覆盖的文件定义在 update-files.js。常用于使用最新版本 vue-sfc-cli 对旧组件的配置进行升级。
89+
90+
**此参数还可以让任意 node.js 项目通过 travis ci 自动发布到 NPM**
8991

9092
```
9193
# cd my-component
9294
npx vue-sfc-cli -u
9395
```
9496

95-
`-files`
97+
`--files`
9698

9799
如果想更新额外的文件,可以传此选项,后接文件名,多个文件使用 `,` 分隔
98100

99101
```
100-
npx vue-sfc-cli -u --files package.json,.babelrc.js
102+
npx vue-sfc-cli -u --files .babelrc.js,.eslintrc.js
101103
```
102104

103-
`-test`
105+
`--test`
104106

105107
生成一个测试的组件模板,常用于ci环境测试。
106108

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,22 @@ yarn publish
102102

103103
According to the template files in the templates directory, new files will be generated and override the files with same name in current component directory. The default override files is defined in update-files.js. This option often used to upgrade the configuration of old components using the latest version of vue-sfc-cli:
104104

105+
**This option can also help any node.js project to set up configuration of AUTO npm publishment via travis ci**
106+
105107
```
106108
# cd my-component
107109
npx vue-sfc-cli -u
108110
```
109111

110-
`-files`
112+
`--files`
111113

112114
If you want to update additional files, you can pass this option, multiple files use `,` to separate
113115

114116
```
115-
npx vue-sfc-cli -u --files package.json,.babelrc.js
117+
npx vue-sfc-cli -u --files .babelrc.js,.eslintrc.js
116118
```
117119

118-
`-test`
120+
`--test`
119121

120122
Generate a component template for testing, commonly used in CI .
121123

config/update-files.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

init.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const parseArgs = require('./lib/parseArgs')
66
const kleur = require('kleur')
77
const path = require('path')
88
const readline = require('readline-sync')
9-
const fs = require('fs-extra')
9+
const { setShellFilePermission } = require('./utils/update-files')
1010

1111
const argv = parseArgs(process.argv.slice(2))
1212

@@ -80,8 +80,7 @@ if (!isUpgrade()) {
8080
}
8181
})
8282

83-
fs.chmodSync(path.join(outDir, 'build.sh'), '755')
84-
fs.chmodSync(path.join(outDir, 'notify.sh'), '755')
83+
setShellFilePermission(outDir)
8584

8685
logger.success(`Generated into ${kleur.underline(outDir)}`)
8786
}

lib/fileActions.js

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { logger, parseContent } = require('../utils')
22
const glob = require('glob')
33
const path = require('path')
44
const fs = require('fs-extra')
5+
const _set = require('lodash.set')
56

67
module.exports = class FileActions {
78
constructor(opts = {}) {
@@ -46,7 +47,7 @@ module.exports = class FileActions {
4647

4748
upgrade(extraFiles = []) {
4849
const filesFromCli = this.opts.argv.get('files') || ''
49-
const shouldUpdateFiles = require('../config/update-files')
50+
const { shouldUpdateFiles, setShellFilePermission, todoFiles } = require('../utils/update-files')
5051

5152
const files = shouldUpdateFiles.concat(extraFiles, filesFromCli.split(','))
5253

@@ -70,37 +71,67 @@ module.exports = class FileActions {
7071
logger.fileAction('yellow', 'Upgraded', path.relative(process.cwd(), target))
7172
})
7273

73-
fs.chmodSync(path.join(process.cwd(), 'build.sh'), '755')
74-
fs.chmodSync(path.join(process.cwd(), 'notify.sh'), '755')
74+
setShellFilePermission(process.cwd())
7575

7676
upgradePackageJson(
77+
// @ts-ignore
7778
Object.assign(
7879
this.opts,
7980
{
80-
source: fs.readFileSync(path.join(this.opts.templatesDir, '_package.json'), 'utf8'),
81-
includePkg: files.includes('package.json')
81+
source: fs.readFileSync(path.join(this.opts.templatesDir, '_package.json'), 'utf8')
8282
}
8383
)
8484
)
85+
86+
console.log()
87+
todoFiles.forEach(todoFile => logger.todo(todoFile.msg))
88+
logger.info('After double-check, you should run `yarn` or `npm i` to install the injected devDependencies.')
8589
}
8690
}
8791

88-
function upgradePackageJson({ pkg, source, componentName, ownerName, includePkg }) {
89-
const properties = ['scripts', 'devDependencies', 'husky', 'lint-staged']
90-
const cliVersion = require('../package.json').version
91-
92+
function upgradePackageJson({ pkg, source, componentName, ownerName }) {
9293
const templatePkg = JSON.parse(parseContent(source, { componentName, ownerName }))
94+
const cliVersion = require('../package.json').version
9395
const currentPkg = pkg
9496

95-
if (currentPkg['vue-sfc-cli']) {
96-
currentPkg['vue-sfc-cli'] = cliVersion
97-
}
98-
99-
if (includePkg) {
100-
properties.forEach(key => {
101-
currentPkg[key] = Object.assign(pkg[key] || {}, templatePkg[key])
97+
const properties = [
98+
// 保证 scripts[stdver,release] 都是来自模板
99+
{
100+
key: 'scripts',
101+
overrideValue: {
102+
stdver: templatePkg.scripts.stdver,
103+
release: templatePkg.scripts.release
104+
},
105+
fallbackValue: {
106+
test: 'echo "Info: no test specified"'
107+
}
108+
},
109+
// 保证 devDependencies[@femessage/github-release-notes,standard-version] 都是来自模板
110+
{
111+
key: 'devDependencies',
112+
overrideValue: {
113+
'@femessage/github-release-notes': templatePkg.devDependencies['@femessage/github-release-notes'],
114+
'standard-version': templatePkg.devDependencies['standard-version']
115+
}
116+
}
117+
]
118+
119+
_set(currentPkg, 'vue-sfc-cli', cliVersion)
120+
// gren 以用户的 gren 优先
121+
_set(currentPkg, 'gren', currentPkg.gren || templatePkg.gren)
122+
// publishConfig.asscess = 'public'
123+
_set(currentPkg, ['publishConfig', 'access'], templatePkg.publishConfig.access)
124+
125+
properties.forEach(prop => {
126+
// {}, 预防的字段,用户的字段,最终保证的字段
127+
_set(currentPkg, prop.key, Object.assign({}, prop.fallbackValue, currentPkg[prop.key], prop.overrideValue))
128+
129+
// 以用户的 package.json 文件为基础,避免因合并后造成排序混乱导致 review 增加负担。
130+
Object.keys(pkg[prop.key]).forEach(k => {
131+
// 以顺序赋值
132+
_set(currentPkg, [prop.key, k], Object.assign({}, templatePkg[prop.key], pkg[prop.key])[k])
102133
})
103-
}
134+
})
104135

105136
fs.outputJSONSync(path.join(process.cwd(), 'package.json'), currentPkg, {
106137
spaces: 2

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"fs-extra": "^7.0.1",
3131
"glob": "^7.1.3",
3232
"kleur": "^3.0.3",
33+
"lodash.set": "^4.3.2",
3334
"mri": "^1.1.4",
3435
"readline-sync": "^1.4.9"
3536
},

templates/.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ after_script:
1515
- ./notify.sh
1616
cache: yarn
1717
deploy:
18-
- provider: pages
19-
local-dir: docs
18+
- provider: pages # you may delete this provider if you don't need deployment of github pages
19+
local-dir: docs # https://docs.travis-ci.com/user/deployment/packagecloud/#specify-package-folder
2020
github-token: $GITHUB_TOKEN
2121
skip-cleanup: true
2222
keep-history: true
2323
- provider: npm
24-
24+
email: [email protected] # use your own email
2525
api_key: $NPM_TOKEN
2626
skip-cleanup: true

templates/_package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"@babel/core": "^7.4.3",
4040
"@babel/plugin-transform-runtime": "^7.4.3",
4141
"@babel/preset-env": "^7.4.3",
42-
"@femessage/github-release-notes": "^0.19.0",
42+
"@femessage/github-release-notes": "latest",
4343
"babel-eslint": "^10.0.3",
4444
"babel-loader": "^8.0.5",
4545
"eslint": "^6.6.0",

utils/index.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const logger = require('./logger')
2+
const rs = require('./replace-string')
23

34
exports.logger = logger
45

@@ -7,13 +8,14 @@ exports.pascalify = pascalify
78
exports.kebabcasify = kebabcasify
89

910
exports.parseContent = (content, { componentName, ownerName }) => {
10-
return content
11-
.replace(createRegExp('componentNamePascal'), pascalify(componentName))
12-
.replace(createRegExp('componentName'), kebabcasify(componentName))
13-
.replace(createRegExp('ownerName'), ownerName)
14-
.replace(createRegExp('ownerNameLowerCase'), ownerName.toLowerCase())
15-
.replace(createRegExp('cliVersion'), require('../package.json').version)
16-
.replace(createRegExp('licenseYear'), new Date().getFullYear())
11+
return rs(content, {
12+
componentNamePascal: pascalify(componentName),
13+
componentName: kebabcasify(componentName),
14+
ownerName,
15+
ownerNameLowerCase: ownerName.toLowerCase(),
16+
cliVersion: require('../package.json').version,
17+
licenseYear: new Date().getFullYear()
18+
})
1719
}
1820

1921
function kebabcasify(content) {
@@ -27,7 +29,3 @@ function pascalify(content) {
2729
const camelized = content.replace(/-([a-z])/g, c => c[1].toUpperCase())
2830
return camelized.charAt(0).toUpperCase() + camelized.slice(1)
2931
}
30-
31-
function createRegExp(str) {
32-
return new RegExp(`{{\\s?${str}\\s?}}`, 'g')
33-
}

0 commit comments

Comments
 (0)