JezK
Edit File: fs-normalized.js.map
{"version":3,"file":"fs-normalized.js","names":["disableTimestampCorrection","undefined","readFileBuffer","promisify","fs","readFile","close","lstat","open","futimes","write","unlink","require","copyFile","data","cleanup","ficloneFlag","constants","COPYFILE_FICLONE","dest","copyFilePoly","src","flags","Promise","resolve","reject","err","fixTimes","then","ex","copyWithBuffer","mode","fd","buffer","length","doOpen","openfd","destStat","fileDatesEqual","mtime","atime","a","b","aTime","getTime","bTime","process","platform","Math","abs","aTimeSec","floor","bTimeSec"],"sourceRoot":"../../src","sources":["util/fs-normalized.js"],"sourcesContent":["/* @flow */\n\n// This module serves as a wrapper for file operations that are inconsistant across node and OS versions.\n\nimport fs from 'fs';\nimport {promisify} from './promise.js';\n\nimport {constants} from './fs';\n\nexport type CopyFileAction = {\n src: string,\n dest: string,\n atime: Date,\n mtime: Date,\n mode: number,\n};\n\nlet disableTimestampCorrection: ?boolean = undefined; // OS dependent. will be detected on first file copy.\n\nconst readFileBuffer = promisify(fs.readFile);\nconst close: (fd: number) => Promise<void> = promisify(fs.close);\nconst lstat: (path: string) => Promise<fs.Stats> = promisify(fs.lstat);\nconst open: (path: string, flags: string | number, mode: number) => Promise<number> = promisify(fs.open);\nconst futimes: (fd: number, atime: number, mtime: number) => Promise<void> = promisify(fs.futimes);\n\nconst write: (\n fd: number,\n buffer: Buffer,\n offset: ?number,\n length: ?number,\n position: ?number,\n) => Promise<void> = promisify(fs.write);\n\nexport const unlink: (path: string) => Promise<void> = promisify(require('rimraf'));\n\n/**\n * Unlinks the destination to force a recreation. This is needed on case-insensitive file systems\n * to force the correct naming when the filename has changed only in character-casing. (Jest -> jest).\n */\nexport const copyFile = async function(data: CopyFileAction, cleanup: () => mixed): Promise<void> {\n // $FlowFixMe: Flow doesn't currently support COPYFILE_FICLONE\n const ficloneFlag = constants.COPYFILE_FICLONE || 0;\n try {\n await unlink(data.dest);\n await copyFilePoly(data.src, data.dest, ficloneFlag, data);\n } finally {\n if (cleanup) {\n cleanup();\n }\n }\n};\n\n// Node 8.5.0 introduced `fs.copyFile` which is much faster, so use that when available.\n// Otherwise we fall back to reading and writing files as buffers.\nconst copyFilePoly: (src: string, dest: string, flags: number, data: CopyFileAction) => Promise<void> = (\n src,\n dest,\n flags,\n data,\n) => {\n if (fs.copyFile) {\n return new Promise((resolve, reject) =>\n fs.copyFile(src, dest, flags, err => {\n if (err) {\n reject(err);\n } else {\n fixTimes(undefined, dest, data).then(() => resolve()).catch(ex => reject(ex));\n }\n }),\n );\n } else {\n return copyWithBuffer(src, dest, flags, data);\n }\n};\n\nconst copyWithBuffer: (src: string, dest: string, flags: number, data: CopyFileAction) => Promise<void> = async (\n src,\n dest,\n flags,\n data,\n) => {\n // Use open -> write -> futimes -> close sequence to avoid opening the file twice:\n // one with writeFile and one with utimes\n const fd = await open(dest, 'w', data.mode);\n try {\n const buffer = await readFileBuffer(src);\n await write(fd, buffer, 0, buffer.length);\n await fixTimes(fd, dest, data);\n } finally {\n await close(fd);\n }\n};\n\n// We want to preserve file timestamps when copying a file, since yarn uses them to decide if a file has\n// changed compared to the cache.\n// There are some OS specific cases here:\n// * On linux, fs.copyFile does not preserve timestamps, but does on OSX and Win.\n// * On windows, you must open a file with write permissions to call `fs.futimes`.\n// * On OSX you can open with read permissions and still call `fs.futimes`.\nasync function fixTimes(fd: ?number, dest: string, data: CopyFileAction): Promise<void> {\n const doOpen = fd === undefined;\n let openfd: number = fd ? fd : -1;\n\n if (disableTimestampCorrection === undefined) {\n // if timestamps match already, no correction is needed.\n // the need to correct timestamps varies based on OS and node versions.\n const destStat = await lstat(dest);\n disableTimestampCorrection = fileDatesEqual(destStat.mtime, data.mtime);\n }\n\n if (disableTimestampCorrection) {\n return;\n }\n\n if (doOpen) {\n try {\n openfd = await open(dest, 'a', data.mode);\n } catch (er) {\n // file is likely read-only\n try {\n openfd = await open(dest, 'r', data.mode);\n } catch (err) {\n // We can't even open this file for reading.\n return;\n }\n }\n }\n\n try {\n if (openfd) {\n await futimes(openfd, data.atime, data.mtime);\n }\n } catch (er) {\n // If `futimes` throws an exception, we probably have a case of a read-only file on Windows.\n // In this case we can just return. The incorrect timestamp will just cause that file to be recopied\n // on subsequent installs, which will effect yarn performance but not break anything.\n } finally {\n if (doOpen && openfd) {\n await close(openfd);\n }\n }\n}\n\n// Compare file timestamps.\n// Some versions of Node on windows zero the milliseconds when utime is used.\nexport const fileDatesEqual = (a: Date, b: Date) => {\n const aTime = a.getTime();\n const bTime = b.getTime();\n\n if (process.platform !== 'win32') {\n return aTime === bTime;\n }\n\n // See https://github.com/nodejs/node/pull/12607\n // Submillisecond times from stat and utimes are truncated on Windows,\n // causing a file with mtime 8.0079998 and 8.0081144 to become 8.007 and 8.008\n // and making it impossible to update these files to their correct timestamps.\n if (Math.abs(aTime - bTime) <= 1) {\n return true;\n }\n\n const aTimeSec = Math.floor(aTime / 1000);\n const bTimeSec = Math.floor(bTime / 1000);\n\n // See https://github.com/nodejs/node/issues/2069\n // Some versions of Node on windows zero the milliseconds when utime is used\n // So if any of the time has a milliseconds part of zero we suspect that the\n // bug is present and compare only seconds.\n if (aTime - aTimeSec * 1000 === 0 || bTime - bTimeSec * 1000 === 0) {\n return aTimeSec === bTimeSec;\n }\n\n return aTime === bTime;\n};\n"],"mappings":"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"}