-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathprepare.js
127 lines (103 loc) · 3 KB
/
prepare.js
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const pathMap = new Map();
class FileTree {
constructor() {
this.map = new Map();
}
add(file) {
const path = getPath(file);
if (this.map.has(path)) {
return this.map.get(path);
}
const self = {
path,
ownership: null,
children: []
};
this.map.set(path, self);
Object.defineProperty(self, 'tree', {
value: this
});
if (path.parent) {
this.add(path.parent.path)
.children.push(self);
}
return self;
}
get(path) {
return this.map.get(getPath(path));
}
}
function normalizePath(path) {
path = pathUtils.normalize(path);
return path === '.' ? '' : path;
}
function getPath(path = '') {
if (!pathMap.has(path)) {
const normalized = normalizePath(path);
if (normalized !== path) {
pathMap.set(path, getPath(normalized));
} else {
const parentPath = normalizePath(pathUtils.dirname(normalized));
let parent = null;
if (parentPath !== normalized) {
parent = getPath(parentPath);
}
pathMap.set(path, {
parent,
name: pathUtils.basename(path),
path
});
}
}
return pathMap.get(path);
}
function getProjectOwnership(projectMap, pathRef) {
if (!projectMap.has(pathRef)) {
if (pathRef.parent && pathRef.parent.name !== 'node_modules') {
const inherit = getProjectOwnership(projectMap, pathRef.parent);
projectMap.set(pathRef, {
owner: inherit.owner
});
} else {
projectMap.set(pathRef, {
owner: null
});
}
}
return projectMap.get(pathRef);
}
discovery.setPrepare(function(data) {
data.forEach(item => {
const { files, ownership } = item;
const tree = new FileTree();
const ownershipMap = new Map();
ownership.forEach(({ path, owner }) =>
ownershipMap.set(getPath(path), { id: true, owner: { name: owner } })
);
['', ...files].forEach(path =>
tree.add(path).ownership = getProjectOwnership(ownershipMap, getPath(path))
);
discovery.query('..children.[no ownership]', tree.get('.'))
.forEach(leaf => leaf.ownership = getProjectOwnership(ownershipMap, leaf.path));
item.tree = tree;
});
const projectIndex = data.reduce(
(map, item) => map
.set(item, item)
.set(item.project, item),
new Map()
);
discovery.addEntityResolver(value => {
if (value) {
value = projectIndex.get(value) || projectIndex.get(value.project);
}
if (value) {
return {
type: 'project',
id: value.project,
name: value.project,
entity: value
};
}
});
});