From 21afa6e822b8e94bf4a23df54b0c9f53130e932a Mon Sep 17 00:00:00 2001 From: Clark Du Date: Fri, 12 Feb 2021 19:02:14 +0000 Subject: [PATCH] feat(template): update to husky v5 --- .../template/nuxt/.husky/.gitignore | 1 + .../template/nuxt/.husky/commit-msg | 4 ++++ .../template/nuxt/.husky/pre-commit | 4 ++++ .../cna-template/template/nuxt/package.js | 7 +++--- .../cna-template/template/nuxt/package.json | 11 +++------ packages/create-nuxt-app/lib/saofile.js | 22 +++++++++++++++++- .../test/snapshots/index.test.js.snap | Bin 8720 -> 8766 bytes 7 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 packages/cna-template/template/nuxt/.husky/.gitignore create mode 100755 packages/cna-template/template/nuxt/.husky/commit-msg create mode 100755 packages/cna-template/template/nuxt/.husky/pre-commit diff --git a/packages/cna-template/template/nuxt/.husky/.gitignore b/packages/cna-template/template/nuxt/.husky/.gitignore new file mode 100644 index 000000000..c9cdc63b0 --- /dev/null +++ b/packages/cna-template/template/nuxt/.husky/.gitignore @@ -0,0 +1 @@ +_ \ No newline at end of file diff --git a/packages/cna-template/template/nuxt/.husky/commit-msg b/packages/cna-template/template/nuxt/.husky/commit-msg new file mode 100755 index 000000000..3172f280a --- /dev/null +++ b/packages/cna-template/template/nuxt/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +<%= pmRun %> commitlint --edit $1 diff --git a/packages/cna-template/template/nuxt/.husky/pre-commit b/packages/cna-template/template/nuxt/.husky/pre-commit new file mode 100755 index 000000000..90b6b1285 --- /dev/null +++ b/packages/cna-template/template/nuxt/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +<%= pmRun %> lint-staged diff --git a/packages/cna-template/template/nuxt/package.js b/packages/cna-template/template/nuxt/package.js index 084ac6114..a9d324ba2 100644 --- a/packages/cna-template/template/nuxt/package.js +++ b/packages/cna-template/template/nuxt/package.js @@ -33,9 +33,7 @@ module.exports = { delete pkg.devDependencies['eslint-plugin-vue'] } if (!lintStaged) { - delete pkg.husky delete pkg['lint-staged'] - delete pkg.devDependencies.husky delete pkg.devDependencies['lint-staged'] } if (!stylelint) { @@ -54,10 +52,13 @@ module.exports = { delete pkg.devDependencies.prettier } if (!commitlint) { - lintStaged && delete pkg.husky.hooks['commit-msg'] delete pkg.devDependencies['@commitlint/config-conventional'] delete pkg.devDependencies['@commitlint/cli'] } + if (!lintStaged && !commitlint) { + delete pkg.devDependencies.husky + delete pkg.scripts.postinstall + } const lintScript = Object.values(lintScripts).join(' && ') if (lintScript) { diff --git a/packages/cna-template/template/nuxt/package.json b/packages/cna-template/template/nuxt/package.json index 9f81efaa4..1482954d7 100644 --- a/packages/cna-template/template/nuxt/package.json +++ b/packages/cna-template/template/nuxt/package.json @@ -5,18 +5,13 @@ "start": "nuxt start", "generate": "nuxt generate", "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .", - "lint:style": "stylelint \"**/*.{vue,css}\" --ignore-path .gitignore" + "lint:style": "stylelint \"**/*.{vue,css}\" --ignore-path .gitignore", + "postinstall": "husky install" }, "lint-staged": { "*.{js,vue}": "eslint", "*.{css,vue}": "stylelint" }, - "husky": { - "hooks": { - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", - "pre-commit": "lint-staged" - } - }, "dependencies": { "@nuxt/content": "^1.12.0", "@nuxt/typescript-runtime": "^2.0.1", @@ -40,7 +35,7 @@ "eslint-plugin-nuxt": "^2.0.0", "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-vue": "^7.5.0", - "husky": "^4.3.8", + "husky": "^5.0.9", "lint-staged": "^10.5.3", "prettier": "^2.2.1", "stylelint": "^13.9.0", diff --git a/packages/create-nuxt-app/lib/saofile.js b/packages/create-nuxt-app/lib/saofile.js index 1b371f05d..7a5b6efad 100644 --- a/packages/create-nuxt-app/lib/saofile.js +++ b/packages/create-nuxt-app/lib/saofile.js @@ -1,4 +1,5 @@ const { dirname, join, relative } = require('path') +const fs = require('fs') const spawn = require('cross-spawn') const validate = require('validate-npm-package-name') const pkg = require('./package') @@ -6,6 +7,9 @@ const pkg = require('./package') const cnaTemplateDir = join(dirname(require.resolve('cna-template/package.json'))) const templateDir = join(cnaTemplateDir, 'template') const frameworksDir = join(templateDir, 'frameworks') +const addExecutable = filename => new Promise( + resolve => fs.chmod(filename, 0o775, resolve) +) module.exports = { prompts: require('./prompts'), @@ -50,6 +54,11 @@ module.exports = { }) validation.errors && validation.errors.length && process.exit(1) + const { linter } = this.answers + const eslint = linter.includes('eslint') + const lintStaged = eslint && linter.includes('lintStaged') + const commitlint = linter.includes('commitlint') + const actions = [{ type: 'add', files: '**', @@ -57,7 +66,10 @@ module.exports = { filters: { 'static/icon.png': 'features.includes("pwa")', 'content/hello.md': 'features.includes("content")', - 'pages/content.vue': 'features.includes("content")' + 'pages/content.vue': 'features.includes("content")', + '.husky/.gitignore': lintStaged || commitlint, + '.husky/commit-msg': commitlint, + '.husky/pre-commit': lintStaged } }] @@ -144,6 +156,14 @@ module.exports = { this.gitInit() } + const huskyDir = join(this.outDir, '.husky') + if (this.answers.linter.includes('lintStaged')) { + await addExecutable(join(huskyDir, 'pre-commit')) + } + if (this.answers.linter.includes('commitlint')) { + await addExecutable(join(huskyDir, 'commit-msg')) + } + await this.npmInstall({ npmClient: this.answers.pm }) if (this.answers.linter.includes('eslint')) { diff --git a/packages/create-nuxt-app/test/snapshots/index.test.js.snap b/packages/create-nuxt-app/test/snapshots/index.test.js.snap index c956154b3348533c1e433400abad9e07a35338b3..9c43ec712f2c2436680eaa4f353773b1824be0e5 100644 GIT binary patch literal 8766 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