@pnpm/directory-fetcher
Advanced tools
Comparing version 5.0.0 to 5.1.0
import type { DirectoryFetcher, DirectoryFetcherOptions } from '@pnpm/fetcher-base'; | ||
export interface CreateDirectoryFetcherOptions { | ||
includeOnlyPackageFiles?: boolean; | ||
resolveSymlinks?: boolean; | ||
} | ||
@@ -5,0 +6,0 @@ export declare function createDirectoryFetcher(opts?: CreateDirectoryFetcherOptions): { |
@@ -15,3 +15,4 @@ "use strict"; | ||
function createDirectoryFetcher(opts) { | ||
const fetchFromDir = opts?.includeOnlyPackageFiles ? fetchPackageFilesFromDir : fetchAllFilesFromDir; | ||
const readFileStat = opts?.resolveSymlinks === true ? realFileStat : fileStat; | ||
const fetchFromDir = opts?.includeOnlyPackageFiles ? fetchPackageFilesFromDir : fetchAllFilesFromDir.bind(null, readFileStat); | ||
const directoryFetcher = (cafs, resolution, opts) => { | ||
@@ -30,7 +31,8 @@ const dir = path_1.default.join(opts.lockfileDir, resolution.directory); | ||
} | ||
return fetchAllFilesFromDir(dir, opts); | ||
const readFileStat = opts?.resolveSymlinks === true ? realFileStat : fileStat; | ||
return fetchAllFilesFromDir(readFileStat, dir, opts); | ||
} | ||
exports.fetchFromDir = fetchFromDir; | ||
async function fetchAllFilesFromDir(dir, opts) { | ||
const filesIndex = await _fetchAllFilesFromDir(dir); | ||
async function fetchAllFilesFromDir(readFileStat, dir, opts) { | ||
const filesIndex = await _fetchAllFilesFromDir(readFileStat, dir); | ||
if (opts.manifest) { | ||
@@ -49,3 +51,3 @@ // In a regular pnpm workspace it will probably never happen that a dependency has no package.json file. | ||
} | ||
async function _fetchAllFilesFromDir(dir, relativeDir = '') { | ||
async function _fetchAllFilesFromDir(readFileStat, dir, relativeDir = '') { | ||
const filesIndex = {}; | ||
@@ -56,18 +58,8 @@ const files = await fs_1.promises.readdir(dir); | ||
.map(async (file) => { | ||
const filePath = path_1.default.join(dir, file); | ||
let stat; | ||
try { | ||
stat = await fs_1.promises.stat(filePath); | ||
} | ||
catch (err) { // eslint-disable-line @typescript-eslint/no-explicit-any | ||
// Broken symlinks are skipped | ||
if (err.code === 'ENOENT') { | ||
directoryFetcherLogger.debug({ brokenSymlink: filePath }); | ||
return; | ||
} | ||
throw err; | ||
} | ||
const { filePath, stat } = await readFileStat(path_1.default.join(dir, file)); | ||
if (!filePath) | ||
return; | ||
const relativeSubdir = `${relativeDir}${relativeDir ? '/' : ''}${file}`; | ||
if (stat.isDirectory()) { | ||
const subFilesIndex = await _fetchAllFilesFromDir(filePath, relativeSubdir); | ||
const subFilesIndex = await _fetchAllFilesFromDir(readFileStat, filePath, relativeSubdir); | ||
Object.assign(filesIndex, subFilesIndex); | ||
@@ -81,2 +73,37 @@ } | ||
} | ||
async function realFileStat(filePath) { | ||
let stat = await fs_1.promises.lstat(filePath); | ||
if (!stat.isSymbolicLink()) { | ||
return { filePath, stat }; | ||
} | ||
try { | ||
filePath = await fs_1.promises.realpath(filePath); | ||
stat = await fs_1.promises.stat(filePath); | ||
return { filePath, stat }; | ||
} | ||
catch (err) { // eslint-disable-line @typescript-eslint/no-explicit-any | ||
// Broken symlinks are skipped | ||
if (err.code === 'ENOENT') { | ||
directoryFetcherLogger.debug({ brokenSymlink: filePath }); | ||
return { filePath: null, stat: null }; | ||
} | ||
throw err; | ||
} | ||
} | ||
async function fileStat(filePath) { | ||
try { | ||
return { | ||
filePath, | ||
stat: await fs_1.promises.stat(filePath), | ||
}; | ||
} | ||
catch (err) { // eslint-disable-line @typescript-eslint/no-explicit-any | ||
// Broken symlinks are skipped | ||
if (err.code === 'ENOENT') { | ||
directoryFetcherLogger.debug({ brokenSymlink: filePath }); | ||
return { filePath: null, stat: null }; | ||
} | ||
throw err; | ||
} | ||
} | ||
async function fetchPackageFilesFromDir(dir, opts) { | ||
@@ -83,0 +110,0 @@ const files = await (0, npm_packlist_1.default)({ path: dir }); |
{ | ||
"name": "@pnpm/directory-fetcher", | ||
"version": "5.0.0", | ||
"version": "5.1.0", | ||
"description": "A fetcher for local directory packages", | ||
@@ -37,6 +37,7 @@ "funding": "https://opencollective.com/pnpm", | ||
"devDependencies": { | ||
"@pnpm/directory-fetcher": "5.0.0", | ||
"@pnpm/directory-fetcher": "5.1.0", | ||
"@pnpm/test-fixtures": "0.0.26", | ||
"@types/npm-packlist": "^3.0.0", | ||
"@types/ramda": "0.28.15" | ||
"@types/ramda": "0.28.15", | ||
"@zkochan/rimraf": "^2.1.2" | ||
}, | ||
@@ -43,0 +44,0 @@ "exports": { |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
12345
134
5