You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.9 KiB

1 year ago
const { parseTODO, toLowerCaseArray } = require('../utils')
module.exports = {
meta: {
type: "suggestion",
docs: {
description: 'WARN:TODO过期/即将过期',
category: 'Stylistic Issues',
recommended: true
},
schema: [
{
type: 'object', // 第一个可配置属性为object
properties: {
flag: { // 被检测的注释的开头关键字 默认 ["todo","fixme"]
type: 'array',
items: {
type: 'string'
}
},
ddl: { // 被检测的日期标志 默认 ["ddl","deadline"]
type: 'array',
items: {
type: 'string'
}
},
warnline: { // 发出警告的截止天数 默认 7
type: 'string'
}
}
}
]
},
create(context) {
const oneDay = 60 * 60 * 1000 * 24
// 取得AST
const sourceCode = context.getSourceCode()
// 获取所有的注释节点
let comments = sourceCode.getAllComments()
// 默认参数值
let dFlag = ["todo", "fixme"]
let dDdl = ["ddl", "deadline"]
let dWarnLine = 7
// 获取传递的参数,校验参数合法性与设置参数值
let [params] = context.options
if (params && Object.keys(params).length > 0) {
let { flag, ddl, warnline } = params
dFlag = flag || dFlag
dDdl = ddl || dDdl
dWarnLine = warnline || dWarnLine
}
// 转化为小写
dFlag = toLowerCaseArray(dFlag)
dDdl = toLowerCaseArray(dDdl)
// 过滤出包含关键词的注释节点
comments = comments.filter(comment => {
let { value, type } = comment
if (type === 'Block') {
value = value.replace(/\*|\n/g, '')
}
value = value.toLowerCase().trim()
// 保存格式化后的字符串
comment.newValue = value
for (const flag of dFlag) {
if (value.startsWith(flag)) {
// 保存上flag
comment.flag = flag
return true
}
}
return false
})
return {
Program(node) {
comments.forEach(comment => {
const { newValue, loc, type, flag } = comment
let { date, text } = parseTODO(newValue, dDdl, flag)
text = text.trim()
let errMsg = ''
// 未设置DDL或者DDL不合法情况
if (!date) {
errMsg = '没有设置有效的Deadline,设置方法(https://github.com/ATQQ/eslint-plugin-todo-ddl)'
} else {
const TODODate = new Date(date).getTime()
const interval = TODODate - Date.now()
// 如果已经到期
if (interval < 0 || interval < oneDay) {
errMsg = '已经过截止日期,请立即修改'
} else {
// 剩余天数(向下取整)
const theRestDays = ~~(interval / oneDay)
errMsg = theRestDays <= dWarnLine ? `还有${theRestDays}天截止,请尽快修改` : ''
}
}
if (errMsg) {
context.report({
node: comment,
message: `TODO WARN: ${errMsg} --> ${text}`
})
}
})
}
}
}
}