-
Notifications
You must be signed in to change notification settings - Fork 1
/
save.js
58 lines (50 loc) · 1.75 KB
/
save.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
'use strict';
var utils = require('../utils');
module.exports = function (app) {
app.mixin('save', function (scaffolds, cb) {
var resolveDir = require('resolve-dir');
var FetchFiles = require('fetch-files');
var writeFile = require('write');
var path = require('path');
var name = scaffolds.get('name');
var base = path.join(resolveDir('~/.scaffolds'), name, scaffolds.get('version'));
scaffolds.option('cwd', base);
app.set(scaffolds.option('repo') || name, scaffolds);
var githubBase = utils.resolveGithubUri(scaffolds.get('repository'));
var downloader = new FetchFiles({destBase: base});
downloader.preset('github', {
url: githubBase,
fn: function (preset, config) {
var branch = utils.parseGithubUrl(preset.url).branch;
config.pathname = config.url;
config.url = path.join(branch, config.url);
return preset.url;
}
});
var targets = scaffolds.get('targets');
utils.reduce(targets, function (acc, target, name) {
target.files.forEach(function (file) {
file.src.forEach(function (src) {
downloader.queue(src, {preset: 'github', target: name});
});
});
return acc;
}, {});
var fp = path.join(base, 'manifest.json');
writeFile(fp, JSON.stringify(scaffolds, null, 2), function (err) {
if (err) return cb(err);
downloader.fetch(function (err, res) {
if (err) return cb(err);
utils.async.each(res, function (config, next) {
config.contents
.pipe(writeFile.stream(config.dest))
.on('error', next)
.on('finish', next);
}, function (err) {
if (err) return cb(err);
cb(null, scaffolds);
});
});
});
});
};