forked from vercel/pkg
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrefiner.js
More file actions
67 lines (56 loc) · 1.72 KB
/
refiner.js
File metadata and controls
67 lines (56 loc) · 1.72 KB
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
import { STORE_LINKS, retrieveDenominator,
substituteDenominator } from '../prelude/common.js';
import path from 'path';
const win32 = process.platform === 'win32';
function hasParent (file, records) {
const dirname = path.dirname(file);
if (dirname === file) return false; // root directory
return Boolean(records[dirname]);
}
function purgeTopDirectories (records) {
while (true) {
let found = false;
for (const file in records) {
const record = records[file];
const links = record[STORE_LINKS];
if (links && links.length === 1) {
if (!hasParent(file, records)) {
const file2 = path.join(file, links[0]);
const record2 = records[file2];
const links2 = record2[STORE_LINKS];
if (links2 && links2.length === 1) {
const file3 = path.join(file2, links2[0]);
const record3 = records[file3];
const links3 = record3[STORE_LINKS];
if (links3) {
delete records[file];
found = true;
}
}
}
}
}
if (!found) break;
}
}
function denominate (records, entrypoint, denominator) {
const newRecords = {};
for (const file in records) {
let snap = substituteDenominator(file, denominator);
if (win32) {
if (snap.slice(1) === ':') snap += '\\';
} else {
if (snap === '') snap = '/';
}
newRecords[snap] = records[file];
}
return {
records: newRecords,
entrypoint: substituteDenominator(entrypoint, denominator)
};
}
export default function (records, entrypoint) {
purgeTopDirectories(records);
const denominator = retrieveDenominator(Object.keys(records));
return denominate(records, entrypoint, denominator);
}