UNPKG

3.69 kBJavaScriptView Raw
1var _ = require("lodash");
2var cache = require("gulp-cached");
3var cfValidate = require("../../gulp-plugins/gulp-cf-validate");
4var cUtil = require("../util");
5var es = require("event-stream");
6var fs = require("fs-extra");
7var gulp = require("gulp");
8var gulpif = require("gulp-if");
9var gutil = require("gulp-util");
10var path = require("path");
11var rename = require("gulp-rename");
12var shortid = require("shortid");
13var through = require("through2");
14var url = require("url");
15var util = require("util");
16var VError = require("verror");
17
18
19module.exports = function(s3opts,distPath,awsS3) {
20 var self = this;
21
22 var templateData = {};
23 var urlString = [awsS3.endpoint.href,path.posix.join(s3opts.aws.bucket,s3opts.prefix)].join('');
24
25 templateData.s3 = s3opts.aws;
26 templateData.s3.prefix = s3opts.prefix;
27 templateData.s3.condensationUrl = url.parse(urlString);
28
29 templateData.buildId = shortid.generate();
30
31 var stream = es.readable(function(esCount,streamCb) {
32 var readable = this;
33
34 var totalCount = 0;
35 var lastTotalCount = 0;
36
37 var runStreams = function(globs,options) {
38 var s = gulp.src(globs,options)
39 .pipe(cache(self.options.projectName+distPath))
40 .pipe(gulpif(/\.hbs$/,through.obj(function(file,enc,cb) {
41 cUtil.processFrontMatter.call(self, file, templateData, function(err, matter) {
42 var fn = self.handlebars.compile(matter.content,{noEscape:true});
43 var templatePath = file.relative.replace(/\.hbs$/,"");
44 try {
45 file.contents = new Buffer(fn(
46 _.merge(matter.data, templateData),
47 {data: {_file: file, _templatePath: templatePath}}
48 ));
49 }
50 catch(e) {
51 var ve = new VError(e,"TemplateError %s",file.relative);
52 throw(ve.message);
53 }
54 cb(null,file);
55 });
56 })))
57 .pipe(through.obj(function(file,enc,cb) {
58 totalCount = totalCount + 1;
59 readable.emit('data',file);
60 cb(null,file);
61 }));
62 s.on('data',function(){});
63 s.on('end',function(err) {
64 if (lastTotalCount === totalCount) {
65 readable.emit('end');
66 streamCb();
67 }
68 else {
69 var paths = _.invokeMap(
70 self.particleLoader.processablePaths(),
71 function() {
72 return this+"?(.hbs)";
73 }
74 );
75
76 lastTotalCount = totalCount;
77 runStreams(paths,{base:self.options.root});
78 }
79 });
80 };
81
82 runStreams(
83 [
84 "particles/cftemplates/**/*.json",
85 "particles/cftemplates/**/*.template",
86 "particles/cftemplates/**/*.hbs"
87 ],
88 {cwd:self.options.root,base:self.options.root}
89 );
90
91 });
92
93
94 var parseTemplate = through.obj(function(file,enc,cb) {
95 var error;
96 if (file.isNull()) {
97 //Do Nothing for now
98 }
99 else {
100 try {
101 var formatted = JSON.stringify(JSON.parse(file.contents.toString()), null, 2);
102 file.contents = new Buffer(formatted);
103 }
104 catch(e) {
105 e.message = "File " + file.path + " is not valid JSON. " + e.message;
106 fs.outputFileSync(path.join('condensation_errors',file.path),file.contents);
107 error = new gutil.PluginError('build',e);
108 }
109 }
110 cb(error,file);
111 });
112
113 var doValidate = function(file) {
114 return (file.path.match(/cftemplates[\/\\]/) && (process.env.FORCE_VALIDATE || s3opts.validate))
115 }
116
117 stream = stream
118 .pipe(gulpif(/\.hbs$/,rename({extname:""})))
119 .pipe(gulpif(/cftemplates[\/\\]/,parseTemplate))
120 .pipe(gulpif(doValidate,cfValidate({region: s3opts.aws.region})))
121 .pipe(gulp.dest(distPath))
122
123 return stream;
124};