diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..764f5e1c8 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,207 @@ +version: 2.1 +aliases: + - &save_git_cache + save_cache: + paths: + - .git + key: v1-git-{{ .Revision }} + - &restore_git_cache + restore_cache: + keys: + - v1-git-{{ .Revision }} + - v1-git- + - &save_build_cache + save_cache: + paths: + - build + key: v1-build-{{ .Revision }} + - &restore_build_cache + restore_cache: + keys: + - v1-build-{{ .Revision }} + - &save_dist_cache + save_cache: + paths: + - dist + key: v1-dist-{{ .Revision }} + - &restore_dist_cache + restore_cache: + keys: + - v1-dist-{{ .Revision }} + - &save_npm_cache + save_cache: + paths: + - node_modules + key: v1-npm-{{ checksum "package-lock.json" }} + - &restore_npm_cache + restore_cache: + keys: + - v1-npm-{{ checksum "package-lock.json" }} + - v1-npm- + - &defaults + docker: + - image: circleci/node:8.16-browsers + working_directory: ~/repo + +jobs: + setup: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: npm install + - *save_git_cache + - *save_npm_cache + lint: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Lint + command: npm run test:lint -- --quiet --output-file test-results/eslint/results.xml --format junit + - store_test_results: + path: test-results + unit: + <<: *defaults + environment: + JEST_JUNIT_OUTPUT_NAME: results.xml + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Unit + environment: + JEST_JUNIT_OUTPUT_DIR: test-results/unit + command: npm run test:unit -- --reporters="default" --reporters="jest-junit" --coverage --coverageReporters=text --coverageReporters=lcov + - store_artifacts: + path: coverage + - store_test_results: + path: test-results + build: + <<: *defaults + environment: + NODE_ENV: production + NODE_OPTIONS: --max-old-space-size=4000 + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Build + command: npm run build + - *save_build_cache + - *save_dist_cache + store_build: + <<: *defaults + steps: + - *restore_build_cache + - store_artifacts: + path: build + store_dist: + <<: *defaults + steps: + - *restore_dist_cache + - store_artifacts: + path: dist + integration: + <<: *defaults + parallelism: 2 + environment: + JEST_JUNIT_OUTPUT_NAME: results.txt + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - *restore_build_cache + - run: + name: Integration + environment: + JEST_JUNIT_OUTPUT_DIR: test-results/integration + command: | + export TESTFILES=$(circleci tests glob "test/integration/*.test.js" | circleci tests split --split-by=timings) + $(npm bin)/jest ${TESTFILES} --reporters="default" --reporters="jest-junit" + - store_test_results: + path: test-results + + deploy-npm: + <<: *defaults + environment: + NODE_OPTIONS: --max-old-space-size=4000 + steps: + - *restore_git_cache + - *restore_dist_cache + - checkout + - run: | + echo export RELEASE_VERSION="0.1.0-prerelease.$(date +'%Y%m%d%H%M%S')" >> $BASH_ENV + echo export NPM_TAG=circlelatest >> $BASH_ENV + if [ "$CIRCLE_BRANCH" == "master" ] + then echo export NPM_TAG=circlestable >> $BASH_ENV + fi + if [[ "$CIRCLE_BRANCH" == hotfix/* ]] # double brackets are important for matching the wildcard + then echo export NPM_TAG=circlehotfix >> $BASH_ENV + fi + - run: npm version --no-git-tag-version $RELEASE_VERSION + - run: | + npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN + npm publish --tag $NPM_TAG + - run: git tag $RELEASE_VERSION + - run: git push $CIRCLE_REPOSITORY_URL $RELEASE_VERSION + + deploy-gh-pages: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - *restore_build_cache + - run: | + git config --global user.email $(git log --pretty=format:"%ae" -n1) + git config --global user.name $(git log --pretty=format:"%an" -n1) + - run: npm run deploy -- -e $CIRCLE_BRANCH + +workflows: + version: 2 + build-test-deploy: + jobs: + - setup + - lint: + requires: + - setup + - unit: + requires: + - setup + - build: + requires: + - setup + - integration: + requires: + - build + - store_build: + requires: + - build + - store_dist: + requires: + - build + # Disable deployment while running in parallel with Travis + # - deploy-npm: + # requires: + # - lint + # - unit + # - integration + # - build + # filters: + # branches: + # only: + # - master + # - develop + # - /^hotfix\/.*/ + # - deploy-gh-pages: + # requires: + # - lint + # - unit + # - integration + # - build diff --git a/package-lock.json b/package-lock.json index fe9bd258d..04d39f7b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -921,6 +921,17 @@ "to-fast-properties": "^2.0.0" } }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, "@scratch/paper": { "version": "0.11.20190729152410", "resolved": "https://registry.npmjs.org/@scratch/paper/-/paper-0.11.20190729152410.tgz", @@ -985,6 +996,31 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, "@types/json-schema": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", @@ -1003,6 +1039,12 @@ "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, "@typescript-eslint/experimental-utils": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", @@ -7779,6 +7821,81 @@ "p-cancelable": "^0.3.0" } }, + "jest-junit": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-7.0.0.tgz", + "integrity": "sha512-ljUdO0hLyu0A92xk7R2Wet3kj99fmazTo+ZFYQP6b7AGOBxJUj8ZkJWzJ632ajpXko2Y5oNoGR2kvOwiDdu6hg==", + "dev": true, + "requires": { + "jest-validate": "^24.0.0", + "mkdirp": "^0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true + }, + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + } + } + }, "jest-matcher-utils": { "version": "21.2.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", @@ -14645,6 +14762,12 @@ } } }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", diff --git a/package.json b/package.json index f8694762f..2fa5ec156 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "immutable": "3.8.2", "intl": "1.2.5", "jest": "^21.0.0", + "jest-junit": "^7.0.0", "js-base64": "2.4.9", "keymirror": "0.1.1", "lodash.bindall": "4.4.0",