From 751c4d69ef1cfe0dfd595ebf94e86a1092cff505 Mon Sep 17 00:00:00 2001 From: Swashata Ghosh Date: Sun, 28 Apr 2019 14:24:48 +0530 Subject: [PATCH] feat(scripts): add less support Add built-in support for less. See #469 --- .gitignore | 1 + examples/plugin/package.json | 1 + examples/plugin/src/app/index.js | 4 +- examples/plugin/src/app/style.less | 17 ++ examples/plugin/wpackio.project.js | 2 + examples/plugin/yarn.lock | 184 ++++++++++++++---- packages/scripts/package.json | 4 +- .../scripts/src/config/CreateWebpackConfig.ts | 2 + .../scripts/src/config/WebpackConfigHelper.ts | 96 +++++---- .../src/config/project.config.default.ts | 1 + packages/scripts/src/scripts/Bootstrap.ts | 18 ++ .../scripts/templates/wpackio.project.js.hbs | 2 + yarn.lock | 57 +++++- 13 files changed, 304 insertions(+), 85 deletions(-) create mode 100644 examples/plugin/src/app/style.less diff --git a/.gitignore b/.gitignore index fd41038e7..14d833061 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ ## Project specifics ## +examples/tryouts # Compiled libraries packages/*/lib diff --git a/examples/plugin/package.json b/examples/plugin/package.json index 2de800bf5..9828c58d2 100644 --- a/examples/plugin/package.json +++ b/examples/plugin/package.json @@ -14,6 +14,7 @@ "cssnano": "^4.1.10", "eslint": "^5.16.0", "fork-ts-checker-webpack-plugin": "^1.0.2", + "less": "^3.9.0", "node-sass": "^4.11.0", "prettier": "^1.17.0", "svgo": "^1.2.1", diff --git a/examples/plugin/src/app/index.js b/examples/plugin/src/app/index.js index 2712edeaf..be16a52dd 100644 --- a/examples/plugin/src/app/index.js +++ b/examples/plugin/src/app/index.js @@ -1,9 +1,11 @@ /* eslint-disable no-console */ -import './index.css'; import imgURL from './image.png'; import logger from './modules/logger'; import svgURL from './svg.svg'; +import './index.css'; +import './style.less'; + console.log('Heres an URL of dynamically imported asset.'); console.log(imgURL); console.log(svgURL); diff --git a/examples/plugin/src/app/style.less b/examples/plugin/src/app/style.less new file mode 100644 index 000000000..fc2cb8453 --- /dev/null +++ b/examples/plugin/src/app/style.less @@ -0,0 +1,17 @@ +.entry-content { + background: #fff !important; + position: relative; + &::before { + content: "Style set by less"; + display: block; + font-style: italic; + font-family: cursive; + font-weight: bold; + color: purple; + font-size: 12px; + position: absolute; + top: 44px; + left: -5px; + transform: rotate(-90deg); + } +} diff --git a/examples/plugin/wpackio.project.js b/examples/plugin/wpackio.project.js index 1de44cae7..a15a29a93 100644 --- a/examples/plugin/wpackio.project.js +++ b/examples/plugin/wpackio.project.js @@ -186,6 +186,8 @@ module.exports = { hasReact: true, // Needs sass? hasSass: true, + // Needs less? + hasLess: true, // Externals externals: { jquery: 'jQuery', diff --git a/examples/plugin/yarn.lock b/examples/plugin/yarn.lock index 2355fb62e..7855880e0 100644 --- a/examples/plugin/yarn.lock +++ b/examples/plugin/yarn.lock @@ -40,6 +40,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -72,17 +83,17 @@ "@babel/traverse" "^7.4.0" "@babel/types" "^7.4.0" -"@babel/helper-create-class-features-plugin@^7.4.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef" - integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg== +"@babel/helper-create-class-features-plugin@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba" + integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" "@babel/helper-define-map@^7.4.0": version "7.4.0" @@ -190,6 +201,16 @@ "@babel/traverse" "^7.4.0" "@babel/types" "^7.4.0" +"@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -205,6 +226,13 @@ dependencies: "@babel/types" "^7.4.0" +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -238,6 +266,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== +"@babel/parser@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" + integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -247,12 +280,12 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@^7.3.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" - integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== +"@babel/plugin-proposal-class-properties@^7.4.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" + integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-create-class-features-plugin" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-json-strings@^7.2.0": @@ -650,7 +683,7 @@ "@babel/helper-regex" "^7.4.3" regexpu-core "^4.5.4" -"@babel/preset-env@^7.3.1", "@babel/preset-env@^7.4.3": +"@babel/preset-env@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" integrity sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw== @@ -768,6 +801,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" + integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" @@ -777,6 +825,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1160,29 +1217,31 @@ "@types/uglify-js" "*" source-map "^0.6.0" -"@typescript-eslint/eslint-plugin@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz#a5ff3128c692393fb16efa403ec7c8a5593dab0f" - integrity sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ== +"@typescript-eslint/eslint-plugin@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.7.0.tgz#570e45dc84fb97852e363f1e00f47e604a0b8bcc" + integrity sha512-NUSz1aTlIzzTjFFVFyzrbo8oFjHg3K/M9MzYByqbMCxeFdErhLAcGITVfXzSz+Yvp5OOpMu3HkIttB0NyKl54Q== dependencies: - "@typescript-eslint/parser" "1.6.0" - "@typescript-eslint/typescript-estree" "1.6.0" + "@typescript-eslint/parser" "1.7.0" + "@typescript-eslint/typescript-estree" "1.7.0" + eslint-utils "^1.3.1" + regexpp "^2.0.1" requireindex "^1.2.0" tsutils "^3.7.0" -"@typescript-eslint/parser@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.6.0.tgz#f01189c8b90848e3b8e45a6cdad27870529d1804" - integrity sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw== +"@typescript-eslint/parser@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.7.0.tgz#c3ea0d158349ceefbb6da95b5b09924b75357851" + integrity sha512-1QFKxs2V940372srm12ovSE683afqc1jB6zF/f8iKhgLz1yoSjYeGHipasao33VXKI+0a/ob9okeogGdKGvvlg== dependencies: - "@typescript-eslint/typescript-estree" "1.6.0" + "@typescript-eslint/typescript-estree" "1.7.0" eslint-scope "^4.0.0" eslint-visitor-keys "^1.0.0" -"@typescript-eslint/typescript-estree@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz#6cf43a07fee08b8eb52e4513b428c8cdc9751ef0" - integrity sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA== +"@typescript-eslint/typescript-estree@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.7.0.tgz#59ec02f5371964da1cc679dba7b878a417bc8c60" + integrity sha512-K5uedUxVmlYrVkFbyV3htDipvLqTE3QMOUQEHYJaKtgzxj6r7c5Ca/DG1tGgFxX+fsbi9nDIrf4arq7Ib7H/Yw== dependencies: lodash.unescape "4.0.1" semver "5.5.0" @@ -1333,29 +1392,29 @@ "@webassemblyjs/wast-parser" "1.8.5" "@xtuc/long" "4.2.2" -"@wpackio/babel-preset-base@^2.13.0": - version "2.13.0" - resolved "https://registry.yarnpkg.com/@wpackio/babel-preset-base/-/babel-preset-base-2.13.0.tgz#51dce11babd6bfbd14dab2c9ba9c5ade5aa34773" - integrity sha512-re9fOPtNzWZL3AB8R17bTbGbPA0O7SmdzdTcUc3gtp9X1qcSn+CO81q4pZXwfw09bnEtc5XYNm8sgQbJ1KkOUw== +"@wpackio/babel-preset-base@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@wpackio/babel-preset-base/-/babel-preset-base-3.0.0.tgz#f3ac56cec05344d71420194a26e308201b922fd3" + integrity sha512-wyKOsJ5QJcfIQKXwEhjgc/Ki3KAo1yvmWfjWYKCdn6QwsGhCwRjceoCVUjEgErxV1utkuaV+WvZg1B9vmwpGJw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.3.0" + "@babel/plugin-proposal-class-properties" "^7.4.0" "@babel/plugin-proposal-json-strings" "^7.2.0" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-import-meta" "^7.2.0" - "@babel/preset-env" "^7.3.1" + "@babel/preset-env" "^7.4.3" "@babel/preset-react" "^7.0.0" "@wpackio/entrypoint@file:../../packages/entrypoint": - version "2.12.0" + version "3.0.0" dependencies: "@types/webpack-env" "^1.13.9" "@wpackio/eslint-config@file:../../packages/eslint-config": - version "0.0.1" + version "3.0.0" dependencies: - "@typescript-eslint/eslint-plugin" "1.6.0" - "@typescript-eslint/parser" "1.6.0" + "@typescript-eslint/eslint-plugin" "1.7.0" + "@typescript-eslint/parser" "1.7.0" babel-eslint "^10.0.1" eslint-config-airbnb "^17.1.0" eslint-config-prettier "^4.1.0" @@ -1368,7 +1427,7 @@ eslint-plugin-react "^7.12.4" "@wpackio/scripts@file:../../packages/scripts": - version "2.13.0" + version "3.1.0" dependencies: "@babel/core" "^7.4.3" "@babel/preset-flow" "^7.0.0" @@ -1388,7 +1447,7 @@ "@types/webpack-dev-middleware" "^2.0.2" "@types/webpack-env" "^1.13.9" "@types/webpack-hot-middleware" "^2.16.5" - "@wpackio/babel-preset-base" "^2.13.0" + "@wpackio/babel-preset-base" "^3.0.0" archiver "^3.0.0" autoprefixer "^9.5.1" babel-loader "^8.0.5" @@ -1408,6 +1467,7 @@ gradient-string "^1.2.0" handlebars "^4.1.2" inquirer "^6.3.1" + less-loader "^4.1.0" log-symbols "^2.2.0" make-dir "^3.0.0" mini-css-extract-plugin "^0.6.0" @@ -2527,6 +2587,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1, clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3538,7 +3603,7 @@ entities@^1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -4792,6 +4857,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + immer@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/immer/-/immer-1.7.2.tgz#a51e9723c50b27e132f6566facbec1c85fc69547" @@ -5515,6 +5585,31 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +less-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^3.0.0" + +less@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474" + integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w== + dependencies: + clone "^2.1.2" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -5894,6 +5989,11 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@^2.3.1: version "2.4.2" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" @@ -7791,7 +7891,7 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -request@^2.87.0, request@^2.88.0: +request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" dependencies: @@ -8389,7 +8489,7 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 5255658bb..2c1c82a25 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -58,6 +58,7 @@ "gradient-string": "^1.2.0", "handlebars": "^4.1.2", "inquirer": "^6.3.1", + "less-loader": "^4.1.0", "log-symbols": "^2.2.0", "make-dir": "^3.0.0", "mini-css-extract-plugin": "^0.6.0", @@ -103,6 +104,7 @@ "devDependencies": { "@wpackio/eslint-config": "^3.0.0", "dts-gen": "0.5.7", - "fork-ts-checker-webpack-plugin": "1.1.1" + "fork-ts-checker-webpack-plugin": "1.1.1", + "less": "^3.9.0" } } diff --git a/packages/scripts/src/config/CreateWebpackConfig.ts b/packages/scripts/src/config/CreateWebpackConfig.ts index 51374d29d..5add42234 100644 --- a/packages/scripts/src/config/CreateWebpackConfig.ts +++ b/packages/scripts/src/config/CreateWebpackConfig.ts @@ -145,6 +145,7 @@ export class CreateWebpackConfig { slug, hasReact, hasSass, + hasLess, hasFlow, bannerConfig, alias, @@ -166,6 +167,7 @@ export class CreateWebpackConfig { port, hasReact, hasSass, + hasLess, hasFlow, bannerConfig, alias, diff --git a/packages/scripts/src/config/WebpackConfigHelper.ts b/packages/scripts/src/config/WebpackConfigHelper.ts index 65aeabea3..37b5f0bf3 100644 --- a/packages/scripts/src/config/WebpackConfigHelper.ts +++ b/packages/scripts/src/config/WebpackConfigHelper.ts @@ -39,6 +39,7 @@ export interface WebpackConfigHelperConfig { hasReact: ProjectConfig['hasReact']; hasSass: ProjectConfig['hasSass']; hasFlow: ProjectConfig['hasFlow']; + hasLess: ProjectConfig['hasLess']; jsBabelPresetOptions?: ProjectConfig['jsBabelPresetOptions']; tsBabelPresetOptions?: ProjectConfig['tsBabelPresetOptions']; jsBabelOverride?: ProjectConfig['jsBabelOverride']; @@ -364,7 +365,7 @@ ${bannerConfig.copyrightText}${bannerConfig.credit ? creditNote : ''}`, * Get module object for webpack, depending on environment. */ public getModule(): webpack.Module { - const { hasReact, hasSass, hasFlow } = this.config; + const { hasReact, hasSass, hasFlow, hasLess } = this.config; const wpackioBabelOptions: PresetOptions = { hasReact, }; @@ -494,46 +495,69 @@ ${bannerConfig.copyrightText}${bannerConfig.credit ? creditNote : ''}`, }; // Create style rules - const styleRules: webpack.RuleSetRule = { - test: /\.css$/, - use: [ - this.isDev - ? 'style-loader' - : { - loader: MiniCssExtractPlugin.loader, - options: { - sourceMap: true, - }, - }, - { - loader: 'css-loader', - options: { - importLoaders: 1, - sourceMap: true, - }, - }, - { - loader: 'postcss-loader', - options: { - sourceMap: true, - }, + const styleRulesUse: webpack.RuleSetRule['use'] = [ + this.isDev + ? 'style-loader' + : { + loader: MiniCssExtractPlugin.loader, + options: { + sourceMap: true, + }, + }, + { + loader: 'css-loader', + options: { + importLoaders: 1, + sourceMap: true, }, - ], - }; - // If we have sass, then add the stuff - if ( - hasSass && - styleRules.use !== undefined && - Array.isArray(styleRules.use) - ) { - styleRules.test = /\.(sa|sc|c)ss$/; - styleRules.use.push({ - loader: 'sass-loader', + }, + { + loader: 'postcss-loader', options: { sourceMap: true, }, + }, + ]; + + // Create style rules + const styleRules: webpack.RuleSetRule[] = [ + { + test: /\.css$/, + use: [...styleRulesUse], + }, + ]; + // If we have sass, then add the stuff + if (hasSass) { + styleRules.push({ + test: /\.s(a|c)ss$/, + use: [ + ...styleRulesUse, + { + loader: 'sass-loader', + options: { + sourceMap: true, + }, + }, + ], }); } + // If we have less, then add the stuff + if (hasLess) { + styleRules.push({ + test: /\.less$/, + use: [ + ...styleRulesUse, + { + loader: 'less-loader', + options: { + sourceMap: true, + javascriptEnabled: true, + }, + }, + ], + }); + } + // create file rules const { fileRulesNonStyle, @@ -545,7 +569,7 @@ ${bannerConfig.copyrightText}${bannerConfig.credit ? creditNote : ''}`, jsRules, tsRules, nmJsRules, - styleRules, + ...styleRules, fileRulesNonStyle, fileRulesStyle, ], diff --git a/packages/scripts/src/config/project.config.default.ts b/packages/scripts/src/config/project.config.default.ts index 35a003c72..d4a456163 100644 --- a/packages/scripts/src/config/project.config.default.ts +++ b/packages/scripts/src/config/project.config.default.ts @@ -78,6 +78,7 @@ export interface ProjectConfig { outputPath: string; hasReact: boolean; hasSass: boolean; + hasLess?: boolean; hasFlow: boolean; // Use babel.config.js instead of built-in options useBabelConfig?: boolean; diff --git a/packages/scripts/src/scripts/Bootstrap.ts b/packages/scripts/src/scripts/Bootstrap.ts index ce721b5ad..4864605e6 100644 --- a/packages/scripts/src/scripts/Bootstrap.ts +++ b/packages/scripts/src/scripts/Bootstrap.ts @@ -30,7 +30,9 @@ interface ProjectConfigContext { outputPath: string; hasReact: 'true' | 'false'; hasFlow: 'true' | 'false'; + hasTS: 'true' | 'false'; hasSass: 'true' | 'false'; + hasLess: 'true' | 'false'; watch: string; } @@ -169,7 +171,9 @@ export class Bootstrap { choices: [ { name: 'React', value: 'hasReact' }, { name: 'Flowtype', value: 'hasFlow' }, + { name: 'Typescript', value: 'hasTS' }, { name: 'Sass/Scss', value: 'hasSass' }, + { name: 'Less', value: 'hasLess' }, ], default: ['hasReact', 'hasSass'], }, @@ -215,10 +219,16 @@ export class Bootstrap { answers.features.indexOf('hasFlow') !== -1 ? 'true' : 'false', + hasTS: + answers.features.indexOf('hasTS') !== -1 ? 'true' : 'false', hasSass: answers.features.indexOf('hasSass') !== -1 ? 'true' : 'false', + hasLess: + answers.features.indexOf('hasLess') !== -1 + ? 'true' + : 'false', watch: answers.watch, }; const source: string = fs @@ -346,6 +356,14 @@ module.exports = { if (projectContext.hasSass === 'true') { devDependencies.push('node-sass'); } + // if has Less, then push less + if (projectContext.hasLess === 'true') { + devDependencies.push('less'); + } + // if has ts, then push fork-ts-checker-webpack-plugin + if (projectContext.hasTS === 'true') { + devDependencies.push('fork-ts-checker-webpack-plugin'); + } // Write it fs.writeFileSync( diff --git a/packages/scripts/templates/wpackio.project.js.hbs b/packages/scripts/templates/wpackio.project.js.hbs index c3f5af110..5439907a3 100644 --- a/packages/scripts/templates/wpackio.project.js.hbs +++ b/packages/scripts/templates/wpackio.project.js.hbs @@ -46,6 +46,8 @@ module.exports = { hasReact: {{hasReact}}, // Needs sass? hasSass: {{hasSass}}, + // Needs less? + hasLess: {{hasLess}}, // Needs flowtype? hasFlow: {{hasFlow}}, // Externals diff --git a/yarn.lock b/yarn.lock index ec715a432..2e353120b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2056,7 +2056,7 @@ "@types/connect" "*" "@types/webpack" "*" -"@types/webpack@*", "@types/webpack@^4.4.24", "@types/webpack@^4.4.27": +"@types/webpack@*", "@types/webpack@^4.4.27": version "4.4.27" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.27.tgz#8bb9429185977a6b3b9e6e6132f561066aa7e7c2" integrity sha512-xSll/4UXnLQ0xjdAoTRIFxA6NPC2abJ8nHxRH6SqTymHrfGCc8er7qH0npwCP8q3VFoJh2Hjz1wH8oTjwx9/jQ== @@ -2650,7 +2650,7 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -3685,6 +3685,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1, clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + cmd-shim@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" @@ -5017,7 +5022,7 @@ err-code@^1.0.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -6574,6 +6579,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + immutable@^3: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -7944,6 +7954,31 @@ lerna@3.13.4: import-local "^1.0.0" npmlog "^4.1.2" +less-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^3.0.0" + +less@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474" + integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w== + dependencies: + clone "^2.1.2" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -8493,6 +8528,11 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -10257,6 +10297,13 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + prompts@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.2.tgz#094119b0b0a553ec652908b583205b9867630154" @@ -10813,7 +10860,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@^2.87.0: +request@^2.83.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -11494,7 +11541,7 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==