jazelle/utils/generate-dep-lockfiles.js (42 lines of code) (raw):

// @flow const {regenerate} = require('./lockfile.js'); const {remove, lstat} = require('./node-helpers.js'); /*:: import type {Metadata} from './get-local-dependencies.js'; export type GenerateDepLockfilesArgs = { root: string, deps: Array<Metadata>, ignore: Array<Metadata>, frozenLockfile: boolean, conservative: boolean, }; export type GenerateDepLockfiles = (GenerateDepLockfilesArgs) => Promise<void> */ const generateDepLockfiles /*: GenerateDepLockfiles */ = async ({ root, deps, ignore, frozenLockfile = false, conservative = false, }) => { const roots = deps.map(dep => dep.dir); if (await shouldRegenerate({roots})) { const tmp = `${root}/third_party/jazelle/temp/yarn-utilities-tmp`; await regenerate({ roots, ignore: ignore.map(dep => dep.meta.name), tmp, frozenLockfile, conservative, }); await remove(tmp); } }; const shouldRegenerate = async ({roots}) => { const meta = await Promise.all( roots.map(async dir => { const metaFile = `${dir}/package.json`; const metaStat = await lstat(metaFile).catch(() => ({mtimeMs: 0})); return metaStat.mtimeMs; }) ); const highestMeta = Math.max(...meta); const lock = await Promise.all( roots.map(async dir => { const yarnLock = `${dir}/yarn.lock`; const lockStat = await lstat(yarnLock).catch(() => ({mtimeMs: -1})); return lockStat.mtimeMs; }) ); const highestLock = Math.max(...lock); return highestMeta > highestLock; }; module.exports = {generateDepLockfiles};