diff --git a/packages/vue-cli-plugin-uni/lib/env.js b/packages/vue-cli-plugin-uni/lib/env.js index a9546efad60..0aae5ad2456 100644 --- a/packages/vue-cli-plugin-uni/lib/env.js +++ b/packages/vue-cli-plugin-uni/lib/env.js @@ -246,6 +246,14 @@ moduleAlias.addAlias('vue-template-compiler', '@dcloudio/vue-cli-plugin-uni/pack moduleAlias.addAlias('@megalo/template-compiler', '@dcloudio/vue-cli-plugin-uni/packages/@megalo/template-compiler') moduleAlias.addAlias('mpvue-template-compiler', '@dcloudio/vue-cli-plugin-uni/packages/mpvue-template-compiler') +if (process.env.UNI_PLATFORM === 'mp-toutiao') { + // !important 始终带有一个空格 + moduleAlias.addAlias( + 'postcss-normalize-whitespace', + '@dcloudio/vue-cli-plugin-uni/packages/postcss-normalize-whitespace' + ) +} + if (runByHBuilderX) { const oldError = console.error console.error = function (msg) { diff --git a/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/LICENSE-MIT b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/LICENSE-MIT new file mode 100644 index 00000000000..fd0e863a614 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) Ben Briggs (http://beneb.info) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/README.md b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/README.md new file mode 100644 index 00000000000..7fb49c85174 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/README.md @@ -0,0 +1,44 @@ +# [postcss][postcss]-normalize-whitespace + +> Normalize whitespace with PostCSS. + +## Install + +With [npm](https://npmjs.org/package/postcss-normalize-whitespace) do: + +``` +npm install postcss-normalize-whitespace --save +``` + +## Example + +### Input + +```css +h1{ + width: calc(10px - ( 100px / var(--test) )) +} +``` + +### Output + +```css +h1{ + width: calc(10px - 100px / var(--test)) +} +``` + +## Usage + +See the [PostCSS documentation](https://github.com/postcss/postcss#usage) for +examples for your environment. + +## Contributors + +See [CONTRIBUTORS.md](https://github.com/cssnano/cssnano/blob/master/CONTRIBUTORS.md). + +## License + +MIT © [Ben Briggs](http://beneb.info) + +[postcss]: https://github.com/postcss/postcss diff --git a/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/dist/index.js b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/dist/index.js new file mode 100644 index 00000000000..1de0fa70e73 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/dist/index.js @@ -0,0 +1,97 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _postcss = require("postcss"); + +var _postcssValueParser = require("postcss-value-parser"); + +var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const atrule = "atrule"; +const decl = "decl"; +const rule = "rule"; + +function reduceCalcWhitespaces(node) { + if (node.type === "space") { + node.value = " "; + } else if (node.type === "function") { + node.before = node.after = ""; + } +} + +function reduceWhitespaces(node) { + if (node.type === "space") { + node.value = " "; + } else if (node.type === "div") { + node.before = node.after = ""; + } else if (node.type === "function") { + node.before = node.after = ""; + + if (node.value.toLowerCase() === "calc") { + _postcssValueParser2.default.walk(node.nodes, reduceCalcWhitespaces); + return false; + } + } +} + +exports.default = (0, _postcss.plugin)("postcss-normalize-whitespace", () => { + return css => { + const cache = {}; + + css.walk(node => { + const { type } = node; + + if (~[decl, rule, atrule].indexOf(type) && node.raws.before) { + node.raws.before = node.raws.before.replace(/\s/g, ""); + } + + if (type === decl) { + // Ensure that !important values do not have any excess whitespace + if (node.important) { + // fixed by xxxxxx 头条小程序 rpx!important 中间必须有空格,否则无法正确转换 + node.raws.important = " !important"; + } + + // Remove whitespaces around ie 9 hack + node.value = node.value.replace(/\s*(\\9)\s*/, "$1"); + + const value = node.value; + + if (cache[value]) { + node.value = cache[value]; + } else { + const parsed = (0, _postcssValueParser2.default)(node.value); + const result = parsed.walk(reduceWhitespaces).toString(); + + // Trim whitespace inside functions & dividers + node.value = result; + cache[value] = result; + } + + // Remove extra semicolons and whitespace before the declaration + if (node.raws.before) { + const prev = node.prev(); + + if (prev && prev.type !== rule) { + node.raws.before = node.raws.before.replace(/;/g, ""); + } + } + + node.raws.between = ":"; + node.raws.semicolon = false; + } else if (type === rule || type === atrule) { + node.raws.between = node.raws.after = ""; + node.raws.semicolon = false; + } + }); + + // Remove final newline + css.raws.after = ""; + }; +}); +module.exports = exports["default"]; \ No newline at end of file diff --git a/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/package.json b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/package.json new file mode 100644 index 00000000000..ba9c773392d --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/postcss-normalize-whitespace/package.json @@ -0,0 +1,40 @@ +{ + "name": "postcss-normalize-whitespace", + "version": "4.0.2", + "description": "Trim whitespace inside and around CSS rules & declarations.", + "main": "dist/index.js", + "files": [ + "dist", + "LICENSE-MIT" + ], + "scripts": { + "prepublish": "cross-env BABEL_ENV=publish babel src --out-dir dist --ignore /__tests__/" + }, + "keywords": [ + "css", + "postcss", + "postcss-plugin" + ], + "license": "MIT", + "devDependencies": { + "babel-cli": "^6.0.0", + "cross-env": "^5.0.0" + }, + "homepage": "https://github.com/cssnano/cssnano", + "author": { + "name": "Ben Briggs", + "email": "beneb.info@gmail.com", + "url": "http://beneb.info" + }, + "repository": "cssnano/cssnano", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "bugs": { + "url": "https://github.com/cssnano/cssnano/issues" + }, + "engines": { + "node": ">=6.9.0" + } +}