const fs = require('fs');
const path = require('path');
const Echo = require('./class-Echo.js');
const jsonDB = require('./class-jsonDB.js');
//钩子
require('./method-hooks.js');
global.NV_Database = jsonDB;
global.nvdb = {};
global.NV_Error = require('./class-NV_Error.js');
global.nv_error_log = (error_string)=>{
var str = `${get_time_string()}\n${error_string}\n`;
console.log('Deprecated:nv_error_log方法未来将被弃用');
console.log(error_string);
fs.appendFile( path.join(process.cwd(),'./error.log'), str,()=>{} );
}
global.nv_create_dirs = (rootPath)=>{
var result = true;
try {
fs.mkdirSync( path.join(process.cwd(),rootPath), {recursive: true} );
} catch(e) {
console.log(`创建文件夹失败:${rootPath}`,e);
result = false;
}
return result;
}
global.nv_remove_file = (filePath)=>{
var result = true;
try {
fs.unlinkSync( path.join(process.cwd(),filePath) );
} catch(e) {
console.log(`删除文件失败:${filePath}`,e);
result = false;
}
return result;
}
global.nv_remove_folder = (folderPath)=>{
var result = true;
try {
fs.rmSync( path.join(process.cwd(),folderPath),{force:true, recursive:true} );
} catch(e) {
console.log(`删除文件夹失败:${folderPath}`,e);
result = false;
}
return result;
}
global.get_time_string = (timestamp, format)=>{
timestamp = timestamp || new Date();
format = format || "YYYY-MM-DD HH:mm:ss";
var timeZone = get_option('timeZone','Asia/Shanghai');
const moment = require('moment-timezone');
var momentTz = moment( new Date( timestamp ) ).tz(timeZone);
return momentTz.format(format);
}
exports._get_static_urls_options = ()=>{
/*
[
{
url,dir
}
]
*/
return apply_filters('_express_static_urls',[]) || [];
}
global.register_static_url = (url,dir,override) => {
add_filter("_express_static_urls",(opts)=>{
opts = opts || [];
var hasDuplicate = false;
var index = null;
opts.forEach((r,i)=>{
if ( r.url == url ) {
hasDuplicate = true;
index = i;
}
});
if (hasDuplicate) {
if (override) {
opts[index] = { url,dir };
}
} else {
opts.push({ url,dir });
}
return opts;
})
}
global.unregister_static_url = (url,dir,override) => {
add_filter("_express_static_urls",(opts)=>{
opts = opts || [];
var index = null;
opts.forEach((r,i)=>{
if ( r.url == url ) {
index = i;
}
});
if (index) {
opts.splice(index,1);
}
return opts;
})
}
exports._get_rest_routes_options = ()=>{
/*
[
{
namespace,route,methods,callback,permission_callback
}
]
*/
return apply_filters('_express_rest_routes',[]) || [];
}
global.register_rest_route = (namespace,route,args,override) => {
add_filter('_express_rest_routes',routes=>{
routes = routes || [];
var hasDuplicate = false;
var index = null;
routes.forEach((r,i)=>{
if ( r.namespace == namespace && r.route == route && r.methods == args.methods ) {
hasDuplicate = true;
index = i;
}
});
if (hasDuplicate) {
if (override) {
routes[index] = { ...args,namespace,route };
}
} else {
routes.push({ ...args,namespace,route });
}
return routes;
})
}
exports._get_socket_routes_options = ()=>{
/*
[
{
namespace,route,callback,permission_callback
}
]
*/
return apply_filters('_express_socket_routes',[]) || [];
}
global.register_socket_route = (namespace,route,args,override) => {
add_filter('_express_socket_routes',routes=>{
routes = routes || [];
var hasDuplicate = false;
var index = null;
routes.forEach((r,i)=>{
if ( r.namespace == namespace && r.route == route ) {
hasDuplicate = true;
index = i;
}
});
if (hasDuplicate) {
if (override) {
routes[index] = { ...args,namespace,route };
}
} else {
routes.push({ ...args,namespace,route });
}
return routes;
})
}
global.esc_html = (text)=>{
return text
.replace(/</g,'<')
.replace(/>/g,'>')
.replace(/'/g,'\'')
.replace(/"/g,'\"')
;
}
global.strip_tags = (text)=>{
return text.replace(/(<([^>]+)>)/gi, "");
}
try{
var admin_file = fs.readFileSync( path.join(process.cwd(),"./nv-admin/application.html") ,{encoding: 'utf-8'});
add_action('nv_admin_head',()=>{
nv_enqueue_admin_head(admin_file)
})
} catch(e) {console.log(`后台头文件信息添加失败`,e)}
global.set_frontstage_rendering_mode = (mode,option) => {
var create_admin_html = ()=>{
var html = `<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,viewport-fit=cover"><title>管理 - nvPress</title><link rel="shortcut icon" href="/nv-admin/nvpress_logo_16.png" type="image/x-icon" sizes="16x16"><link rel="icon" href="/nv-admin/nvpress_logo_32.png" sizes="32x32"><link rel="apple-touch-icon" href="/nv-admin/nvpress_logo_144.png">${ nv_admin_head(mode,option) }</head><body><div id="app"></div></body></html>`;
return apply_filters('_nv_admin_html', html);
}
if ( mode.toUpperCase() == 'CSR' ) {
add_action('register_client_side_render_router', app=>{
register_static_url('/', option );
var history = require('connect-history-api-fallback');
app.use(history({
htmlAcceptHeaders: ['text/html','application/xhtml+xml'],
rewrites: apply_filters("rewrite_rules_array",[])
}));
// 访问 /nv-admin/xxx 都会被rewrite到 /nv-admin/index.html,直接对这个进行过滤
app.get('/nv-admin/index.html', (req,res)=>{
res.type("text/html");
res.send( create_admin_html() );
return;
})
})
}
if ( mode.toUpperCase() == 'SSR' ) {
// client_side 和 server_side 只是在 init 时候的先后区别。
// client_side 优先于 static_urls 处理,因此在这个时机添加一个可以防止直接读取到index.html文件
add_action('register_client_side_render_router', app=>{
app.get('/nv-admin', (req,res)=>{
res.type("text/html");
res.send( create_admin_html() );
return;
})
})
add_action('register_server_side_render_router', app=>{
app.get('/nv-admin/*', (req,res)=>{
res.type("text/html");
res.send( create_admin_html() );
return;
})
})
}
}
global.nv_validator = (data,validator)=> Object.keys(data).map(key=>{
switch(validator[key]) {
case Array:
return Array.isArray(data[key]);
case Object:
return typeof(data[key]) == 'object' && data[key] !== null && !Array.isArray(data[key]);
case String:
return typeof(data[key]) == 'string';
case Number:
return typeof(data[key]) == 'number';
case Boolean:
return typeof(data[key]) == 'boolean';
case Symbol:
return typeof(data[key]) == 'symbol';
default:// 验证范围外的,例如:1、data里面有一个key没有被要求验证;2、可以被验证的类型不在上述范围内
return true;
}
}).every(i=>i);
require('./method-metas.js');
require('./method-options.js');
require('./method-users.js');
require('./method-user-invite.js');
require('./method-menu.js');
require('./method-post.js');
require('./method-mail.js');
require('./method-media.js');
require('./method-taxonomies.js');
require('./method-shortcode.js');
require('./method-editor.js');
require('./method-comments.js');
require('./method-package.js');
require('./method-nav-menu.js');
require('./method-theme-module.js');
require('./method-render.js');