UNPKG

17.9 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { access, chmod, copyFile as _nodeCopyFile, ensureDir, link, lstat, readdir, readlink, stat, Stats, symlink, unlink, writeFile } from \"fs-extra\"\nimport * as path from \"path\"\nimport { Mode } from \"stat-mode\"\nimport { log } from \"./log\"\nimport { orIfFileNotExist, orNullIfFileNotExist } from \"./promise\"\n\nexport const MAX_FILE_REQUESTS = 8\nexport const CONCURRENCY = {concurrency: MAX_FILE_REQUESTS}\n\nexport type AfterCopyFileTransformer = (file: string) => Promise<void>\n\nexport class CopyFileTransformer {\n constructor(public readonly afterCopyTransformer: AfterCopyFileTransformer) {\n }\n}\n\nexport type FileTransformer = (file: string) => Promise<null | string | Buffer | CopyFileTransformer> | null | string | Buffer | CopyFileTransformer\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\n/**\n * Returns list of file paths (system-dependent file separator)\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 orIfFileNotExist(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 === false) {\n return null\n }\n else 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\" && (require(\"is-ci\") || process.env.USE_HARD_LINKS === \"true\")\n\nexport function copyFile(src: string, dest: string, isEnsureDir = true) {\n return (isEnsureDir ? ensureDir(path.dirname(dest)) : Promise.resolve())\n .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?: boolean, exDevErrorHandler?: (() => boolean) | null): Promise<any> {\n if (isUseHardLink === undefined) {\n isUseHardLink = _isUseHardLink\n }\n\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 mode.setuid = false\n mode.setgid = false\n\n if (originalModeNumber !== stats.mode) {\n if (log.isDebugEnabled) {\n const oldMode = new Mode({mode: originalModeNumber})\n log.debug({file: dest, oldMode, mode}, \"permissions fixed from\")\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 log.debug({dest}, \"copied, but not linked, because file permissions need to be fixed\")\n }\n }\n }\n\n if (isUseHardLink) {\n return link(src, dest)\n .catch(e => {\n if (e.code === \"EXDEV\") {\n const isLog = exDevErrorHandler == null ? true : exDevErrorHandler()\n if (isLog && log.isDebugEnabled) {\n log.debug({error: e.message}, \"cannot copy using hard link\")\n }\n return doCopyFile(src, dest, stats)\n }\n else {\n throw e\n }\n })\n }\n return doCopyFile(src, dest, stats)\n}\n\nfunction doCopyFile(src: string, dest: string, stats: Stats | null | undefined): Promise<any> {\n const promise = _nodeCopyFile(src, dest)\n if (stats == null) {\n return promise\n }\n\n return promise\n .then(() => chmod(dest, stats.mode))\n}\n\nexport class FileCopier {\n isUseHardLink: boolean\n\n constructor(private readonly isUseHardLinkFunction?: ((file: string) => boolean) | null, private readonly transformer?: FileTransformer | null) {\n if (isUseHardLinkFunction === USE_HARD_LINKS) {\n this.isUseHardLink = true\n }\n else {\n this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS\n }\n }\n\n async copy(src: string, dest: string, stat: Stats | undefined) {\n let afterCopyTransformer: AfterCopyFileTransformer | null = null\n if (this.transformer != null && stat != null && stat.isFile()) {\n let data = this.transformer(src)\n if (data != null) {\n if (typeof data === \"object\" && \"then\" in data) {\n data = await data\n }\n\n if (data != null) {\n if (data instanceof CopyFileTransformer) {\n afterCopyTransformer = data.afterCopyTransformer\n }\n else {\n await writeFile(dest, data)\n return\n }\n }\n }\n }\n\n const isUseHardLink = afterCopyTransformer == null && ((!this.isUseHardLink || this.isUseHardLinkFunction == null) ? this.isUseHardLink : this.isUseHardLinkFunction(dest))\n await copyOrLinkFile(src, dest, stat, isUseHardLink, isUseHardLink ? () => {\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 (this.isUseHardLink) {\n this.isUseHardLink = false\n return true\n }\n else {\n return false\n }\n } : null)\n\n if (afterCopyTransformer != null) {\n await afterCopyTransformer(dest)\n }\n }\n}\n\nexport interface CopyDirOptions {\n filter?: Filter | null\n transformer?: FileTransformer | null\n isUseHardLink?: ((file: string) => boolean) | null\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, options: CopyDirOptions = {}): Promise<any> {\n const fileCopier = new FileCopier(options.isUseHardLink, options.transformer)\n\n if (log.isDebugEnabled) {\n log.debug({src, destination}, `copying${fileCopier.isUseHardLink ? \" using hard links\" : \"\"}`)\n }\n\n const createdSourceDirs = new Set<string>()\n const links: Array<Link> = []\n return walk(src, options.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\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const DO_NOT_USE_HARD_LINKS = (file: string) => false\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const USE_HARD_LINKS = (file: string) => true\n\nexport interface Link {\n readonly link: string\n readonly file: string\n}"],"sourceRoot":""}