fkc
Version:
FKC application service framework.
192 lines (191 loc) • 7.36 kB
JavaScript
;
function Router(obj, web) {
const path = require('path');
const { repAll } = require('../util');
let method = require('../json/methods');
const error = require('../json/error');
const { isDir, getFile } = require('../fs');
const { str, def: isDef, reg: isReg } = require('../type');
let mts = {}
mts.use = (...def) => {
if (def.length > 0) {
if (!obj.host[web].use) obj.host[web].use = []
for (let i = 0; i < def.length; i++) {
if (!isDef(def[i])) obj.err = error.use;
obj.host[web].use.push(def[i]);
};
}
}
mts.arg = (name, def) => {
if (str(name) && isDef(def)) {
if (!obj.host[web].arg) obj.host[web].arg = {};
obj.host[web].arg[name] = def;
} else {
obj.arr = 'Add ' + error.arg[1];
}
}
mts.html = (...arg) => {
if (arg.length > 0) {
let url;
let paths;
if (arg.length == 1) paths = arg[0];
if (arg.length > 1) {
url = arg[0];
paths = arg[1];
}
if (isDir(paths)) {
const fs = require('fs');
const mine = require('../json/mine');
const extArr = require('../json/extArr');
const arr = getFile(paths);
for (let i = 0; i < arr.length; i++) {
let file = {};
let urls = arr[i];
if (url && url !== '/') urls = url + urls;
const ext = path.extname(urls);
if (!obj.host[web].path[urls]) obj.host[web].path[urls] = {};
file.type = mine(ext);
if (extArr.includes(ext)) {
file.data = fs.readFileSync(paths + arr[i]);
} else {
file.url = paths + arr[i];
}
obj.host[web].path[urls].file = file;
};
} else {
obj.err = error.file + ': ' + paths
}
}
}
mts.html5 = mts.html;
const mdArr = ['static', 'file'];
const methods = method.concat(mdArr);
const errUrl = (url) => { obj.err = error.arg[0] + ' url: ' + url; }
const isUrl = (url) => {
if (url === '*' || url === '/') return true;
if (!str(url) && !isReg(url)) {
errUrl(url);
return false;
}
if (str(url)) {
if (url[0] !== '/') {
errUrl(url);
return false;
}
return true;
}
return true;
};
const routes = (md,url,use)=>{
if (!obj.host[web].path[url]) obj.host[web].path[url] = {};
if (!obj.host[web].path[url][md]) {
obj.host[web].path[url][md] = { code: [] };
} else {
use = [...obj.host[web].path[url][md].code, ...use];
}
obj.host[web].path[url][md].code = use;
}
const addCode = (md,url,use,dir) => {
if(dir){
if (isDir(dir)) {
if(mdArr.includes(md)){
if (url == '*') url = '/';
if (str(url)) {
url = url.replace('/', '^/');
if (url !== '^/') {
url += '/(.*)';
} else {
url += '(.*)';
}
url = new RegExp(url);
} else {
obj.err = error.arg[1] + ': ' + url;;
}
if (isReg(url)) {
if (!obj.host[web].reg) obj.host[web].reg = [];
obj.host[web].reg.push(url);
}
let file = {dir};
if(md == 'static') file.html = true;
if (!obj.host[web].path[url]) obj.host[web].path[url] = {};
obj.host[web].path[url].file = file;
}else{
const arr = getFile(dir);
const str = (n) => { return n.split('').reverse().join(''); };
for (let i = 0; i < arr.length; i++) {
const ext = path.extname(arr[i]);
if (ext === '.js' || ext === '.ts') {
let urls = str(str(arr[i]).replace(str(ext), ''));
if (url !== '/') urls = url + urls;
arr[i] = path.resolve(process.cwd(), dir + arr[i]);
const uses = require(arr[i]);
if (uses.main && isDef(uses.main)) routes(md, urls, [...use, uses.main]);
}
};
}
} else {
obj.err = error.file;
}
}else{
let res;
if (str(url)&&url!== '*'&&!mdArr.includes(md)) {
if (url.includes('*') && !url.includes(':')) url = repAll('*', url);
if (!isReg(url) && !url.includes('*') && url.includes(':')) {
res = repAll(':', url);
url = res.url
}
}
if (isReg(url)) {
if (!obj.host[web].reg) obj.host[web].reg = [];
obj.host[web].reg.push(url);
}
routes(md,url,use);
if (res && res.reg) obj.host[web].path[url][md].reg = res.reg;
}
}
for (let i = 0; i < methods.length; i++) {
const md = methods[i];
mts[md] = (...args) => {
if (args.length == 0) {
obj.err = error.arg[0] + ' method: ' + md;
return;
}
if (args.length == 1) {
if (str(args[0]) && !isDir(args[0])) {
obj.err = error.arg[1] + ' : ' + args[0];
return;
}
args.unshift('/');
}
if (args.length >1&&!str(args[0])&&!isReg(args[0])) args.unshift('/');
let dir;
let is = 0;
let use = [];
let url = args[0];
if (!isUrl(url)) return;
for (let i = 0; i < args.length; i++) {
if (isDef(args[i]) && is === 0) use.push(args[i]);
if (i > 0) {
if (is === 1) {
obj.err = error.arg[1] + ' : ' + args[i];
return;
} else {
if (str(args[i])) {
is++
if (!isDir(args[i])) {
obj.err = error.arg[1] + ' : ' + args[i];
return;
} else {
dir = args[i];
}
}
}
}
};
addCode(md,url,use,dir);
return mts;
}
};
return mts
}
module.exports = Router