From 4ca5e8ccb421c6e3c2f1f5c074573685ce423a93 Mon Sep 17 00:00:00 2001 From: ygj6 Date: Fri, 25 Jun 2021 21:38:40 +0800 Subject: [PATCH] feat: parseWebpackConfig support multiple environments --- package-lock.json | 463 +++++++++++++++++++ package.json | 2 + src/config/parse.ts | 31 +- src/config/webpack.ts | 2 +- src/transform/transformWebpack.ts | 2 +- tests/generate.test.ts | 26 +- tests/parse.test.ts | 42 +- tests/render.test.ts | 162 +++---- tests/testdata/generate/package.json | 5 +- tests/testdata/vue.config.js | 2 +- tests/testdata/webpack.config.js | 6 - tests/testdata/webpack/build/webpack.base.js | 37 ++ tests/testdata/webpack/build/webpack.dev.js | 15 + tests/testdata/webpack/webpack.config.js | 6 + 14 files changed, 676 insertions(+), 125 deletions(-) delete mode 100644 tests/testdata/webpack.config.js create mode 100644 tests/testdata/webpack/build/webpack.base.js create mode 100644 tests/testdata/webpack/build/webpack.dev.js create mode 100644 tests/testdata/webpack/webpack.config.js diff --git a/package-lock.json b/package-lock.json index 1332509..0e97021 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1152,6 +1152,32 @@ "integrity": "sha512-fj1hi+ZSW0xPLrJJD+YNwIh9GZbyaIepG26E/gXvp8nCa2pYokxUYO1sK9qjGxp2g8ryZYuon7wmjpwE2cyASQ==", "dev": true }, + "@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", + "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", + "dev": true + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -1555,6 +1581,164 @@ } } }, + "@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -1628,6 +1812,12 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2585,6 +2775,12 @@ } } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2708,6 +2904,12 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -3136,6 +3338,22 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -3178,6 +3396,12 @@ "unbox-primitive": "^1.0.1" } }, + "es-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz", + "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -3695,6 +3919,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4202,6 +4432,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "globals": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", @@ -6439,6 +6675,34 @@ } } }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7195,6 +7459,15 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -7482,6 +7755,12 @@ } } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -7505,6 +7784,17 @@ "xmlchars": "^2.2.0" } }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -7520,6 +7810,15 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -7707,6 +8006,12 @@ } } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7992,6 +8297,12 @@ } } }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, "temp": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", @@ -8020,6 +8331,56 @@ "supports-hyperlinks": "^2.0.0" } }, + "terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "dev": true, + "requires": { + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.0" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -8403,6 +8764,51 @@ } } }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.7", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", + "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, "vue-template-compiler": { "version": "2.6.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz", @@ -8446,12 +8852,53 @@ "makeerror": "1.0.x" } }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, + "webpack": { + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.40.0.tgz", + "integrity": "sha512-c7f5e/WWrxXWUzQqTBg54vBs5RgcAgpvKE4F4VegVgfo4x660ZxYUF2/hpMkZUnLjgytVTitjeXaN4IPlXCGIw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.47", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.2.1", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.6.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^2.3.0" + } + }, "webpack-chain": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.3.1.tgz", @@ -8476,6 +8923,16 @@ "lodash": "^4.17.15" } }, + "webpack-sources": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", + "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -8611,6 +9068,12 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "yorkie": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", diff --git a/package.json b/package.json index fd23d78..aed840a 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,8 @@ "vite": "^2.3.7", "vite-plugin-env-compatible": "^1.0.0", "vite-plugin-vue2": "^1.6.2", + "vue-loader": "^15.9.7", + "webpack": "^5.40.0", "yorkie": "^2.0.0" }, "dependencies": { diff --git a/src/config/parse.ts b/src/config/parse.ts index 0270b2a..e122464 100644 --- a/src/config/parse.ts +++ b/src/config/parse.ts @@ -1,14 +1,37 @@ -import fs from 'fs' -import { WebpackConfig } from './webpack' -import { VueCliConfig } from './vuecli' +import fs from 'fs'; +import path from 'path'; +import { WebpackConfig } from './webpack'; +import { VueCliConfig } from './vuecli'; export async function parseWebpackConfig ( configPath: string ): Promise { + // first of all, parse webpack config from path : ${__dirname}/webpack.config.js let webpackConfig: WebpackConfig = {} - await import(configPath).then((config) => { + if (fs.existsSync(configPath)) { + await import(configPath).then((config) => { + webpackConfig = config + }); + return webpackConfig + } + // if webpack.config.js not exists in ${__dirname}/webpack.config.js, scan folder ${__dirname}/build/ + const dir = path.dirname(configPath) + let buildDir = path.resolve(dir, 'build') + // if folder ${__dirname}/build/ not exists, scan folder ${__dirname}/webpack/ + if (!fs.existsSync(buildDir)) { + buildDir = path.resolve(dir, 'webpack') + } + // default config files: webpack.base.js、webpack.dev.js、webpack.prod.js|webpack.build.js|webpack.production.js + // TODO: production config + const devConfigPath = path.resolve(buildDir, 'webpack.dev.js') + if (!fs.existsSync(devConfigPath)) { + console.error(`${devConfigPath} not exists`) + return webpackConfig + } + await import(devConfigPath).then((config) => { webpackConfig = config }) + return webpackConfig } diff --git a/src/config/webpack.ts b/src/config/webpack.ts index 3e2338d..bac29e3 100644 --- a/src/config/webpack.ts +++ b/src/config/webpack.ts @@ -25,7 +25,7 @@ export interface Resolve { export interface WebpackConfig extends Config { mode?: string; - entry?: string | string[]; + entry?: string | string[] | { [entryAlias: string]: string }; output?: Output; module?: Module; resolve?: Resolve; diff --git a/src/transform/transformWebpack.ts b/src/transform/transformWebpack.ts index 5db21cd..e750cd8 100644 --- a/src/transform/transformWebpack.ts +++ b/src/transform/transformWebpack.ts @@ -31,7 +31,7 @@ export class WebpackTransformer implements Transformer { config.build = {} // convert entry - if (webpackConfig.entry !== '' && webpackConfig.entry?.length !== 0) { + if (webpackConfig.entry !== '' && webpackConfig.entry !== null) { config.build.rollupOptions = {} config.build.rollupOptions.input = webpackConfig.entry } diff --git a/tests/generate.test.ts b/tests/generate.test.ts index 60c8d73..a82c8cd 100644 --- a/tests/generate.test.ts +++ b/tests/generate.test.ts @@ -1,22 +1,22 @@ -import { genePackageJson } from "../src/generate/genePackageJson"; +import { genePackageJson } from '../src/generate/genePackageJson'; import path from 'path'; import fs from 'fs'; -import { genIndexHtml } from "../src/generate/geneIndexHtml"; -import { readSync } from "../src/utils/file"; +import { genIndexHtml } from '../src/generate/geneIndexHtml'; +import { readSync } from '../src/utils/file'; import * as constants from '../src/constants/constants'; test('genePackageJson', () => { - const packageJsonPath = path.resolve('./tests/testdata/generate/package.json'); - genePackageJson(packageJsonPath); - const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8'); - expect(JSON.parse(packageJsonContent).devDependencies['@vue/compiler-sfc']).toEqual(constants.VUE_COMPILER_SFC_VERSION); - expect(JSON.parse(packageJsonContent).devDependencies['vite']).toEqual(constants.VITE_VERSION); - expect(JSON.parse(packageJsonContent).devDependencies['@vitejs/plugin-vue']).toEqual(constants.VITE_PLUGIN_VUE_VERSION); + const packageJsonPath = path.resolve('./tests/testdata/generate/package.json'); + genePackageJson(packageJsonPath); + const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8'); + expect(JSON.parse(packageJsonContent).devDependencies['@vue/compiler-sfc']).toEqual(constants.VUE_COMPILER_SFC_VERSION); + expect(JSON.parse(packageJsonContent).devDependencies.vite).toEqual(constants.VITE_VERSION); + expect(JSON.parse(packageJsonContent).devDependencies['@vitejs/plugin-vue']).toEqual(constants.VITE_PLUGIN_VUE_VERSION); }); test('genIndexHtml', () => { - genIndexHtml('./tests/out'); - const filePath = path.resolve('./tests/out/index.html'); - const content = readSync(filePath); - expect(content).toContain('src/main.js'); + genIndexHtml('./tests/out'); + const filePath = path.resolve('./tests/out/index.html'); + const content = readSync(filePath); + expect(content).toContain('src/main.js'); }) diff --git a/tests/parse.test.ts b/tests/parse.test.ts index 7511859..a4a9e1e 100644 --- a/tests/parse.test.ts +++ b/tests/parse.test.ts @@ -1,22 +1,32 @@ -import { parseVueCliConfig, parseWebpackConfig } from "../src/config/parse"; -import { WebpackConfig } from "../src/config/webpack"; import path from 'path'; -import { VueCliConfig } from "../src/config/vuecli"; +// import fs from 'fs'; +import { parseVueCliConfig, parseWebpackConfig } from '../src/config/parse'; +import { WebpackConfig } from '../src/config/webpack'; +import { VueCliConfig } from '../src/config/vuecli'; -test('parseWebpackConfig', async () => { - let webpackConfig: WebpackConfig = {} ; - const configPath = path.resolve('tests/testdata/webpack.config.js'); - await parseWebpackConfig(configPath).then(res => { - webpackConfig = res ; - }); - expect(webpackConfig.entry).toEqual('./main.js'); +test('parse webpack.config.js', async () => { + let webpackConfig: WebpackConfig = {}; + const configPath = path.resolve('tests/testdata/webpack/webpack.config.js'); + await parseWebpackConfig(configPath).then(res => { + webpackConfig = res; + }); + expect(webpackConfig.entry).toEqual('./main.js'); }); +test('parse build/webpack.dev.js', async () => { + let webpackConfig: WebpackConfig = {}; + const filePath = path.resolve('tests/testdata/webpack/build/webpack.dev.js'); + await parseWebpackConfig(filePath).then(res => { + webpackConfig = res + }) + expect(webpackConfig.entry['app']).toEqual('./src/app.js'); +}) + test('parseVueCliConfig', async () => { - let vueCliConfig: VueCliConfig = {} - const configPath = path.resolve('tests/testdata/vue.config.js'); - await parseVueCliConfig(configPath).then(res => { - vueCliConfig = res ; - }); - expect(vueCliConfig.baseUrl).toEqual('/src'); + let vueCliConfig: VueCliConfig = {} + const configPath = path.resolve('tests/testdata/vue.config.js'); + await parseVueCliConfig(configPath).then(res => { + vueCliConfig = res; + }); + expect(vueCliConfig.baseUrl).toEqual('/src'); }); diff --git a/tests/render.test.ts b/tests/render.test.ts index d76045b..1f0e388 100644 --- a/tests/render.test.ts +++ b/tests/render.test.ts @@ -3,67 +3,67 @@ import { geneViteConfig } from '../src/generate/geneViteConfig'; import fs from 'fs'; import { serializeObject } from '../src/generate/render'; -test('geneViteConfig from non exist file', async() => { - const outputFilePath = path.resolve('tests/out/vite.config.js'); - const vueConfigPath = path.resolve('tests/nosuchfile'); - await geneViteConfig(vueConfigPath, path.resolve('tests/out')); - const result = fs.readFileSync(outputFilePath, 'utf8'); - expect(result).toContain('plugins'); +test('geneViteConfig from non exist file', async () => { + const outputFilePath = path.resolve('tests/out/vite.config.js'); + const vueConfigPath = path.resolve('tests/nosuchfile'); + await geneViteConfig(vueConfigPath, path.resolve('tests/out'), 'vue-cli'); + const result = fs.readFileSync(outputFilePath, 'utf8'); + expect(result).toContain('plugins'); }); -test('geneViteConfig from vue.config.js', async() => { - const outputFilePath = path.resolve('tests/out/vite.config.js'); - const vueConfigPath = path.resolve('tests/testdata'); - await geneViteConfig(vueConfigPath, path.resolve('tests/out')); - const result = fs.readFileSync(outputFilePath, 'utf8'); - expect(result).toContain('@components'); +test('geneViteConfig from vue.config.js', async () => { + const outputFilePath = path.resolve('tests/out/vite.config.js'); + const vueConfigPath = path.resolve('tests/testdata'); + await geneViteConfig(vueConfigPath, path.resolve('tests/out'), 'vue-cli'); + const result = fs.readFileSync(outputFilePath, 'utf8'); + expect(result).toContain('@components'); }); test('serialize string', () => { - const objA = { - key1: '\r\n \\src', - key2: '\'src\'', - key3: '"src"', - key4: `newline + const objA = { + key1: '\r\n \\src', + key2: '\'src\'', + key3: '"src"', + key4: `newline src` - } - const resultA = serializeObject(objA); - expect(resultA).toMatch('key1: \'\r\n \\src\''); - expect(resultA).toMatch('key2: \'\'src\'\''); - expect(resultA).toMatch('key3: \'"src"\''); - expect(resultA).toMatch('key4: \'newline\n'); + } + const resultA = serializeObject(objA); + expect(resultA).toMatch('key1: \'\r\n \\src\''); + expect(resultA).toMatch('key2: \'\'src\'\''); + expect(resultA).toMatch('key3: \'"src"\''); + expect(resultA).toMatch('key4: \'newline\n'); }); test('serializeObject', () => { - const abbreviatedKey = 'abbreviatedKey' - const objA = { - key1: undefined, - key2: null, - key3: false, - key4: 0, - key5: '0', - abbreviatedKey - } - const resultA = serializeObject(objA); - expect(resultA).not.toMatch('key1: undefined'); - expect(resultA).not.toMatch('key2: null'); - expect(resultA).toMatch('key3: false'); - expect(resultA).toMatch('key4: 0'); - expect(resultA).toMatch('key5: \'0\''); - expect(resultA).toMatch('abbreviatedKey: \'abbreviatedKey\''); + const abbreviatedKey = 'abbreviatedKey' + const objA = { + key1: undefined, + key2: null, + key3: false, + key4: 0, + key5: '0', + abbreviatedKey + } + const resultA = serializeObject(objA); + expect(resultA).not.toMatch('key1: undefined'); + expect(resultA).not.toMatch('key2: null'); + expect(resultA).toMatch('key3: false'); + expect(resultA).toMatch('key4: 0'); + expect(resultA).toMatch('key5: \'0\''); + expect(resultA).toMatch('abbreviatedKey: \'abbreviatedKey\''); - const objB = { - key1: { - key1: undefined, - key2: null, - key3: false, - key4: 0, - key5: '0', - abbreviatedKey - } + const objB = { + key1: { + key1: undefined, + key2: null, + key3: false, + key4: 0, + key5: '0', + abbreviatedKey } - const resultB = serializeObject(objB); - expect(resultB).toMatch('{\n' + + } + const resultB = serializeObject(objB); + expect(resultB).toMatch('{\n' + ' key1: {\n' + ' key3: false,\n' + ' key4: 0,\n' + @@ -72,32 +72,32 @@ test('serializeObject', () => { ' }\n' + '}'); - const objC = { - key1: [ - undefined, - null, - false, - 0, - '0' - ] - } - const resultC = serializeObject(objC); - expect(resultC).toMatch('{\n' + + const objC = { + key1: [ + undefined, + null, + false, + 0, + '0' + ] + } + const resultC = serializeObject(objC); + expect(resultC).toMatch('{\n' + ' key1: [\n' + ' false,\n' + ' 0,\n' + ' \'0\'\n' + ' ]\n' + '}' - ); + ); - const objD = { - key1: [ - objA - ] - } - const resultD = serializeObject(objD); - expect(resultD).toMatch('{\n' + + const objD = { + key1: [ + objA + ] + } + const resultD = serializeObject(objD); + expect(resultD).toMatch('{\n' + ' key1: [\n' + ' {\n' + ' key3: false,\n' + @@ -107,19 +107,19 @@ test('serializeObject', () => { ' }\n' + ' ]\n' + '}' - ); + ); - const objE = { - key3: function() { console.log('anonymous function') }, - key4: function() { console.log('anonymous function2') }, - key5: () => { console.log('arrow function') }, - key6: () => { console.log('arrow function') }, - key7() { console.log('abbreviated function') }, - key8() { console.log('abbreviated function') }, - key9() { /* key9 */ console.log('abbreviated function') } - } - const resultE = serializeObject(objE); - expect(resultE).toMatch('{\n' + + const objE = { + key3: function () { console.log('anonymous function') }, + key4: function () { console.log('anonymous function2') }, + key5: () => { console.log('arrow function') }, + key6: () => { console.log('arrow function') }, + key7 () { console.log('abbreviated function') }, + key8 () { console.log('abbreviated function') }, + key9 () { /* key9 */ console.log('abbreviated function') } + } + const resultE = serializeObject(objE); + expect(resultE).toMatch('{\n' + ' key3: function () { console.log(\'anonymous function\'); },\n' + ' key4: function () { console.log(\'anonymous function2\'); },\n' + ' key5: () => { console.log(\'arrow function\'); },\n' + diff --git a/tests/testdata/generate/package.json b/tests/testdata/generate/package.json index 1f2b71e..1305fbd 100644 --- a/tests/testdata/generate/package.json +++ b/tests/testdata/generate/package.json @@ -7,7 +7,7 @@ "build": "vue-cli-service build", "lint": "vue-cli-service lint", "serve-vite": "vite", - "build-vite": "build vite" + "build-vite": "vite build" }, "dependencies": { "core-js": "^3.6.5", @@ -24,7 +24,8 @@ "@vitejs/plugin-vue": "^1.2.1", "vite-plugin-env-compatible": "^1.0.0", "vite": "^2.1.5", - "@vitejs/plugin-vue-jsx": "^1.1.5" + "@vitejs/plugin-vue-jsx": "^1.1.5", + "@originjs/vite-plugin-commonjs": "^1.0.0-beta3" }, "eslintConfig": { "root": true, diff --git a/tests/testdata/vue.config.js b/tests/testdata/vue.config.js index 094de46..1f49209 100644 --- a/tests/testdata/vue.config.js +++ b/tests/testdata/vue.config.js @@ -1,6 +1,6 @@ const path = require('path') -function resolve(dir) { +function resolve (dir) { return path.join(__dirname, dir) } diff --git a/tests/testdata/webpack.config.js b/tests/testdata/webpack.config.js deleted file mode 100644 index 0c304cf..0000000 --- a/tests/testdata/webpack.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - entry: './main.js', - output: { - filename: 'bundle.js', - } -} diff --git a/tests/testdata/webpack/build/webpack.base.js b/tests/testdata/webpack/build/webpack.base.js new file mode 100644 index 0000000..41013c9 --- /dev/null +++ b/tests/testdata/webpack/build/webpack.base.js @@ -0,0 +1,37 @@ +const path = require('path') + +const VueLoaderPlugin = require('vue-loader/lib/plugin') + +module.exports = { + mode: 'development', + entry: './src/main.js', + output: { + filename: 'index.js', + path: path.resolve(__dirname, './dist') + }, + module: { + rules: [ + { + test: /\.vue$/, + use: ['vue-loader'] + }, + { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + }, + { + test: /\.(png|jpg|gif)$/, + use: [{ + loader: 'url-loader', + options: { + limit: 10000000, + esModule: false + } + }] + } + ] + }, + plugins: [ + new VueLoaderPlugin() + ] +} diff --git a/tests/testdata/webpack/build/webpack.dev.js b/tests/testdata/webpack/build/webpack.dev.js new file mode 100644 index 0000000..d7a11d4 --- /dev/null +++ b/tests/testdata/webpack/build/webpack.dev.js @@ -0,0 +1,15 @@ +const webpack = require('webpack') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.js') + +const entry = { + app: './src/app.js' +} + +module.exports = merge(baseWebpackConfig, { + entry: entry, + devtools: '#cheap-module-eval-source-map', + plugins: [ + new webpack.HotModuleReplacementPlugin() + ] +}) diff --git a/tests/testdata/webpack/webpack.config.js b/tests/testdata/webpack/webpack.config.js new file mode 100644 index 0000000..000bf12 --- /dev/null +++ b/tests/testdata/webpack/webpack.config.js @@ -0,0 +1,6 @@ +module.exports = { + entry: './main.js', + output: { + filename: 'bundle.js' + } +}