diff --git a/.gitignore b/.gitignore index 37d19e58..f3526b89 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ cov.* .nyc_output # List specific to .gitignore +build node_modules .idea/ diff --git a/.npmignore b/.npmignore index ab28f77d..15a3a5b1 100644 --- a/.npmignore +++ b/.npmignore @@ -10,6 +10,7 @@ cov.* # List specific to .npmignore .travis.yml .npmignore +lib docs/ img/ test/ diff --git a/.travis.yml b/.travis.yml index daede473..bebcdae4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ install: - 'npm install --no-save' script: - 'npm run ci:lint' + - 'npm run ci:build' - 'npm run ci:test' after_success: - 'npm run ci:release' diff --git a/appveyor.yml b/appveyor.yml index 0c680cc7..ef592b83 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,14 +1,15 @@ environment: - nodejs_version: "10" + nodejs_version: '10' cache: - - "node_modules" + - 'node_modules' install: - ps: Install-Product node 10 - - "npm -g install npm@6" + - 'npm -g install npm@6' - "set PATH=%APPDATA%\\npm;%PATH%" - - "npm install" + - 'npm install' build: off test_script: - - "node --version" - - "npm --version" - - "npm test" + - 'node --version' + - 'npm --version' + - 'npm run build' + - 'npm test' diff --git a/package-lock.json b/package-lock.json index 761d7cc8..5f11bc6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -507,6 +507,12 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -542,6 +548,15 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -1290,6 +1305,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -2917,6 +2938,12 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -4825,6 +4852,12 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4905,6 +4938,15 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-reference": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", + "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5675,6 +5717,15 @@ "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", "dev": true }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -11014,6 +11065,77 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.17.0.tgz", + "integrity": "sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "^12.6.2", + "acorn": "^6.2.0" + }, + "dependencies": { + "@types/node": { + "version": "12.6.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", + "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", + "dev": true + }, + "acorn": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", + "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "dev": true + } + } + }, + "rollup-plugin-commonjs": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.1.tgz", + "integrity": "sha512-x0PcCVdEc4J8igv1qe2vttz8JKAKcTs3wfIA3L8xEty3VzxgORLrzZrNWaVMc+pBC4U3aDOb9BnWLAQ8J11vkA==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + }, + "dependencies": { + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -11548,6 +11670,12 @@ "through2": "^2.0.0" } }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, "spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", diff --git a/package.json b/package.json index 93b6d437..4f87145f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "gavel", "version": "0.0.0-semantically-released", "description": "Validator of HTTP transactions (JavaScript implementation)", - "main": "lib/index.js", + "main": "build/index.js", "engines": { "node": ">= 8" }, @@ -10,6 +10,8 @@ "gavel": "bin/gavel" }, "scripts": { + "start": "npm run build -- --watch", + "build": "rollup -c=rollup.config.js", "lint": "eslint lib/**/*.js test/**/*.js", "test": "npm run test:server && npm run test:browser && npm run test:features", "test:server": "mocha \"test/**/*.test.js\"", @@ -19,6 +21,7 @@ "coveralls": "nyc --reporter=text-lcov npm run test:server | coveralls", "ci:lint": "npm run lint", "ci:test": "npm run coveralls && npm run test:browser && npm run test:features", + "ci:build": "npm run build", "ci:release": "semantic-release" }, "husky": { diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..3df08872 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,26 @@ +const resolve = require('rollup-plugin-node-resolve'); +const commonjs = require('rollup-plugin-commonjs'); +const packageJson = require('./package.json'); + +const buildUmd = { + input: 'lib/index.js', + output: { + file: packageJson.main, + format: 'umd', + name: 'gavel', + exports: 'named', + sourcemap: true + }, + plugins: [ + resolve({ + browser: true, + + // Forbid bundling of NodeJS built-ins (i.e. "fs", "path"). + // Throw when such modules are present in the bundle. + preferBuiltins: false + }), + commonjs() + ] +}; + +module.exports = [buildUmd]; diff --git a/test/cucumber/support/world.js b/test/cucumber/support/world.js index 5d635af3..bb323c38 100644 --- a/test/cucumber/support/world.js +++ b/test/cucumber/support/world.js @@ -1,15 +1,6 @@ -/* - * decaffeinate suggestions: - * DS101: Remove unnecessary use of Array.from - * DS102: Remove unnecessary code created because of implicit returns - * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md - */ -/* eslint-disable */ -const vm = require('vm'); -const util = require('util'); const { assert } = require('chai'); const { exec } = require('child_process'); -const gavel = require('../../../lib'); +const gavel = require('../../../build'); const HTTP_LINE_DELIMITER = '\n'; @@ -28,12 +19,10 @@ class World { executeCommands(commands) { const commandsBuffer = commands.join(';'); - const cmd = - `PATH=$PATH:${process.cwd()}/bin:${process.cwd()}/node_modules/.bin; cd /tmp/gavel-* ;` + - commandsBuffer; + const cmd = `PATH=$PATH:${process.cwd()}/bin:${process.cwd()}/node_modules/.bin; cd /tmp/gavel-* ;${commandsBuffer}`; return new Promise((resolve) => { - const child = exec(cmd, function(error, stdout, stderr) { + const child = exec(cmd, function(error) { if (error) { resolve(error.code); } @@ -78,7 +67,8 @@ Make sure it's in the "Header-Name: value" format. ` ); - const [_, key, value] = match; + const key = match[1]; + const value = match[2]; return Object.assign({}, acc, { [key.toLowerCase()]: value.trim() @@ -117,17 +107,17 @@ Make sure it's in the "Header-Name: value" format. const headersLines = []; let bodyEntered = false; - for (let line of Array.from(lines)) { + /* eslint-disable no-restricted-syntax */ + for (const line of Array.from(lines)) { if (line === '') { bodyEntered = true; + } else if (bodyEntered) { + bodyLines.push(line); } else { - if (bodyEntered) { - bodyLines.push(line); - } else { - headersLines.push(line); - } + headersLines.push(line); } } + /* eslint-enable no-restricted-syntax */ parsed.headers = this.parseHeaders(headersLines.join(HTTP_LINE_DELIMITER)); parsed.body = bodyLines.join(HTTP_LINE_DELIMITER); @@ -154,20 +144,21 @@ Make sure it's in the "Header-Name: value" format. } toPascalCase(string) { - let result = string.replace( - /(\w)(\w*)/g, - (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase() - ); - return (result = result.replace(' ', '')); + return string + .replace( + /(\w)(\w*)/g, + (g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase() + ) + .replace(' ', ''); } // Debugging helper inspect(data) { if (data !== null && typeof data === 'object') { return JSON.stringify(data, null, 2); - } else { - return data; } + + return data; } // Debugging helper @@ -177,5 +168,5 @@ Make sure it's in the "Header-Name: value" format. } module.exports = function() { - return (this.World = World); + this.World = World; };