diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..d90e41551 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx tslint-staged diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg new file mode 100755 index 000000000..652f440e7 --- /dev/null +++ b/.husky/prepare-commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +./scripts/git-commit-msg.sh $1 diff --git a/.prettierrc b/.prettierrc index 20b989e4a..bcd49b318 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,6 +1,6 @@ { - "useTabs": true, "singleQuote": true, + "printWidth": 100, "trailingComma": "none", "arrowParens": "avoid" } diff --git a/package-lock.json b/package-lock.json index e4acbe77e..c1756b215 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3211,6 +3211,21 @@ "spawndamnit": "^2.0.0", "term-size": "^2.1.0", "tty-table": "^2.8.10" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + } } }, "@changesets/config": { @@ -4228,6 +4243,15 @@ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", "dev": true }, + "@jsdevtools/file-path-filter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/file-path-filter/-/file-path-filter-3.0.2.tgz", + "integrity": "sha512-+SbZG6stIE/nRF2PpRnubtuzhh4pouDsk/hEWwM5mKsSKlFfr4ziAE5VMogGG/K++i9NHbUTxxW0y4vdM678ew==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1" + } + }, "@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -4974,9 +4998,9 @@ "dev": true }, "audit-ci": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/audit-ci/-/audit-ci-3.2.0.tgz", - "integrity": "sha512-kRFfl/AdmyCrnuc/M4T3l/G/Hy8U4JsgnyRJgGq1532bCwh62ZGeL5rEk2Snk8Umyd3CRgY4V+mVI/LzQoN/Rg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/audit-ci/-/audit-ci-4.1.0.tgz", + "integrity": "sha512-UNmf/2diiuqA7HmegyD1n2vIZ+TPMbXO6ud2nb1MOdnoeFuecaBq3fcUo0ZLISWQx2yxgIz76JaEEbRlRZhRpA==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -7231,9 +7255,10 @@ } }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true }, "class-utils": { "version": "0.3.6", @@ -8616,6 +8641,12 @@ } } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9056,6 +9087,12 @@ "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==" }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9316,11 +9353,12 @@ "dev": true }, "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, "requires": { - "ci-info": "^2.0.0" + "ci-info": "^3.1.1" } }, "is-core-module": { @@ -11184,6 +11222,12 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, + "path-list-to-tree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/path-list-to-tree/-/path-list-to-tree-1.1.1.tgz", + "integrity": "sha512-yc5cIiQmOymJ5ewheH105A9I3No+6PBYlihsihun0iMctClKz6/GdZZW1EbEEo86fUa8aG9tjwpOELbXvTlvYw==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -11322,9 +11366,9 @@ "dev": true }, "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", "dev": true }, "private": { @@ -12112,6 +12156,32 @@ "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=" }, + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "dev": true, + "requires": { + "debug": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -12885,6 +12955,61 @@ } } }, + "tslint-staged": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tslint-staged/-/tslint-staged-0.1.3.tgz", + "integrity": "sha512-Z6wSoEqCf3itK93H2x6/f/XRJoIeEn9L0NuRjKN+VTRyuZb7CnwWxQflaTb0uupg8shm5oFnAcNGBnhOriZvig==", + "dev": true, + "requires": { + "@jsdevtools/file-path-filter": "^3.0.1", + "path-list-to-tree": "^1.1.1", + "read-pkg-up": "^7.0.1", + "simple-git": "^1.132.0", + "tslint": "~6.1.0", + "typescript": "~3.8.3" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + } + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + } + } + }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", diff --git a/package.json b/package.json index a509d0117..837354711 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "size": "echo \"Gzipped Size: $(gzip-size $npm_package_main | pretty-bytes)\"", "prepublishOnly": "npm test && npm run build && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags", "publish:beta": "npm publish --tag=beta", - "security:audit": "audit-ci --moderate --report-type summary --pass-enoaudit" + "security:audit": "audit-ci --moderate --report-type summary --pass-enoaudit --skip-dev", + "prepare": "is-ci || husky install" }, "keywords": [ "zimbra", @@ -37,6 +38,11 @@ ], "repository": "Zimbra/zm-api-js-client", "license": "BSD-3-Clause", + "tslintStaged": { + "tslintConfig": "tslint.json", + "include": [ "**/*.ts" ], + "exclude": [] + }, "dependencies": { "@apollo/client": "^3.2.1", "dataloader": "^1.4.0", @@ -62,15 +68,17 @@ "@types/lodash": "^4.14.162", "@types/node": "^14.14.2", "@types/whatwg-fetch": "^0.0.33", - "audit-ci": "^3.2.0", + "audit-ci": "^4.1.0", "babel-plugin-lodash": "^3.3.4", "chai": "^4.2.0", "copyfiles": "^2.4.1", "cross-var": "^1.1.0", "file-matcher": "^1.3.0", + "husky": "^6.0.0", + "is-ci": "^3.0.0", "mocha": "^8.3.2", "npm-run-all": "^4.1.5", - "prettier": "^2.1.2", + "prettier": "^2.3.1", "rimraf": "^3.0.2", "rollup": "^2.32.1", "rollup-plugin-graphql": "^0.1.0", @@ -79,6 +87,7 @@ "tslint": "^5.20.1", "tslint-config-prettier": "^1.18.0", "tslint-plugin-prettier": "^2.3.0", + "tslint-staged": "^0.1.3", "typescript": "^4.0.3", "uglify-js": "^3.12.1" } diff --git a/scripts/git-commit-msg.sh b/scripts/git-commit-msg.sh new file mode 100755 index 000000000..2f1ba8e9c --- /dev/null +++ b/scripts/git-commit-msg.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# This way you can customize which branches should be skipped when +# prepending commit message. +if [ -z "$BRANCHES_TO_SKIP" ]; then + BRANCHES_TO_SKIP=(master) +fi + +# Get the current branch name +BRANCH_NAME=$(git symbolic-ref --short HEAD) + +# Strip any leading prefix, up to and including, the last "/". e.g. turn "feature/ISSUE-1234" into "ISSUE-1234" +BRANCH_NAME="${BRANCH_NAME##*/}" + +BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$") +BRANCH_IN_COMMIT=$(grep -c "^$BRANCH_NAME" $1) + +if [ -n "$BRANCH_NAME" ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then + sed -i.bak -e "1s/^/$BRANCH_NAME /" $1 +fi