UNPKG

f2e-server3

Version:

f2e-server 3.0

142 lines (141 loc) 5.47 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderHTML = exports.template = exports.isPlainObject = exports.set = exports.get = exports.queryparams = exports.ServerIP = exports.toBuffer = exports.decode = exports.isText = exports.getMimeType = exports.minimatch = exports.createSessionId = exports.pathname_dirname = exports.pathname_fixer = exports.pathname_arr = exports.REG_FILENAME = void 0; const logger_1 = __importDefault(require("./logger")); const node_os_1 = require("node:os"); const mime_1 = __importDefault(require("./mime")); const templates_1 = require("./templates"); exports.REG_FILENAME = /[^\\/,\s\t\n]+/g; const pathname_arr = (str = '') => (str.split(/[#?]+/)[0].replace(/^\.+\//, '').match(exports.REG_FILENAME) || []); exports.pathname_arr = pathname_arr; const pathname_fixer = (str = '') => (0, exports.pathname_arr)(str).join('/'); exports.pathname_fixer = pathname_fixer; const pathname_dirname = (str = '') => (str.match(exports.REG_FILENAME) || []).slice(0, -1).join('/'); exports.pathname_dirname = pathname_dirname; const createSessionId = () => 'xxxx-xxxx-xxxx-xxxx'.replace(/xxxx/g, () => Math.floor((1 << 16) + Math.random() * (1 << 24)).toString(16).substring(0, 4)); exports.createSessionId = createSessionId; const minimatch = (str = '', pattern = '') => { const reg = new RegExp(pattern.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/,/g, '|')); return reg.test(str); }; exports.minimatch = minimatch; const getMimeType = (pathname) => { const suffix = (pathname || '').split('.').pop() || ''; return mime_1.default.getType(suffix) || 'application/octet-stream'; }; exports.getMimeType = getMimeType; const isText = (pathname) => { const type = (0, exports.getMimeType)(pathname); return /\b(html?|txt|javascript|json)\b/.test(type || 'exe'); }; exports.isText = isText; const decode = (str) => { try { return decodeURIComponent(str); } catch (e) { logger_1.default.warn(e); return str; } }; exports.decode = decode; const toBuffer = function (arrayBuffer) { const buffer = Buffer.alloc(arrayBuffer.byteLength); const arrayBufferView = new Uint8Array(arrayBuffer); for (let i = 0; i < arrayBufferView.length; i++) { buffer[i] = arrayBufferView[i]; } return buffer; }; exports.toBuffer = toBuffer; exports.ServerIP = (Object.entries((0, node_os_1.networkInterfaces)()) .find(([__, info]) => info?.filter((t) => t.family === 'IPv4' && !t.internal)[0])?.[1]?.filter((t) => t.family === 'IPv4' && !t.internal)[0] || { address: '127.0.0.1' }).address; const queryparams = (search) => { const searchParams = new URLSearchParams(search); const params = {}; searchParams.forEach((v, k) => { if (params[k]) { params[k] = [].concat(params[k]).concat(v); } else { params[k] = v; } }); return params; }; exports.queryparams = queryparams; const get = function loopGet(obj, path) { const [key, ...rest] = path.toString().match(exports.REG_FILENAME) || []; if (!key || !obj) { return obj; } if (rest.length === 0) { return obj[key]; } return loopGet(obj[key], rest); }; exports.get = get; const set = function loopSet(obj, path, value) { const [key, ...rest] = path.toString().match(exports.REG_FILENAME) || []; if (!key) return; if (rest.length === 0) { Object.assign(obj, { [key]: value }); } else { if (!obj[key]) { obj[key] = {}; } loopSet(obj[key], rest, value); } }; exports.set = set; const isPlainObject = function (value) { if (!value || typeof value != 'object') { return false; } return Object.prototype.toString.call(value) === '[object Object]'; }; exports.isPlainObject = isPlainObject; /** 简单字符串模板,类似 handlebars */ const template = function template(tpl, data, toBlank = true, index) { return tpl .replace(/{{!--[\s\S]*?--}}/g, '') // 删除注释 .replace(/\{\{#?(\w+)\s+(\w+)[^{}]*\}\}([\s\S\t\r\n]*?)\{\{\/\1\}\}/g, function (_, fn, item_key, line) { const items = data[item_key]; const _placeholder = toBlank ? '' : _; switch (fn) { case 'each': return items ? items.map((item, index) => template(line, item, toBlank, index)).join('') : _placeholder; case 'if': return items ? template(line, items) : _placeholder; default: return template(line, items); } }) .replace(/\{\{([@\$\.\w]+)\}\}/g, (__, key) => { const _placeholder = toBlank ? '' : __; switch (key) { case '@': return typeof data !== 'undefined' ? data : _placeholder; case '@index': return index; default: return typeof data[key] !== 'undefined' ? data[key] : _placeholder; } }); }; exports.template = template; const renderHTML = (body, data) => { if (!(0, exports.isPlainObject)(data)) { return body; } return (0, exports.template)(templates_1.page_layout, { title: data.title || 'F2E Page', body: (0, exports.template)(body, data) }); }; exports.renderHTML = renderHTML;