mirror of https://github.com/certd/certd
refactor: 1
parent
e68862b633
commit
f710c00c0d
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"extends": "standard",
|
|
||||||
"env": {
|
|
||||||
"mocha": true
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2020
|
|
||||||
},
|
|
||||||
"overrides": [
|
|
||||||
{
|
|
||||||
"files": ["*.test.js", "*.spec.js"],
|
|
||||||
"rules": {
|
|
||||||
"no-unused-expressions": "off"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
.vscode/
|
|
||||||
node_modules/
|
|
||||||
npm-debug.log
|
|
||||||
yarn-error.log
|
|
||||||
yarn.lock
|
|
||||||
package-lock.json
|
|
||||||
/.idea/
|
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"name": "@certd/api",
|
|
||||||
"version": "0.3.0",
|
|
||||||
"description": "",
|
|
||||||
"type": "module",
|
|
||||||
"author": "Greper",
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "./dist/index.cjs",
|
|
||||||
"module": "./dist/fast-crud.es.js",
|
|
||||||
"scripts": {
|
|
||||||
"build": "rollup -c"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"axios": "^0.21.1",
|
|
||||||
"dayjs": "^1.9.7",
|
|
||||||
"lodash-es": "^4.17.20",
|
|
||||||
"log4js": "^6.3.0",
|
|
||||||
"qs": "^6.9.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"chai": "^4.2.0",
|
|
||||||
"eslint": "^7.15.0",
|
|
||||||
"eslint-config-standard": "^16.0.2",
|
|
||||||
"eslint-plugin-import": "^2.22.1",
|
|
||||||
"eslint-plugin-node": "^11.1.0",
|
|
||||||
"eslint-plugin-promise": "^4.2.1",
|
|
||||||
"mocha": "^8.2.1",
|
|
||||||
"rollup": "^3.2.3"
|
|
||||||
},
|
|
||||||
"gitHead": "5fbd7742665c0a949333d805153e9b6af91c0a71"
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
export default {
|
|
||||||
input: 'src/index.js',
|
|
||||||
output: [
|
|
||||||
{
|
|
||||||
file: 'dist/index.cjs',
|
|
||||||
format: 'cjs'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
file: 'dist/index.es.js',
|
|
||||||
format: 'es'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
import { Registry } from '../registry/registry.js'
|
|
||||||
export const accessProviderRegistry = new Registry()
|
|
|
@ -1,47 +0,0 @@
|
||||||
import _ from 'lodash'
|
|
||||||
import logger from '../utils/util.log.js'
|
|
||||||
import commonUtil from '../utils/util.common.js'
|
|
||||||
export class AbstractDnsProvider {
|
|
||||||
constructor ({ accessProviders }) {
|
|
||||||
this.logger = logger
|
|
||||||
this.accessProviders = commonUtil.arrayToMap(accessProviders)
|
|
||||||
}
|
|
||||||
|
|
||||||
async createRecord ({ fullRecord, type, value }) {
|
|
||||||
throw new Error('请实现 createRecord 方法')
|
|
||||||
}
|
|
||||||
|
|
||||||
async removeRecord ({ fullRecord, type, value, record }) {
|
|
||||||
throw new Error('请实现 removeRecord 方法')
|
|
||||||
}
|
|
||||||
|
|
||||||
async getDomainList () {
|
|
||||||
throw new Error('请实现 getDomainList 方法')
|
|
||||||
}
|
|
||||||
|
|
||||||
async matchDomain (dnsRecord, domainPropName) {
|
|
||||||
const list = await this.getDomainList()
|
|
||||||
let domain = null
|
|
||||||
for (const item of list) {
|
|
||||||
if (_.endsWith(dnsRecord, item[domainPropName])) {
|
|
||||||
domain = item
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!domain) {
|
|
||||||
throw new Error('找不到域名,请检查域名是否正确:' + dnsRecord)
|
|
||||||
}
|
|
||||||
return domain
|
|
||||||
}
|
|
||||||
|
|
||||||
getAccessProvider (accessProvider, accessProviders = this.accessProviders) {
|
|
||||||
let access = accessProvider
|
|
||||||
if (typeof accessProvider === 'string' && accessProviders) {
|
|
||||||
access = accessProviders[accessProvider]
|
|
||||||
}
|
|
||||||
if (access == null) {
|
|
||||||
throw new Error(`accessProvider :${accessProvider}不存在`)
|
|
||||||
}
|
|
||||||
return access
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
import { Registry } from '../registry/registry.js'
|
|
||||||
export { AbstractDnsProvider } from './abstract-dns-provider.js'
|
|
||||||
|
|
||||||
export const dnsProviderRegistry = new Registry()
|
|
|
@ -1,6 +0,0 @@
|
||||||
export * from './dns-provider/index.js'
|
|
||||||
export * from './plugin/index.js'
|
|
||||||
export * from './access-provider/index.js'
|
|
||||||
export { Store } from './store/store.js'
|
|
||||||
export { util } from './utils/index.js'
|
|
||||||
// module.createRequireFromPath()
|
|
|
@ -1,81 +0,0 @@
|
||||||
import fs from 'fs'
|
|
||||||
import logger from '../utils/util.log.js'
|
|
||||||
import dayjs from 'dayjs'
|
|
||||||
import Sleep from '../utils/util.sleep.js'
|
|
||||||
import commonUtil from '../utils/util.common.js'
|
|
||||||
export class AbstractPlugin {
|
|
||||||
constructor (options) {
|
|
||||||
if (options == null) {
|
|
||||||
throw new Error('插件安装失败:参数不允许为空')
|
|
||||||
}
|
|
||||||
const { accessProviders } = options
|
|
||||||
this.logger = logger
|
|
||||||
this.accessProviders = commonUtil.arrayToMap(accessProviders)
|
|
||||||
}
|
|
||||||
|
|
||||||
appendTimeSuffix (name) {
|
|
||||||
if (name == null) {
|
|
||||||
name = 'certd'
|
|
||||||
}
|
|
||||||
return name + '-' + dayjs().format('YYYYMMDD-HHmmss')
|
|
||||||
}
|
|
||||||
|
|
||||||
async executeFromContextFile (options = {}) {
|
|
||||||
const { contextPath } = options
|
|
||||||
const contextJson = fs.readFileSync(contextPath)
|
|
||||||
const context = JSON.parse(contextJson)
|
|
||||||
options.context = context
|
|
||||||
await this.doExecute(options)
|
|
||||||
fs.writeFileSync(JSON.stringify(context))
|
|
||||||
}
|
|
||||||
|
|
||||||
async doExecute (options) {
|
|
||||||
try {
|
|
||||||
return await this.execute(options)
|
|
||||||
} catch (e) {
|
|
||||||
logger.error('插件执行出错:', e)
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行
|
|
||||||
* @param options
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
async execute (options) {
|
|
||||||
console.error('请实现此方法,context:', options.context)
|
|
||||||
}
|
|
||||||
|
|
||||||
async doRollback (options) {
|
|
||||||
try {
|
|
||||||
return await this.rollback(options)
|
|
||||||
} catch (e) {
|
|
||||||
logger.error('插件rollback出错:', e)
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 回退,用于单元测试
|
|
||||||
* @param options
|
|
||||||
*/
|
|
||||||
async rollback (options) {
|
|
||||||
console.error('请实现此方法,rollback:', options.context)
|
|
||||||
}
|
|
||||||
|
|
||||||
getAccessProvider (accessProvider, accessProviders = this.accessProviders) {
|
|
||||||
let access = accessProvider
|
|
||||||
if (typeof accessProvider === 'string' && accessProviders) {
|
|
||||||
access = accessProviders[accessProvider]
|
|
||||||
}
|
|
||||||
if (access == null) {
|
|
||||||
throw new Error(`accessProvider :${accessProvider}不存在`)
|
|
||||||
}
|
|
||||||
return access
|
|
||||||
}
|
|
||||||
|
|
||||||
async sleep (time) {
|
|
||||||
await Sleep(time)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
import { Registry } from '../registry/registry.js'
|
|
||||||
export { AbstractPlugin } from './abstract-plugin.js'
|
|
||||||
export const pluginRegistry = new Registry()
|
|
|
@ -1,46 +0,0 @@
|
||||||
export class Registry {
|
|
||||||
constructor () {
|
|
||||||
this.collection = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
install (target) {
|
|
||||||
if (target == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (this.collection == null) {
|
|
||||||
this.collection = {}
|
|
||||||
}
|
|
||||||
let defineName = target.define ? target.define().name : null
|
|
||||||
if (defineName == null) {
|
|
||||||
defineName = target.name
|
|
||||||
}
|
|
||||||
|
|
||||||
this.register(defineName, target)
|
|
||||||
}
|
|
||||||
|
|
||||||
register (key, value) {
|
|
||||||
if (!key || value == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.collection[key] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
get (name) {
|
|
||||||
if (!name) {
|
|
||||||
throw new Error('插件名称不能为空')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.collection) {
|
|
||||||
this.collection = {}
|
|
||||||
}
|
|
||||||
const plugin = this.collection[name]
|
|
||||||
if (!plugin) {
|
|
||||||
throw new Error(`插件${name}还未注册`)
|
|
||||||
}
|
|
||||||
return plugin
|
|
||||||
}
|
|
||||||
|
|
||||||
getCollection () {
|
|
||||||
return this.collection
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
export class Store {
|
|
||||||
set (key, value) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
get (key) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
buildKey (...keyItem) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
linkExists (linkPath) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
link (targetPath, linkPath) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
unlink (linkPath) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 全路径
|
|
||||||
* @param key
|
|
||||||
*/
|
|
||||||
getActualKey (key) {
|
|
||||||
// return 前缀+key
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
import logger from './util.log.js'
|
|
||||||
import path from './util.path.js'
|
|
||||||
import { request } from './util.request.js'
|
|
||||||
import sleep from './util.sleep.js'
|
|
||||||
import common from './util.common.js'
|
|
||||||
export const util = {
|
|
||||||
logger, path, request, sleep, common
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
import _ from 'lodash'
|
|
||||||
export default {
|
|
||||||
arrayToMap (array) {
|
|
||||||
if (!array) {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
if (!_.isArray(array)) {
|
|
||||||
return array
|
|
||||||
}
|
|
||||||
const map = {}
|
|
||||||
for (const item of array) {
|
|
||||||
if (item.key) {
|
|
||||||
map[item.key] = item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map
|
|
||||||
},
|
|
||||||
mapToArray (map) {
|
|
||||||
if (!map) {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
if (_.isArray(map)) {
|
|
||||||
return map
|
|
||||||
}
|
|
||||||
const array = []
|
|
||||||
for (const key in map) {
|
|
||||||
const item = map[key]
|
|
||||||
item.key = key
|
|
||||||
array.push(item)
|
|
||||||
}
|
|
||||||
return array
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
import log4js from 'log4js'
|
|
||||||
log4js.configure({
|
|
||||||
appenders: { std: { type: 'stdout' } },
|
|
||||||
categories: { default: { appenders: ['std'], level: 'info' } }
|
|
||||||
})
|
|
||||||
const logger = log4js.getLogger('certd')
|
|
||||||
export default logger
|
|
|
@ -1,9 +0,0 @@
|
||||||
import path from 'path'
|
|
||||||
|
|
||||||
function getUserBasePath () {
|
|
||||||
const userHome = process.env.USERPROFILE || process.env.HOME
|
|
||||||
return path.resolve(userHome, './.certd')
|
|
||||||
}
|
|
||||||
export default {
|
|
||||||
getUserBasePath
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
import axios from 'axios'
|
|
||||||
import qs from 'qs'
|
|
||||||
import logger from './util.log.js'
|
|
||||||
/**
|
|
||||||
* @description 创建请求实例
|
|
||||||
*/
|
|
||||||
function createService () {
|
|
||||||
// 创建一个 axios 实例
|
|
||||||
const service = axios.create()
|
|
||||||
// 请求拦截
|
|
||||||
service.interceptors.request.use(
|
|
||||||
config => {
|
|
||||||
if (config.formData) {
|
|
||||||
config.data = qs.stringify(config.formData, {
|
|
||||||
arrayFormat: 'indices',
|
|
||||||
allowDots: true
|
|
||||||
}) // 序列化请求参数
|
|
||||||
delete config.formData
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
},
|
|
||||||
error => {
|
|
||||||
// 发送失败
|
|
||||||
logger.error(error)
|
|
||||||
return Promise.reject(error)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
// 响应拦截
|
|
||||||
service.interceptors.response.use(
|
|
||||||
response => {
|
|
||||||
logger.info('http response:', JSON.stringify(response.data))
|
|
||||||
return response.data
|
|
||||||
},
|
|
||||||
error => {
|
|
||||||
// const status = _.get(error, 'response.status')
|
|
||||||
// switch (status) {
|
|
||||||
// case 400: error.message = '请求错误'; break
|
|
||||||
// case 401: error.message = '未授权,请登录'; break
|
|
||||||
// case 403: error.message = '拒绝访问'; break
|
|
||||||
// case 404: error.message = `请求地址出错: ${error.response.config.url}`; break
|
|
||||||
// case 408: error.message = '请求超时'; break
|
|
||||||
// case 500: error.message = '服务器内部错误'; break
|
|
||||||
// case 501: error.message = '服务未实现'; break
|
|
||||||
// case 502: error.message = '网关错误'; break
|
|
||||||
// case 503: error.message = '服务不可用'; break
|
|
||||||
// case 504: error.message = '网关超时'; break
|
|
||||||
// case 505: error.message = 'HTTP版本不受支持'; break
|
|
||||||
// default: break
|
|
||||||
// }
|
|
||||||
logger.error('请求出错:', error.response.config.url, error)
|
|
||||||
return Promise.reject(error)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return service
|
|
||||||
}
|
|
||||||
|
|
||||||
export const request = createService()
|
|
|
@ -1,7 +0,0 @@
|
||||||
export default function (timeout) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
setTimeout(() => {
|
|
||||||
resolve()
|
|
||||||
}, timeout)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit a0366be6aeda29aa55d3c5b9f775fa3a27a322a3
|
Subproject commit 7782a7de65f60e2b4611bca1e29b4ab19deec82b
|
Loading…
Reference in New Issue