blob: d92a38efd6773bc2c9a7c09ed83015baf5edb333 [file] [log] [blame]
const readPkgUp = require('read-pkg-up')
const path = require('path')
const dependencyGraph = new Map()
exports.dependencyGraph = dependencyGraph
exports.entries = new Set()
const entryWhitelist = [/\/tests?\//, /\.test\.js$/, /\.config\.js$/]
exports.checkEntriesWhitelist = filename => {
for (const re of entryWhitelist) {
if (re.test(filename)) {
exports.entries.add(filename)
}
}
}
const packageFile = readPkgUp.sync()
function recordPackageEntry(entry) {
exports.entries.add(path.resolve(packageFile.path, '..', entry))
}
if (packageFile) {
for (const key in packageFile.packageJson) {
if (key === 'main') {
recordPackageEntry(packageFile.packageJson.main)
} else if (key === 'entries') {
packageFile.packageJson.entries.forEach(recordPackageEntry)
} else if (/-bundles$/.test(key)) {
// github-asset-pipeline internal manifest format
Object.keys(packageFile.packageJson[key]).forEach(recordPackageEntry)
}
}
}
function gatherImported() {
const filenames = new Set()
const identifiers = new Set()
for (const {imports} of dependencyGraph.values()) {
for (const [importedFilename, importedIdentifiers] of imports) {
// require.resolve will expand any symlinks to their fully qualified
// directories. We can use this (with the absolute path given in
// importedFilename to quickly expand symlinks, which allows us to have
// symlinks (aka workspaces) in node_modules, and not fail the lint.
const fullyQualifiedImportedFilename = require.resolve(importedFilename)
filenames.add(fullyQualifiedImportedFilename)
for (const importedIdentifier of importedIdentifiers) {
identifiers.add(`${fullyQualifiedImportedFilename}#${importedIdentifier}`)
}
}
}
return {filenames, identifiers}
}
let importedCache = null
exports.imported = function() {
if (!importedCache) {
importedCache = gatherImported()
}
return importedCache
}