|
| 1 | +'use strict' |
| 2 | + |
| 3 | +const { mkdir, readFileSync, writeFile } = require('fs') |
| 4 | +const { promisify } = require('util') |
| 5 | + |
| 6 | +const { addScopeDirs } = require('./scope') |
| 7 | + |
| 8 | +const TEMPLATE = readFileSync(`${__dirname}/template.js`, { encoding: 'utf-8' }) |
| 9 | + |
| 10 | +const pMkdir = promisify(mkdir) |
| 11 | +const pWriteFile = promisify(writeFile) |
| 12 | + |
| 13 | +// Add `{output}/node_modules/{file}.js` for each devDependency. |
| 14 | +// The file simply throws an error. |
| 15 | +// The goal is to check that the published module does not use devDependencies. |
| 16 | +// Without create dummy `node_modules`, it would require `packageRoot` |
| 17 | +// devDependencies, which are probably installed since they are needed for |
| 18 | +// testing itself. |
| 19 | +const addDevChecks = async function({ output }) { |
| 20 | + const nodeModules = await getNodeModules({ output }) |
| 21 | + |
| 22 | + const devDependencies = getDevDependencies({ output }) |
| 23 | + |
| 24 | + await addScopeDirs({ devDependencies, nodeModules }) |
| 25 | + |
| 26 | + await Promise.all( |
| 27 | + devDependencies.map(name => addDevCheck({ name, nodeModules })), |
| 28 | + ) |
| 29 | +} |
| 30 | + |
| 31 | +// Retrieve `{output}/node_modules` |
| 32 | +const getNodeModules = async function({ output }) { |
| 33 | + const nodeModules = `${output}/node_modules` |
| 34 | + |
| 35 | + await pMkdir(nodeModules) |
| 36 | + |
| 37 | + return nodeModules |
| 38 | +} |
| 39 | + |
| 40 | +// Retrieve all `devDependencies` names. |
| 41 | +const getDevDependencies = function({ output }) { |
| 42 | + // eslint-disable-next-line import/no-dynamic-require |
| 43 | + const { devDependencies = {} } = require(`${output}/package.json`) |
| 44 | + const devDependenciesA = Object.keys(devDependencies) |
| 45 | + return devDependenciesA |
| 46 | +} |
| 47 | + |
| 48 | +// Add the dependency file, based on a simple template file. |
| 49 | +const addDevCheck = async function({ name, nodeModules }) { |
| 50 | + const devCheckFile = `${nodeModules}/${name}.js` |
| 51 | + const content = TEMPLATE.replace(TEMPLATE_TOKEN, name) |
| 52 | + await pWriteFile(devCheckFile, content, { encoding: 'utf-8' }) |
| 53 | +} |
| 54 | + |
| 55 | +const TEMPLATE_TOKEN = 'DEPENDENCY' |
| 56 | + |
| 57 | +module.exports = { |
| 58 | + addDevChecks, |
| 59 | +} |
0 commit comments