UNPKG

16.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport fcopy from \"fcopy-pre-bundled\"\nimport { access, ensureDir, link, lstat, readdir, readlink, stat, Stats, symlink, unlink, writeFile } from \"fs-extra-p\"\nimport isCi from \"is-ci\"\nimport * as path from \"path\"\nimport Mode from \"stat-mode\"\nimport { orNullIfFileNotExist } from \"./promise\"\nimport { debug } from \"./util\"\n\nexport const MAX_FILE_REQUESTS = 8\nexport const CONCURRENCY = {concurrency: MAX_FILE_REQUESTS}\n\nexport type FileTransformer = (path: string) => Promise<null | string | Buffer> | null | string | Buffer\nexport type Filter = (file: string, stat: Stats) => boolean\n\nexport function unlinkIfExists(file: string) {\n return unlink(file)\n .catch(() => {/* ignore */})\n}\n\nexport async function statOrNull(file: string): Promise<Stats | null> {\n return orNullIfFileNotExist(stat(file))\n}\n\nexport async function exists(file: string): Promise<boolean> {\n try {\n await access(file)\n return true\n }\n catch (e) {\n return false\n }\n}\n\nexport interface FileConsumer {\n consume(file: string, fileStat: Stats, parent: string, siblingNames: Array<string>): any\n\n /**\n * @default false\n */\n isIncludeDir?: boolean\n}\n\nexport async function walk(initialDirPath: string, filter?: Filter | null, consumer?: FileConsumer): Promise<Array<string>> {\n let result: Array<string> = []\n const queue: Array<string> = [initialDirPath]\n let addDirToResult = false\n const isIncludeDir = consumer == null ? false : consumer.isIncludeDir === true\n while (queue.length > 0) {\n const dirPath = queue.pop()!\n if (isIncludeDir) {\n if (addDirToResult) {\n result.push(dirPath)\n }\n else {\n addDirToResult = true\n }\n }\n\n const childNames = await readdir(dirPath)\n childNames.sort()\n\n let nodeModuleContent: Array<string> | null = null\n\n const dirs: Array<string> = []\n // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map\n const sortedFilePaths = await BluebirdPromise.map(childNames, name => {\n if (name === \".DS_Store\" || name === \".gitkeep\") {\n return null\n }\n\n const filePath = dirPath + path.sep + name\n return lstat(filePath)\n .then(stat => {\n if (filter != null && !filter(filePath, stat)) {\n return null\n }\n\n const consumerResult = consumer == null ? null : consumer.consume(filePath, stat, dirPath, childNames)\n if (consumerResult == null || !(\"then\" in consumerResult)) {\n if (stat.isDirectory()) {\n dirs.push(name)\n return null\n }\n else {\n return filePath\n }\n }\n else {\n return (consumerResult as Promise<any>)\n .then((it): any => {\n if (it != null && Array.isArray(it)) {\n nodeModuleContent = it\n return null\n }\n\n // asarUtil can return modified stat (symlink handling)\n if ((it != null && \"isDirectory\" in it ? (it as Stats) : stat).isDirectory()) {\n dirs.push(name)\n return null\n }\n else {\n return filePath\n }\n })\n }\n })\n }, CONCURRENCY)\n\n for (const child of sortedFilePaths) {\n if (child != null) {\n result.push(child)\n }\n }\n\n dirs.sort()\n for (const child of dirs) {\n queue.push(dirPath + path.sep + child)\n }\n\n if (nodeModuleContent != null) {\n result = result.concat(nodeModuleContent)\n }\n }\n\n return result\n}\n\nconst _isUseHardLink = process.platform !== \"win32\" && process.env.USE_HARD_LINKS !== \"false\" && (isCi || process.env.USE_HARD_LINKS === \"true\")\n\nexport function copyFile(src: string, dest: string, isEnsureDir = true) {\n return (isEnsureDir ? ensureDir(path.dirname(dest)) : BluebirdPromise.resolve()).then(() => copyOrLinkFile(src, dest, null, false))\n}\n\n/**\n * Hard links is used if supported and allowed.\n * File permission is fixed — allow execute for all if owner can, allow read for all if owner can.\n *\n * ensureDir is not called, dest parent dir must exists\n */\nexport function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, isUseHardLink = _isUseHardLink): Promise<any> {\n if (stats != null) {\n const originalModeNumber = stats.mode\n const mode = new Mode(stats)\n if (mode.owner.execute) {\n mode.group.execute = true\n mode.others.execute = true\n }\n\n mode.group.read = true\n mode.others.read = true\n\n if (originalModeNumber !== stats.mode) {\n if (debug.enabled) {\n const oldMode = new Mode({...stats, mode: originalModeNumber})\n debug(`${dest} permissions fixed from ${oldMode.toOctal()} (${oldMode.toString()}) to ${mode.toOctal()} (${mode.toString()})`)\n }\n\n // https://helgeklein.com/blog/2009/05/hard-links-and-permissions-acls/\n // Permissions on all hard links to the same data on disk are always identical. The same applies to attributes.\n // That means if you change the permissions/owner/attributes on one hard link, you will immediately see the changes on all other hard links.\n if (isUseHardLink) {\n isUseHardLink = false\n debug(`${dest} will be copied, but not linked, because file permissions need to be fixed`)\n }\n }\n }\n\n if (isUseHardLink) {\n return link(src, dest)\n }\n\n return new BluebirdPromise((resolve, reject) => {\n fcopy(src, dest, stats == null ? undefined : {mode: stats.mode}, error => error == null ? resolve() : reject(error))\n })\n}\n\nexport class FileCopier {\n isUseHardLink: boolean\n\n constructor(private readonly isUseHardLinkFunction?: (file: string) => boolean, private readonly transformer?: FileTransformer | null) {\n this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS\n }\n\n async copy(src: string, dest: string, stat: Stats | undefined) {\n try {\n if (this.transformer != null && stat != null && stat.isFile()) {\n let data = this.transformer(src)\n if (data != null) {\n if (typeof (data as any).then === \"function\") {\n data = await data\n }\n\n if (data != null) {\n await writeFile(dest, data)\n return\n }\n }\n }\n await copyOrLinkFile(src, dest, stat, (!this.isUseHardLink || this.isUseHardLinkFunction == null) ? this.isUseHardLink : this.isUseHardLinkFunction(dest))\n }\n catch (e) {\n // files are copied concurrently, so, we must not check here currentIsUseHardLink — our code can be executed after that other handler will set currentIsUseHardLink to false\n if (e.code === \"EXDEV\") {\n // ...but here we want to avoid excess debug log message\n if (this.isUseHardLink) {\n debug(`Cannot copy using hard link: ${e}`)\n this.isUseHardLink = false\n }\n\n await copyOrLinkFile(src, dest, stat, false)\n }\n else {\n throw e\n }\n }\n }\n}\n\n/**\n * Empty directories is never created.\n * Hard links is used if supported and allowed.\n */\nexport function copyDir(src: string, destination: string, filter?: Filter | null, transformer?: FileTransformer | null, isUseHardLink?: (file: string) => boolean): Promise<any> {\n const fileCopier = new FileCopier(isUseHardLink, transformer)\n\n if (debug.enabled) {\n debug(`Copying ${src} to ${destination}${fileCopier.isUseHardLink ? \" using hard links\" : \"\"}`)\n }\n\n const createdSourceDirs = new Set<string>()\n const links: Array<Link> = []\n return walk(src, filter, {\n consume: async (file, stat, parent) => {\n if (!stat.isFile() && !stat.isSymbolicLink()) {\n return\n }\n\n if (!createdSourceDirs.has(parent)) {\n await ensureDir(parent.replace(src, destination))\n createdSourceDirs.add(parent)\n }\n\n const destFile = file.replace(src, destination)\n if (stat.isFile()) {\n await fileCopier.copy(file, destFile, stat)\n }\n else {\n links.push({file: destFile, link: await readlink(file)})\n }\n }\n })\n .then(() => BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY))\n}\n\nexport const DO_NOT_USE_HARD_LINKS = (file: string) => false\n\nexport interface Link {\n readonly link: string,\n readonly file: string\n}"]}