UNPKG

3.31 kBtext/coffeescriptView Raw
1Mincer = require("mincer")
2path = require("path")
3fs = require("fs")
4connect = require("connect")
5fu = require("./file-util.coffee")
6UglifyJS = require("uglify-js")
7CleanCSS = require("clean-css")
8
9module.exports = class EasyMincer
10
11 constructor: (file) ->
12 console.log("config: #{file}")
13 @config = require(file)
14 @config.mainDir = path.dirname(file)
15 @config.destDir = @config.mainDir + "/dest"
16 @config.manifestDir = @config.mainDir + "/manifest"
17
18 @environment = new Mincer.Environment(@config.mainDir)
19 targets = @config.paths
20 for target in targets
21 @environment.appendPath(target);
22 console.log(" appendPath:[#{target}]")
23
24 start: () ->
25 Mincer.logger.use({
26 warn: console.warn
27 error: console.error
28 })
29 @app = connect()
30 @app.use("/", Mincer.createServer(@environment))
31 @app.listen(3000, (err) ->
32 if err
33 console.error("Failed start server: " + (err.message || err.toString()));
34 process.exit(128)
35
36 console.info("Listening on localhost:3000");
37 )
38
39 compile: () ->
40
41 fu.clean(@config.destDir, false)
42 fu.clean(@config.manifestDir, false)
43
44 assetsData = @_manifest()
45 destFiles = @_export(assetsData)
46
47 return {
48 destFiles: destFiles
49 assetsData: assetsData
50 }
51
52 _manifest: () ->
53 if not(fs.existsSync(@config.manifestDir))
54 fs.mkdirSync(@config.manifestDir)
55
56 manifest = new Mincer.Manifest(@environment, @config.manifestDir)
57 try
58 assetsData = manifest.compile(@config.targets, {
59 compress: true,
60 sourceMaps: true,
61 embedMappingComments: true
62 });
63
64 console.info("""
65 Assets were successfully compiled.
66 Manifest data (a proper JSON) was written to:
67 manifest.path
68
69 """)
70 console.dir(assetsData)
71 return assetsData
72 catch err
73 console.error("Failed compile assets: " + (err.message || err.toString()))
74 throw err
75
76 _export: (assetsData) ->
77 destFiles = []
78 if not(fs.existsSync(@config.destDir))
79 fs.mkdirSync(@config.destDir)
80
81 for target in @config.targets
82 dest = @_dest(assetsData, target)
83 minify = @_minify(dest)
84 fs.writeFileSync(minify.file, minify.code)
85 destFiles.push(dest.file)
86 console.info("export #{dest.file}")
87 console.info("export #{minify.file}")
88
89 return destFiles
90
91 _dest: (assetsData, target) ->
92
93 if not(assetsData.assets[target]?)
94 throw new Error("manifest not export #{target}.")
95
96 file = "#{@config.destDir}/#{target}"
97 code = fs.readFileSync("#{@config.manifestDir}/#{assetsData.assets[target]}")
98 fs.writeFileSync(file, code)
99 return {
100 file: file
101 code: code
102 }
103
104 _minify: (dest) ->
105 extIndex = dest.file.lastIndexOf(".")
106 ext = dest.file.slice(extIndex + 1)
107 writeFile = dest.file.slice(0, extIndex) + ".min." + ext
108 code = null
109 switch ext
110 when "js"
111 code = @_minifyJS(dest.file)
112 when "css"
113 code = @_minifyCSS(dest.file)
114 else
115 throw new Error("Failed minify compile #{writeFile} file has not extension.")
116
117 return {
118 file: writeFile
119 code: code
120 }
121
122 _minifyJS: (readFile) ->
123 UglifyJS.minify(readFile).code
124
125 _minifyCSS: (readFile) ->
126 new CleanCSS().minify(fs.readFileSync(readFile))
\No newline at end of file