/
addFilesFromDir.ts
77 lines (73 loc) · 2.32 KB
/
addFilesFromDir.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { promises as fs } from 'fs'
import path from 'path'
import {
DeferredManifestPromise,
FilesIndex,
FileWriteResult,
} from '@pnpm/fetcher-base'
import gfs from '@pnpm/graceful-fs'
import pLimit from 'p-limit'
import { parseJsonBuffer } from './parseJson'
const limit = pLimit(20)
const MAX_BULK_SIZE = 1 * 1024 * 1024 // 1MB
export default async function (
cafs: {
addStream: (stream: NodeJS.ReadableStream, mode: number) => Promise<FileWriteResult>
addBuffer: (buffer: Buffer, mode: number) => Promise<FileWriteResult>
},
dirname: string,
manifest?: DeferredManifestPromise
): Promise<FilesIndex> {
const index: FilesIndex = {}
await _retrieveFileIntegrities(cafs, dirname, dirname, index, manifest)
if (manifest && !index['package.json']) {
manifest.resolve(undefined)
}
return index
}
async function _retrieveFileIntegrities (
cafs: {
addStream: (stream: NodeJS.ReadableStream, mode: number) => Promise<FileWriteResult>
addBuffer: (buffer: Buffer, mode: number) => Promise<FileWriteResult>
},
rootDir: string,
currDir: string,
index: FilesIndex,
deferredManifest?: DeferredManifestPromise
) {
try {
const files = await fs.readdir(currDir)
await Promise.all(files.map(async (file) => {
const fullPath = path.join(currDir, file)
const stat = await fs.stat(fullPath)
if (stat.isDirectory()) {
await _retrieveFileIntegrities(cafs, rootDir, fullPath, index)
return
}
if (stat.isFile()) {
const relativePath = path.relative(rootDir, fullPath)
const writeResult = limit(async () => {
if ((deferredManifest != null) && rootDir === currDir && file === 'package.json') {
const buffer = await gfs.readFile(fullPath)
parseJsonBuffer(buffer, deferredManifest)
return cafs.addBuffer(buffer, stat.mode)
}
if (stat.size < MAX_BULK_SIZE) {
const buffer = await gfs.readFile(fullPath)
return cafs.addBuffer(buffer, stat.mode)
}
return cafs.addStream(gfs.createReadStream(fullPath), stat.mode)
})
index[relativePath] = {
mode: stat.mode,
size: stat.size,
writeResult,
}
}
}))
} catch (err: any) { // eslint-disable-line
if (err.code !== 'ENOENT') {
throw err
}
}
}