-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlock
More file actions
126 lines (94 loc) · 2.39 KB
/
lock
File metadata and controls
126 lines (94 loc) · 2.39 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
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
#!/usr/bin/env node
var fs = require('fs');
var bower = require('bower');
var bowerFile = fs.readFileSync('bower.json', 'utf-8');
var origBowerFile = JSON.parse(bowerFile);
var getDeps = bower.commands.list({json: true});
var help;
if (help = process.argv[1] && (help === '-h' || help === '--help')) {
console.log('usage: lock [-h|--help]');
console.log('');
console.log('Run this command from the root of any project using bower.');
console.log('');
}
function flattenVersions(arr) {
var versions = {};
arr.forEach(function(item) {
var keys = Object.keys(item);
keys.forEach(function(key) {
versions[key] = item[key];
});
});
return versions;
}
function get(obj, path) {
var parts = path.split('.');
var value = obj;
var key;
for (key of parts) {
if (typeof value !== 'object') {
return ;
}
value = value[key];
}
if (value !== obj) {
return value;
}
}
function getRelease(dep) {
var release = get(dep, 'pkgMeta._release');
var commit = get(dep, 'pkgMeta._resolution.commit');
if (commit && commit.indexOf(release) !== -1) {
return commit;
}
return release;
}
function resolveDeps(deps) {
var versions = {}, keys;
var innerVersions = [];
deps = deps.dependencies;
keys = Object.keys(deps);
keys.forEach(key => {
var dep = deps[key];
var name, source, release;
if (dep.missing) {
var msg = 'All dependencies have not been installed.\n' +
' Please run `bower install` to install the dependencies.';
throw new Error(msg);
}
if (dep.linked) {
var msg = 'Cannot run lock if a component is linked: ' + dep.endpoint.name;
throw new Error(msg);
}
name = dep.endpoint.name;
source = dep.endpoint.source;
release = getRelease(dep);
if (bowerFile.resolutions && bowerFile.resolutions[name]) {
bowerFile.resolutions[name] = release;
}
if (release) {
source += '#' + release;
}
versions[name] = source;
innerVersions.push(resolveDeps(dep));
});
innerVersions.unshift(versions);
return flattenVersions(innerVersions);
}
bowerFile = JSON.parse(bowerFile);
getDeps.on('end', function (deps) {
var versions;
var outText;
try {
versions = resolveDeps(deps);
} catch (e) {
console.log(e.stack);
process.exit(1);
}
bowerFile.dependencies = versions;
outText = JSON.stringify(bowerFile, null, 4);
fs.writeFileSync('bower.lock.json', outText);
});
getDeps.on('error', function(err) {
console.log(err);
});