UNPKG

4.99 kBJavaScriptView Raw
1var prj = require('./project.js');
2var fs = require('fs');
3var path = require('path');
4var walk = require('./util/walk.js');
5var _ = require('underscore');
6var J = require("juicer");
7var conf = require('./config.js');
8var templateCenter = require('./template.js');
9var debug = require('debug')('widget');
10
11J.set("strip", false);
12var mkdirp = require('mkdirp');
13
14var config = {
15 metaDir: '.clam',
16 metaFile : 'widget.json',
17 templateDir : "../resource/widget/",
18 mainFile : 'index.js',
19 mainCss : 'style.css'
20};
21
22/**
23 * 返回widgetDir中所有的组件,组件是平的,只有一级。
24 * 组件根据目录名列出
25 * 目录结构如下:
26 * widgets/a/index.js
27 * widgets/a/style.css
28 *
29 */
30exports.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 //获取widgets目录下所有文件夹
38 widgets = _.filter(widgets, function(file) {
39 return fs.statSync(path.join(widgetsDir,file)).isDirectory()
40 });
41
42 //console.log(widgets);
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 //console.log(metaInfo);
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 * 组件目录结构是单层的,只要有一个文件夹以及主js文件,以及可选的样式文件即可
76 *
77 * 创建的组件如果有额外信息,需要记录到.clam/widget.json中
78 * 创建的组件,需要有额外注释,描述组件名。
79 * {
80 * name:"",
81 * description:"",
82 * addcss:true
83 * }
84 */
85exports.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 //创建模块HTML文件目录
100 mkdirp.sync(widgetDirPath);
101
102 //修改目录权限为775
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;//兼容windows
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 */
161exports.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/*
183function writeFile(path,str){
184 var prjInfo = prj();
185 var c = iconv.encode(str,prjInfo.charset[0]);
186 fs.writeFileSync(path, c);
187 fs.chmodSync(path, "777");
188}*/