1 | var prj = require('./project.js');
|
2 | var fs = require('fs');
|
3 | var path = require('path');
|
4 | var walk = require('./util/walk.js');
|
5 | var _ = require('underscore');
|
6 | var J = require("juicer");
|
7 | var conf = require('./config.js');
|
8 | var templateCenter = require('./template.js');
|
9 | var debug = require('debug')('widget');
|
10 |
|
11 | J.set("strip", false);
|
12 | var mkdirp = require('mkdirp');
|
13 |
|
14 | var config = {
|
15 | metaDir: '.clam',
|
16 | metaFile : 'widget.json',
|
17 | templateDir : "../resource/widget/",
|
18 | mainFile : 'index.js',
|
19 | mainCss : 'style.css'
|
20 | };
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | exports.list = function() {
|
31 | var prjInfo = prj();
|
32 |
|
33 | var widgetsDir = path.join(conf.root(), prjInfo.widgetsDir);
|
34 | var metaFile = path.join(conf.root(), config.metaDir, config.metaFile);
|
35 | var widgets = fs.readdirSync(widgetsDir);
|
36 |
|
37 |
|
38 | widgets = _.filter(widgets, function(file) {
|
39 | return fs.statSync(path.join(widgetsDir,file)).isDirectory()
|
40 | });
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | var metaInfo = {};
|
47 | try {
|
48 | var metaStr = fs.readFileSync(metaFile);
|
49 | metaInfo = JSON.parse(metaStr);
|
50 | } catch(e) {
|
51 | metaInfo = {};
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | var info = _.map(widgets, function(widgetName) {
|
58 | var description = metaInfo[widgetName] ? metaInfo[widgetName].description : '';
|
59 | return {
|
60 | name : widgetName,
|
61 | description : description
|
62 | };
|
63 | });
|
64 |
|
65 |
|
66 | return {succeed:true,
|
67 | msg:'获取模块信息',
|
68 | data:info
|
69 | };
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | exports.add = function(widgetName, description, template) {
|
86 | var prjInfo = prj();
|
87 | var actions = [];
|
88 |
|
89 |
|
90 | var widgetDirPath = path.join(conf.root(), prjInfo.widgetsDir, widgetName);
|
91 | if (fs.existsSync(widgetDirPath)) {
|
92 | return {
|
93 | succeed: false,
|
94 | msg: '已存在相同的组件,创建模块失败。',
|
95 | data: widgetDirPath
|
96 | };
|
97 | }
|
98 |
|
99 |
|
100 | mkdirp.sync(widgetDirPath);
|
101 |
|
102 |
|
103 | var widgetDepsdirs = widgetName.split('/');
|
104 | var dir = '', j = 0;
|
105 | for(var i = 0; i < widgetDepsdirs.length-1; i++){
|
106 | dir = path.join(conf.root(), prjInfo.widgetsDir);
|
107 | j = 0;
|
108 | while(j <= i ){
|
109 | dir = path.join(dir, widgetDepsdirs[j]);
|
110 | j++;
|
111 | }
|
112 | debug('修改目录权限%s', dir);
|
113 | fs.chmodSync(dir,'775');
|
114 | }
|
115 |
|
116 |
|
117 | if(!template){
|
118 | template = 'default';
|
119 | }
|
120 | var userHome = process.env.HOME || process.env.HOMEPATH;
|
121 | var templateDir = path.join(userHome, '.clamconfig/templates', template, 'widget');
|
122 | if(!fs.existsSync(templateDir)){
|
123 | return {
|
124 | succeed: false,
|
125 | msg: '模板'+template+'不存在',
|
126 | data: ''
|
127 | };
|
128 | }
|
129 |
|
130 |
|
131 | var widgetBaseName = path.basename(widgetName);
|
132 | var widgetInfo = {
|
133 | name: widgetBaseName,
|
134 | description: description
|
135 | };
|
136 | var param = {project: prjInfo, widget: widgetInfo};
|
137 | templateCenter.convert(templateDir, widgetDirPath, param, widgetBaseName);
|
138 |
|
139 |
|
140 | var metaInfo = conf.get('widget');
|
141 | if(!metaInfo){
|
142 | metaInfo = {};
|
143 | }
|
144 |
|
145 | metaInfo[widgetName] = widgetInfo;
|
146 | conf.set('widget', metaInfo);
|
147 |
|
148 | actions.push({action:'更新组件元信息', content: ''});
|
149 |
|
150 |
|
151 | return {
|
152 | succeed: true,
|
153 | msg: '组件创建',
|
154 | data: actions
|
155 | };
|
156 | }
|
157 |
|
158 |
|
159 |
|
160 |
|
161 | exports.del = function (data) {
|
162 | var prjInfo = prj();
|
163 | var dirName = data.name;
|
164 | var widgetDir = path.join(conf.root(), prjInfo.widgetsDir, dirName);
|
165 | var actions = [];
|
166 | if(!fs.existsSync(widgetDir)){
|
167 | return {
|
168 | succeed:false,
|
169 | msg:"文件不存在"
|
170 | }
|
171 | }
|
172 |
|
173 | walk.rmrfSync(widgetDir);
|
174 | actions.push({action:'删除文件目录', content: widgetDir});
|
175 |
|
176 | return {succeed:true,
|
177 | msg:'删除组件',
|
178 | data:actions
|
179 | };
|
180 |
|
181 | }
|
182 |
|
183 |
|
184 |
|
185 |
|
186 |
|
187 |
|
188 |
|