UNPKG

3.63 kBJavaScriptView Raw
1var fs = require('fs');
2var toSource = require('tosource');
3var UglifyJS = require("uglify-js");
4var Ctx = require("./util/context");
5var path = require("path");
6var minimatch = require("minimatch");
7var recursive = require("./util/recursive");
8var ncp = require('ncp').ncp;
9var Pack = require("./pack");
10
11var Compiler = function (cfg) {
12
13 var cfgs = {};
14 var dir = fs.realpathSync(".");
15 cfg.path = dir;
16 if (!cfg) {
17 cfg = require(dir + path.sep + "tahoe.json");
18 }
19 cfgs[dir] = cfg;
20
21 var filterSchema = function(schema, deps) {
22 var copy = {};
23 for (var blk in schema) {
24 if (checkInclude(blk) && checkExclude(blk)) {
25 copy[blk] = schema[blk];
26 for (var d = 0; d < deps[blk].length; d++) {
27 var n = deps[blk][d];
28 if (!copy[n]) copy[n] = schema[n];
29 }
30 }
31 }
32 return copy;
33 };
34
35 var checkInclude = function(blk) {
36 if (!cfg.tahoe.client.include) return true;
37 for (var ind = 0; ind < cfg.tahoe.client.include.length; ind++) {
38 if (minimatch(blk, cfg.tahoe.client.include[ind])) {
39 return true;
40 }
41 }
42 return false;
43 };
44
45 var checkExclude = function(blk) {
46 if (!cfg.tahoe.client.exclude) return true;
47 for (var ind = 0; ind < cfg.tahoe.client.exclude.length; ind++) {
48 if (minimatch(blk, cfg.tahoe.client.exclude[ind])) {
49 return false;
50 }
51 }
52 return true;
53 };
54
55 this.compile = function(cb) {
56 try {
57 _compile();
58 cb(null);
59 } catch(e) {
60 cb(e);
61 }
62 };
63
64 var _compile = function () {
65 cfg.tahoe.destDir = cfg.tahoe.destDir||"dest";
66 if (!fs.existsSync(cfg.tahoe.destDir)) fs.mkdirSync(cfg.tahoe.destDir);
67 var pubDir = path.join(cfg.tahoe.destDir, "public");
68 if (!fs.existsSync(pubDir)) fs.mkdirSync(pubDir);
69
70 var rootPack = new Pack(cfg);
71 var ctx = {};
72 rootPack.schema(ctx);
73
74 var cont = fs.readFileSync(__dirname + '/util/context.js');
75 var source = toSource(ctx.schema);
76 var data = cont + "Ctx.schema = " + source;
77 if (cfg.tahoe.minify) data = UglifyJS.minify(data, {fromString: true}).code;
78 fs.writeFileSync(path.join(cfg.tahoe.destDir, cfg.tahoe.name + "-schema.js"), data);
79
80 if (cfg.tahoe.client) {
81 source = toSource(filterSchema(ctx.schema, ctx.deps));
82 data = cont + "Ctx.schema = " + source;
83 if (cfg.tahoe.minify) data = UglifyJS.minify(data, {fromString: true}).code;
84 fs.writeFileSync(path.join(pubDir, cfg.tahoe.name + "-schema-client.js"), data);
85 }
86
87 var css = rootPack.css();
88 if (css && css.length > 0) fs.writeFileSync(path.join(pubDir, cfg.tahoe.name + ".css"), css);
89
90 var js = rootPack.js();
91 if (cfg.tahoe.minify) {
92 js = UglifyJS.minify(js, {fromString: true}).code;
93 }
94 if (js && js.length > 0) fs.writeFileSync(path.join(pubDir, cfg.tahoe.name + "-client.js"), js);
95
96
97 rootPack.publicDirs().forEach(function(f) {
98 ncp(f, pubDir);
99 });
100 };
101
102 this.getContext = function(cb) {
103 schemaCompiler(cfg, function(err, ctx) {
104 if (err) return cb(err);
105 Ctx.schema = ctx.schema;
106 cb(null, Ctx);
107 });
108 };
109};
110
111module.exports = Compiler;
112
113
114