weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
209 lines (192 loc) • 5.55 kB
JavaScript
const path = require('path');
const fs = require('fs');
const extraFS = require('fs-extra');
var jsonfile = require('jsonfile');
jsonfile.spaces = 4;
const ROOT = path.join(__dirname, '..');
const SOURCE = path.join(ROOT, 'src');
const TARGET = ROOT;
const PATTERN_NEXT = /^(@alife\/mqn|nuke)\-([^\/]+)(.*)$/;
const PATTERN_NODE_MODULES = /^node_modules/;
const NEXT_CORE = 'nuke-core';
const pkg = require(path.join(ROOT, 'package.json'));
const variables = {};
const addons = {
'index.js': ''
};
let core_addons = [];
module.exports = {
source: SOURCE,
// babel: {
// to: 'lib',
// from: 'src'
// },
target: {
path: TARGET,
redirect: function(relative) {
const 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: id => !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(f => path.join(TARGET, f)),
modules: [
{
match: PATTERN_NEXT,
main: ['lib/index.js', 'lib/index.jsx'],
docs: {
'README.md': {
target: (pathname, entry) => {
return `docs/${entry.name.replace(PATTERN_NEXT, '$2')}/index.md`;
}
},
'README.en.md': {
target: (pathname, entry) => {
return `docs/${entry.name.replace(PATTERN_NEXT, '$2')}/en.md`;
}
},
'HISTORY.md': {
target: (pathname, entry) => {
return `docs/${entry.name.replace(PATTERN_NEXT, '$2')}/HISTORY.md`;
}
},
'docs/*.md': {
target: (pathname, entry) => {
return `docs/${entry.name.replace(
PATTERN_NEXT,
'$2'
)}/demo/${path.basename(pathname)}`;
},
resolve: (id, entry) => {
return id;
},
combine: (id, name) => {
if (PATTERN_NEXT.test(id)) {
let 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: (pathname, entry) => {
return `demos/${entry.name.replace(PATTERN_NEXT, '$2')}`;
},
deps: (pathname, entry) => {
const pkg = require(path.join(entry.context, 'package.json'));
return Object.keys(pkg.devDependencies || {})
.filter(
name =>
PATTERN_NEXT.test(name) && name !== '@alife/nuke-demo-helper'
)
.map(name => name.replace(PATTERN_NEXT, '$2'));
}
}
}
],
listeners: {
//调整lib目录结构
transformed: (pathname, name) => {
const key = name.replace(PATTERN_NEXT, '$2');
if (name === NEXT_CORE) {
core_addons.push(pathname);
} else {
let relative;
let srcRelative = getRelative(
path.join(TARGET, 'index'),
pathname,
true
);
addons['index.js'] += `module.exports.${varCase(
key
)} = require('${srcRelative}');\n`;
}
},
//输出index.js引用
outputed: () => {
// write addons(root, entry)
for (let relative in addons) {
let 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) {
const relative = path.relative(path.dirname(from), to).replace(/\\/g, '/');
return isJS ? (relative[0] === '.' ? relative : './' + relative) : relative;
}
/*
* abc-xyz -> AbcXyz
*/
function varCase(str) {
let result = [];
for (let i = 0, l = str.length; i < l; i++) {
let 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('');
}
;