UNPKG

fkc

Version:

FKC application service framework.

196 lines 7.59 kB
'use strict'; 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; }; const index = obj.host[web].path[url+'index.html'] if(index){ obj.host[web].path[url] = {}; obj.host[web].path[url].file = index.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