diff --git a/package.json b/package.json index 3cfa20969..f6329ca21 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "autoprefixer": "^9.4.5", "bytes": "^3.0.0", "chalk": "^2.4.1", + "detective": "^5.2.0", "fs-extra": "^8.0.0", "lodash": "^4.17.11", "node-emoji": "^1.8.1", diff --git a/src/index.js b/src/index.js index 11f1aba46..b86050c2e 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ import fs from 'fs' import _ from 'lodash' import postcss from 'postcss' +import getModuleDependencies from './lib/getModuleDependencies' import registerConfigAsDependency from './lib/registerConfigAsDependency' import processTailwindFeatures from './processTailwindFeatures' import formatCSS from './lib/formatCSS' @@ -49,7 +50,9 @@ const getConfigFunction = config => () => { } if (!_.isObject(config)) { - delete require.cache[require.resolve(config)] + getModuleDependencies(config).forEach(mdl => { + delete require.cache[require.resolve(mdl.file)] + }) } return resolveConfig([ diff --git a/src/lib/getModuleDependencies.js b/src/lib/getModuleDependencies.js new file mode 100644 index 000000000..3cb6760ff --- /dev/null +++ b/src/lib/getModuleDependencies.js @@ -0,0 +1,30 @@ +import fs from 'fs' +import path from 'path' +import resolve from 'resolve' +import detective from 'detective' + +function createModule(file) { + const source = fs.readFileSync(file, 'utf-8') + const requires = detective(source) + + return { file, requires } +} + +export default function getModuleDependencies(entryFile) { + const rootModule = createModule(entryFile) + const modules = [rootModule] + + // Iterate over the modules, even when new + // ones are being added + for (const mdl of modules) { + mdl.requires.forEach(dep => { + const basedir = path.dirname(mdl.file) + const depPath = resolve.sync(dep, { basedir }) + const depModule = createModule(depPath) + + modules.push(depModule) + }) + } + + return modules +} diff --git a/src/lib/registerConfigAsDependency.js b/src/lib/registerConfigAsDependency.js index e4660e68d..13f3a5f35 100644 --- a/src/lib/registerConfigAsDependency.js +++ b/src/lib/registerConfigAsDependency.js @@ -1,4 +1,5 @@ import fs from 'fs' +import getModuleDependencies from './getModuleDependencies' export default function(configFile) { if (!fs.existsSync(configFile)) { @@ -6,10 +7,12 @@ export default function(configFile) { } return function(css, opts) { - opts.messages.push({ - type: 'dependency', - file: configFile, - parent: css.source.input.file, + getModuleDependencies(configFile).forEach(mdl => { + opts.messages.push({ + type: 'dependency', + parent: css.source.input.file, + file: mdl.file, + }) }) } } diff --git a/yarn.lock b/yarn.lock index 71a6c01dc..ddbf87647 100644 --- a/yarn.lock +++ b/yarn.lock @@ -954,11 +954,25 @@ acorn-jsx@^5.0.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" + integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== + acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" @@ -1620,6 +1634,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1640,6 +1659,15 @@ detect-newline@^2.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + diff-sequences@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" @@ -4968,6 +4996,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"