1 | Mincer = require("mincer")
|
2 | path = require("path")
|
3 | fs = require("fs")
|
4 | connect = require("connect")
|
5 | fu = require("./file-util.coffee")
|
6 | UglifyJS = require("uglify-js")
|
7 | CleanCSS = require("clean-css")
|
8 |
|
9 | module.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 |