From c309788b427f0e1167cddd05ddf3bae8588e7ff0 Mon Sep 17 00:00:00 2001 From: Evilebot Tnawi Date: Tue, 5 Mar 2019 17:45:43 +0300 Subject: [PATCH] refactor: avoid `lodash` in favor native implementations --- package-lock.json | 76 +++++++++++++++++-------------- package.json | 2 +- src/index.js | 2 +- src/plugins/postcss-url-parser.js | 28 ++++++++++-- src/utils.js | 6 +++ 5 files changed, 74 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index f502d5b9..9677671c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1886,6 +1886,14 @@ "string-width": "^2.0.0", "term-size": "^1.2.0", "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } } }, "brace-expansion": { @@ -2165,10 +2173,9 @@ "dev": true }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==" }, "camelcase-keys": { "version": "4.2.0", @@ -2179,6 +2186,14 @@ "camelcase": "^4.1.0", "map-obj": "^2.0.0", "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } } }, "caniuse-lite": { @@ -7039,14 +7054,6 @@ "jest-get-type": "^24.0.0", "leven": "^2.1.0", "pretty-format": "^24.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", - "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", - "dev": true - } } }, "jest-watcher": { @@ -7571,7 +7578,8 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -9603,9 +9611,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.0.tgz", + "integrity": "sha512-tlYkVh6F/QXtosuyOZV2SkOtA248fjMAUWjGf8aYBvQK1ZMarbMvFBvkguSt93HhdXh20m15sc4b5EIBxXLHQQ==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -9649,17 +9657,17 @@ "dev": true }, "regexpu-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", - "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.2.tgz", + "integrity": "sha512-CgGxXmuX0Cf57z7KahSHe4kaNY8gBRCFFEretQ5AHsnlLx/5VdCrQOoOz1POxLdZjPbwE5ncTspPJwp2WHPcHA==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", + "regenerate-unicode-properties": "^8.0.0", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "registry-auth-token": { @@ -11114,15 +11122,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", "dev": true }, "union-value": { @@ -11672,12 +11680,6 @@ "yargs-parser": "^11.1.1" }, "dependencies": { - "camelcase": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", - "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -11740,6 +11742,14 @@ "dev": true, "requires": { "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } } }, "yup": { diff --git a/package.json b/package.json index 2e4f7b9b..79040627 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "dependencies": { "icss-utils": "^4.1.0", "loader-utils": "^1.2.3", - "lodash": "^4.17.11", + "camelcase": "^5.2.0", "postcss": "^7.0.14", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^2.0.6", diff --git a/src/index.js b/src/index.js index 0011b0d8..f3b04202 100644 --- a/src/index.js +++ b/src/index.js @@ -17,7 +17,6 @@ import { getCurrentRequest, stringifyRequest, } from 'loader-utils'; -import camelCase from 'lodash/camelCase'; import schema from './options.json'; import { importParser, icssParser, urlParser } from './plugins'; @@ -25,6 +24,7 @@ import { getLocalIdent, getImportPrefix, placholderRegExps, + camelCase, dashesCamelCase, getFilter, } from './utils'; diff --git a/src/plugins/postcss-url-parser.js b/src/plugins/postcss-url-parser.js index e1816ff0..96fd7187 100644 --- a/src/plugins/postcss-url-parser.js +++ b/src/plugins/postcss-url-parser.js @@ -1,6 +1,5 @@ import postcss from 'postcss'; import valueParser from 'postcss-value-parser'; -import _ from 'lodash'; const pluginName = 'postcss-url-parser'; @@ -87,14 +86,29 @@ function walkDeclsWithUrl(css, result, filter) { return items; } +function uniqWith(array, comparator) { + return array.reduce( + (acc, d) => (!acc.some((item) => comparator(d, item)) ? [...acc, d] : acc), + [] + ); +} + +function flatten(array) { + return array.reduce((a, b) => a.concat(b), []); +} + +function isEqual(value, other) { + return value.url === other.url && value.needQuotes === other.needQuotes; +} + export default postcss.plugin( pluginName, (options = {}) => function process(css, result) { const traversed = walkDeclsWithUrl(css, result, options.filter); - const paths = _.uniqWith( - _.flatten(traversed.map((item) => item.urls)), - _.isEqual + const paths = uniqWith( + flatten(traversed.map((item) => item.urls)), + isEqual ); if (paths.length === 0) { @@ -118,7 +132,11 @@ export default postcss.plugin( traversed.forEach((item) => { walkUrls(item.parsed, (node, url, needQuotes) => { - const value = _.find(placeholders, { path: { url, needQuotes } }); + const value = placeholders.find( + (placeholder) => + placeholder.path.url === url && + placeholder.path.needQuotes === needQuotes + ); if (!value) { return; diff --git a/src/utils.js b/src/utils.js index 86d70d95..6df7ef0f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -4,6 +4,7 @@ */ import path from 'path'; +import cc from 'camelcase'; import loaderUtils from 'loader-utils'; /* eslint-disable line-comment-position */ @@ -30,6 +31,10 @@ function getImportPrefix(loaderContext, importLoaders) { return `-!${loadersRequest}!`; } +function camelCase(str) { + return cc(str); +} + function dashesCamelCase(str) { return str.replace(/-+(\w)/g, (match, firstLetter) => firstLetter.toUpperCase() @@ -105,6 +110,7 @@ export { getImportPrefix, getLocalIdent, placholderRegExps, + camelCase, dashesCamelCase, getFilter, };