weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
185 lines (169 loc) • 5.45 kB
JavaScript
;
var path = require('path');
var fs = require('fs');
var extraFS = require('fs-extra');
var jsonfile = require('jsonfile');
jsonfile.spaces = 4;
var ROOT = path.join(__dirname, '..');
var SOURCE = path.join(ROOT, 'src');
var TARGET = ROOT;
var PATTERN_NEXT = /^(@alife\/mqn|nuke)\-([^\/]+)(.*)$/;
var PATTERN_NODE_MODULES = /^node_modules/;
var NEXT_CORE = 'nuke-core';
var pkg = require(path.join(ROOT, 'package.json'));
var variables = {};
var addons = {
'index.js': ''
};
var core_addons = [];
module.exports = {
source: SOURCE,
// babel: {
// to: 'lib',
// from: 'src'
// },
target: {
path: TARGET,
redirect: function redirect(relative) {
var srcRelative = relative;
relative = relative.replace(PATTERN_NODE_MODULES, 'lib/').replace(/nuke-([a-zA-Z0-9-]*)\/lib/, function (word) {
return varCase(word).replace('Nuke', '').replace('/lib', '');
});
if (relative.indexOf('/node_modules/') !== -1) {
throw new Error('请解决小包中的版本冲突!\n' + srcRelative);
}
return relative;
}
},
writeBack: true, //是否回写dependency,在新增组件时需注意无法回写首次添加的依赖【bug】
// exclude: Object.keys(pkg.devDependencies || {}),
exclude: function exclude(id) {
return !PATTERN_NEXT.test(id);
},
extensions: {
js: ['', '.jsx', '.js'],
css: ['.scss', '.css'],
html: ['.html', '.htm', '.tpl']
},
clear: ['lib', 'docs', 'demos', 'index.js', 'src/**/*/', 'src/index.js', 'dist', '__site'].map(function (f) {
return path.join(TARGET, f);
}),
modules: [{
match: PATTERN_NEXT,
main: ['lib/index.js', 'lib/index.jsx'],
docs: {
'README.md': {
target: function target(pathname, entry) {
return 'docs/' + entry.name.replace(PATTERN_NEXT, '$2') + '/index.md';
}
},
'README.en.md': {
target: function target(pathname, entry) {
return 'docs/' + entry.name.replace(PATTERN_NEXT, '$2') + '/en.md';
}
},
'HISTORY.md': {
target: function target(pathname, entry) {
return 'docs/' + entry.name.replace(PATTERN_NEXT, '$2') + '/HISTORY.md';
}
},
'docs/*.md': {
target: function target(pathname, entry) {
return 'docs/' + entry.name.replace(PATTERN_NEXT, '$2') + '/demo/' + path.basename(pathname);
},
resolve: function resolve(id, entry) {
return id;
},
combine: function combine(id, name) {
if (PATTERN_NEXT.test(id)) {
var cname = varCase(RegExp.$2);
if (cname == 'Mounter' || cname == 'Components') {
return null;
}
return {
name: cname,
group: 'weex-nuke'
};
}
return null;
}
}
},
theme: {
main: 'theme/index.jsx',
entryName: function entryName(pathname, entry) {
return 'demos/' + entry.name.replace(PATTERN_NEXT, '$2');
},
deps: function deps(pathname, entry) {
var pkg = require(path.join(entry.context, 'package.json'));
return Object.keys(pkg.devDependencies || {}).filter(function (name) {
return PATTERN_NEXT.test(name) && name !== '@alife/nuke-demo-helper';
}).map(function (name) {
return name.replace(PATTERN_NEXT, '$2');
});
}
}
}],
listeners: {
//调整lib目录结构
transformed: function transformed(pathname, name) {
var key = name.replace(PATTERN_NEXT, '$2');
if (name === NEXT_CORE) {
core_addons.push(pathname);
} else {
var relative = void 0;
var srcRelative = getRelative(path.join(TARGET, 'index'), pathname, true);
addons['index.js'] += 'module.exports.' + varCase(key) + ' = require(\'' + srcRelative + '\');\n';
}
},
//输出index.js引用
outputed: function outputed() {
// write addons(root, entry)
for (var relative in addons) {
var target = path.join(TARGET, relative);
// make sure dir is exists
if (!fs.existsSync(path.dirname(target))) {
fs.mkdirSync(path.dirname(target));
}
fs.writeFileSync(target, new Buffer(addons[relative]));
}
}
},
notice: {
dingtalk: ['https://oapi.dingtalk.com/robot/send?access_token=7e4ee95a82be5dbe989956b7e686ac79bd9e47a3c50d06c2181eb04a9d408f76']
},
switchs: {
buildDemo: true, //是否构建demo--用于配置平台
sassCheck: false, //是否进行sass-check--qnui非必须
buildDocs: true,
compatibility: {
//兼容性基线版本设置
qn: { ios: '5.8.2', android: '5.8.2', describe: {} },
tb: { ios: '6.4.1', android: '6.4.1', describe: {} },
tm: { ios: '5.28.2', android: '5.28.2', describe: {} }
}
}
};
function getRelative(from, to, isJS) {
var relative = path.relative(path.dirname(from), to).replace(/\\/g, '/');
return isJS ? relative[0] === '.' ? relative : './' + relative : relative;
}
/*
* abc-xyz -> AbcXyz
*/
function varCase(str) {
var result = [];
for (var i = 0, l = str.length; i < l; i++) {
var c = str[i];
if (c === '-') {
result.push(str[i + 1].toUpperCase());
i++;
continue;
}
result.push(c.toLowerCase());
}
if (result[0]) {
result[0] = result[0].toUpperCase();
}
return result.join('');
}