1 | var _ = require("lodash");
|
2 | var cache = require("gulp-cached");
|
3 | var cfValidate = require("../../gulp-plugins/gulp-cf-validate");
|
4 | var cUtil = require("../util");
|
5 | var es = require("event-stream");
|
6 | var fs = require("fs-extra");
|
7 | var gulp = require("gulp");
|
8 | var gulpif = require("gulp-if");
|
9 | var gutil = require("gulp-util");
|
10 | var path = require("path");
|
11 | var rename = require("gulp-rename");
|
12 | var shortid = require("shortid");
|
13 | var through = require("through2");
|
14 | var url = require("url");
|
15 | var util = require("util");
|
16 | var VError = require("verror");
|
17 |
|
18 |
|
19 | module.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 |
|
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 | };
|