UNPKG

3.94 kBJavaScriptView Raw
1"use strict";
2/**
3* @输出处理后的工程文件
4* @param {String} options.outputType,当前的输出模式:debug,plain
5* @param {String} options.outputList,当前输出的文件列表数组
6*/
7const path = require('path');
8const fs = require('fs');
9const shelljs = require('shelljs');
10const escapeStringRegexp = require('escape-string-regexp');
11
12//lib自身组件
13const logger = require('jdf-log');
14const jdf = require('./jdf.js');
15const urlReplace = require('./urlReplace');
16const cssSprite = require('./cssSprite');
17const base64 = require('./base64');
18const compressScheduler = require('./compresser/compressScheduler');
19const buildCss = require('./buildCss');
20const buildHTML = require('./buildHTML');
21const buildHTMLDeep = require('./buildHTMLDeep');
22const buildOutputWidget = require('./buildOutputWidget');
23const buildES6 = require('./buildES6');
24const VFS = require('./VFS/VirtualFileSystem');
25const pluginCore = require('./pluginCore');
26
27module.exports.init = function (options) {
28 var outputType = options.outputType;
29
30 // 注册插件
31 pluginCore.addPluginFromConfiguration();
32
33 return Promise.resolve()
34 .then(() => {
35 logger.profile('plugin.beforeBuild');
36 return pluginCore.excuteBeforeBuild();
37 })
38 .then(() => {
39 logger.profile('plugin.beforeBuild');
40 return buildCss.init(options);
41 })
42 .then(() => {
43 if (jdf.config.widgetNesting) {
44 return buildHTMLDeep.init(options);
45 } else {
46 return buildHTML.init(options);
47 }
48 })
49 .then(() => {
50 buildES6.init();
51 })
52 .then(() => {
53 if (jdf.config.output.base64) {
54 return base64.init();
55 }
56 })
57 .then(() => {
58 if (jdf.config.output.cssSprite) {
59 cssSprite.init();
60 }
61 })
62 .then(() => {
63 return buildOutputWidget.init(options);
64 })
65 .then(() => {
66 return urlReplace.init(options);
67 })
68 .then(() => {
69 logger.profile('plugin.afterBuild');
70 return pluginCore.excuteAfterBuild();
71 })
72 .then(() => {
73 logger.profile('plugin.afterBuild');
74
75 logger.profile('delete build files');
76 shelljs.rm('-rf', jdf.outputDir);
77 logger.profile('delete build files');
78 })
79 .then(() => {
80 logger.profile('filter files');
81 let outputList = options.outputList;
82 if (!outputList || outputList.length === 0) {
83 return;
84 }
85
86 var filterPath = [];
87 return VFS.travel(vfile => {
88 let filepath = path.relative(VFS.originDir, vfile.originPath);
89 filepath = path.normalize(filepath);
90 let notFiltered = false;
91 for (let pattern of outputList) {
92 pattern = path.normalize(pattern);
93 let relativepath = path.relative(pattern, filepath);
94 let reg = new RegExp('^' + escapeStringRegexp('..' + path.sep));
95 if (!reg.test(relativepath)) {
96 notFiltered = true;
97 }
98 }
99 if (!notFiltered) {
100 filterPath.push(vfile.originPath);
101 }
102 }).then(()=> {
103 filterPath.forEach(filepath => {
104 VFS.deleteFile(filepath);
105 });
106 });
107 })
108 .then(() => {
109 logger.profile('filter files');
110
111 if(outputType !== 'debug' && outputType !== 'plain'){
112 logger.profile('delete temp files');
113 shelljs.rm("-Rf", jdf.transferDir);
114 logger.profile('delete temp files');
115
116 return VFS.writeFilesToDir(jdf.transferDir).then(() => {
117 return compressScheduler.init(jdf.transferDir, jdf.outputDir);
118 });
119
120 }else{
121 return VFS.writeFiles();
122 }
123 })
124 .then(() => {
125 logger.info('output success');
126 })
127 .catch(err => {
128 logger.error(err);
129 });
130}