diff --git a/.eslintignore b/.eslintignore index 4386f4e5..433db2c2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,3 +4,5 @@ !/tests/**/jsfmt.spec.js !/**/.eslintrc.js /test.js +/dist/ +/scripts/build/ diff --git a/.flowconfig b/.flowconfig index e2e996e0..b2680ab2 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,3 +1,4 @@ [ignore] .*/tests/.* .*/node_modules/.* +.*/dist/.* diff --git a/.gitignore b/.gitignore index 19e02330..d6ec7c60 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ npm-debug.log /test.ts /test.css /.vscode +/dist diff --git a/.ignore b/.ignore index 288c26f6..b75652a7 100644 --- a/.ignore +++ b/.ignore @@ -1 +1,2 @@ -docs/prettier.min.js \ No newline at end of file +docs/prettier.min.js +dist diff --git a/bin/prettier.js b/bin/prettier.js index bf487e4b..667a4146 100755 --- a/bin/prettier.js +++ b/bin/prettier.js @@ -9,7 +9,7 @@ const glob = require("glob"); const chalk = require("chalk"); const minimist = require("minimist"); const readline = require("readline"); -const prettier = require("../index"); +const prettier = eval("require")("../index"); const cleanAST = require("../src/clean-ast.js").cleanAST; const argv = minimist(process.argv.slice(2), { diff --git a/index.js b/index.js index 74843844..9d92028e 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ const printAstToDoc = require("./src/printer").printAstToDoc; const util = require("./src/util"); const printDocToString = require("./src/doc-printer").printDocToString; const normalizeOptions = require("./src/options").normalize; -const parser = require("./src/parser"); +const parser = require("./parser"); const printDocToDebug = require("./src/doc-debug").printDocToDebug; function guessLineEnding(text) { diff --git a/package.json b/package.json index 27d52de8..3eee662b 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,10 @@ "rollup-plugin-node-builtins": "2.0.0", "rollup-plugin-node-globals": "1.1.0", "rollup-plugin-node-resolve": "2.0.0", + "rollup-plugin-replace": "1.1.1", "typescript": "2.3.2", - "typescript-eslint-parser": "git://github.com/eslint/typescript-eslint-parser.git#87445776fce9dbc67139890b18143e767ab19c7d" + "typescript-eslint-parser": "git://github.com/eslint/typescript-eslint-parser.git#87445776fce9dbc67139890b18143e767ab19c7d", + "uglify-es": "mishoo/UglifyJS2#harmony" }, "scripts": { "test": "jest", diff --git a/src/parser.js b/parser.js similarity index 70% rename from src/parser.js rename to parser.js index 76055170..24ed3af4 100644 --- a/src/parser.js +++ b/parser.js @@ -4,15 +4,13 @@ function parse(text, opts) { let parseFunction; if (opts.parser === "flow") { - parseFunction = require("./parser-flow"); + parseFunction = eval("require")("./src/parser-flow"); } else if (opts.parser === "typescript") { - const r = require; - parseFunction = r("./parser-typescript"); + parseFunction = eval("require")("./src/parser-typescript"); } else if (opts.parser === "postcss") { - const r = require; - parseFunction = r("./parser-postcss"); + parseFunction = eval("require")("./src/parser-postcss"); } else { - parseFunction = require("./parser-babylon"); + parseFunction = eval("require")("./src/parser-babylon"); } try { diff --git a/scripts/build/build.sh b/scripts/build/build.sh new file mode 100755 index 00000000..15db8da4 --- /dev/null +++ b/scripts/build/build.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")"; +cd ../..; + +rm -Rf dist/ + +echo 'The warning about eval being strongly discouraged is normal.' + +echo 'Bundling index...'; +node_modules/.bin/rollup -c scripts/build/rollup.index.config.js + +echo 'Bundling bin...'; +node_modules/.bin/rollup -c scripts/build/rollup.bin.config.js +chmod +x ./dist/bin/prettier.js + +echo 'Bundling babylon...'; +node_modules/.bin/rollup -c scripts/build/rollup.parser.config.js --environment parser:babylon + +echo 'Bundling flow...'; +node_modules/.bin/rollup -c scripts/build/rollup.parser.config.js --environment parser:flow + +echo 'Bundling typescript...'; +node_modules/.bin/rollup -c scripts/build/rollup.parser.config.js --environment parser:typescript + +echo 'Bundling postcss...'; +node_modules/.bin/rollup -c scripts/build/rollup.parser.config.js --environment parser:postcss diff --git a/scripts/build/rollup.bin.config.js b/scripts/build/rollup.bin.config.js new file mode 100644 index 00000000..a0db03fa --- /dev/null +++ b/scripts/build/rollup.bin.config.js @@ -0,0 +1,22 @@ +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import json from 'rollup-plugin-json'; +import replace from 'rollup-plugin-replace'; + +const parser = process.env.parser; + +export default { + entry: 'bin/prettier.js', + dest: 'dist/bin/prettier.js', + format: 'cjs', + banner: '#!/usr/bin/env node', + plugins: [ + replace({ + '#!/usr/bin/env node': '' + }), + json(), + resolve(), + commonjs(), + ], + external: ['fs', 'readline', 'path', 'module', 'assert', 'util', 'events'], +}; diff --git a/scripts/build/rollup.index.config.js b/scripts/build/rollup.index.config.js new file mode 100644 index 00000000..ec50b29d --- /dev/null +++ b/scripts/build/rollup.index.config.js @@ -0,0 +1,15 @@ +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import json from 'rollup-plugin-json'; + +export default { + entry: 'index.js', + dest: 'dist/index.js', + format: 'cjs', + plugins: [ + json(), + resolve(), + commonjs(), + ], + external: ['assert'], +}; diff --git a/scripts/build/rollup.parser.config.js b/scripts/build/rollup.parser.config.js new file mode 100644 index 00000000..25edae5a --- /dev/null +++ b/scripts/build/rollup.parser.config.js @@ -0,0 +1,32 @@ +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import json from 'rollup-plugin-json'; +import replace from 'rollup-plugin-replace'; +import uglify from 'uglify-es'; + +const parser = process.env.parser; + +export default { + entry: 'src/parser-' + parser + '.js', + dest: 'dist/src/parser-' + parser + '.js', + format: 'cjs', + plugins: [ + parser === 'typescript' ? replace({ + 'exports\.Syntax =': '1,', + include: 'node_modules/typescript-eslint-parser/parser.js', + }) : {}, + json(), + resolve(), + commonjs(), + { + transformBundle(code) { + const result = uglify.minify(code, {}); + if (result.error) throw result.error; + return result; + } + } + ], + external: ['fs', 'buffer', 'path', 'module', 'assert', 'util', 'os', 'crypto'], + useStrict: parser === "flow" ? false : true, +}; + diff --git a/src/parser-postcss.js b/src/parser-postcss.js index a9d85a82..d4e782b6 100644 --- a/src/parser-postcss.js +++ b/src/parser-postcss.js @@ -3,8 +3,7 @@ const createError = require("./parser-create-error"); function parseSelector(selector) { - const r = require; - const selectorParser = r("postcss-selector-parser"); + const selectorParser = require("postcss-selector-parser"); let result; selectorParser(result_ => { result = result_; @@ -139,16 +138,14 @@ function parseNestedValue(node) { } function parseValue(value) { - const r = require; - const valueParser = r("postcss-values-parser"); + const valueParser = require("postcss-values-parser"); const result = valueParser(value, { loose: true }).parse(); const parsedResult = parseNestedValue(result); return addTypePrefix(parsedResult, "value-"); } function parseMediaQuery(value) { - const r = require; - const mediaParser = r("postcss-media-query-parser").default; + const mediaParser = require("postcss-media-query-parser").default; const result = addMissingType(mediaParser(value)); return addTypePrefix(result, "media-"); } @@ -206,20 +203,21 @@ function parseWithParser(parser, text) { return parsedResult; } +function requireParser(isSCSS) { + if (isSCSS) { + return require("postcss-scss"); + } else { + return require("postcss-less"); + } +} + function parse(text) { - const r = require; const isLikelySCSS = !!text.match(/(\w\s*: [^}:]+|#){/); try { - return parseWithParser( - r(isLikelySCSS ? "postcss-scss" : "postcss-less"), - text - ); + return parseWithParser(requireParser(isLikelySCSS), text); } catch (e) { try { - return parseWithParser( - r(isLikelySCSS ? "postcss-less" : "postcss-scss"), - text - ); + return parseWithParser(requireParser(!isLikelySCSS), text); } catch (e2) { throw e; } diff --git a/src/parser-typescript.js b/src/parser-typescript.js index db2b82c7..d4de6ed9 100644 --- a/src/parser-typescript.js +++ b/src/parser-typescript.js @@ -24,8 +24,7 @@ function parse(text) { function tryParseTypeScript(text, jsx) { // While we are working on typescript, we are putting it in devDependencies // so it shouldn't be picked up by static analysis - const r = require; - const parser = r("typescript-eslint-parser"); + const parser = require("typescript-eslint-parser"); return parser.parse(text, { loc: true, range: true, diff --git a/tests_config/run_spec.js b/tests_config/run_spec.js index 77730173..e95c2b19 100644 --- a/tests_config/run_spec.js +++ b/tests_config/run_spec.js @@ -2,8 +2,8 @@ const fs = require("fs"); const extname = require("path").extname; -const prettier = require("../"); -const parser = require("../src/parser"); +const prettier = require("../"); // change to ../dist/ to "test in prod" +const parser = require("../parser"); const massageAST = require("../src/clean-ast.js").massageAST; const AST_COMPARE = process.env["AST_COMPARE"]; diff --git a/yarn.lock b/yarn.lock index 25b8313a..de4c0725 100644 --- a/yarn.lock +++ b/yarn.lock @@ -541,6 +541,12 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1151,6 +1157,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -1894,6 +1904,12 @@ lru-cache@^4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +magic-string@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.15.2.tgz#0681d7388741bbc3addaa65060992624c6c09e9c" + dependencies: + vlq "^0.2.1" + magic-string@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" @@ -2522,7 +2538,15 @@ rollup-plugin-node-resolve@2.0.0: builtin-modules "^1.1.0" resolve "^1.1.6" -rollup-pluginutils@^1.5.1, rollup-pluginutils@^1.5.2: +rollup-plugin-replace@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-1.1.1.tgz#396315ded050a6ce43b9518a886a3f60efb1ea33" + dependencies: + magic-string "^0.15.2" + minimatch "^3.0.2" + rollup-pluginutils "^1.5.0" + +rollup-pluginutils@^1.5.0, rollup-pluginutils@^1.5.1, rollup-pluginutils@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" dependencies: @@ -2814,13 +2838,6 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -"typescript-eslint-parser@git://github.com/eslint/typescript-eslint-parser.git#2d09fb183e36a3b4089509c67cd256cd5f8871b0": - version "3.0.0" - resolved "git://github.com/eslint/typescript-eslint-parser.git#2d09fb183e36a3b4089509c67cd256cd5f8871b0" - dependencies: - lodash.unescape "4.0.1" - semver "5.3.0" - "typescript-eslint-parser@git://github.com/eslint/typescript-eslint-parser.git#87445776fce9dbc67139890b18143e767ab19c7d": version "3.0.0" resolved "git://github.com/eslint/typescript-eslint-parser.git#87445776fce9dbc67139890b18143e767ab19c7d" @@ -2832,6 +2849,13 @@ typescript@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" +uglify-es@mishoo/UglifyJS2#harmony: + version "3.0.12" + resolved "https://codeload.github.com/mishoo/UglifyJS2/tar.gz/e5e0ce0b42307fe7d535376c39caa02d5d823fe2" + dependencies: + commander "~2.9.0" + source-map "~0.5.1" + uglify-js@^2.6: version "2.8.27" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c"