value-resolver.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * 变量与值解析:extractVarName、replaceVariablesInString、resolveValue、parseValue、时间/延迟
  3. */
  4. function extractVarName(varName) {
  5. if (typeof varName === 'string' && varName.startsWith('{') && varName.endsWith('}')) {
  6. return varName.slice(1, -1)
  7. }
  8. return varName
  9. }
  10. function replaceVariablesInString(str, context) {
  11. if (typeof str !== 'string') return str
  12. const doubleBracePattern = /\{\{([\w-]+)\}\}/g
  13. return str.replace(doubleBracePattern, (match, varName) => {
  14. const varValue = context[varName]
  15. if (varValue === undefined || varValue === null || varValue === '') return ''
  16. if (varValue === 'undefined' || varValue === 'null') return ''
  17. if (typeof varValue === 'string') {
  18. try {
  19. const parsed = JSON.parse(varValue)
  20. if (Array.isArray(parsed)) return parsed.length === 0 ? '' : varValue
  21. } catch (e) {}
  22. }
  23. if (Array.isArray(varValue) || (typeof varValue === 'object' && varValue !== null)) {
  24. try {
  25. return JSON.stringify(varValue)
  26. } catch (e) {
  27. return String(varValue)
  28. }
  29. }
  30. return String(varValue)
  31. })
  32. }
  33. function resolveValue(value, context) {
  34. if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) {
  35. const varName = value.slice(1, -1)
  36. return context[varName] !== undefined ? context[varName] : value
  37. }
  38. if (Array.isArray(value)) {
  39. return value.map(item => resolveValue(item, context))
  40. }
  41. if (typeof value === 'object' && value !== null) {
  42. const resolved = {}
  43. for (const key in value) {
  44. resolved[key] = resolveValue(value[key], context)
  45. }
  46. return resolved
  47. }
  48. return value
  49. }
  50. function parseTimeString(timeStr) {
  51. if (!timeStr || typeof timeStr !== 'string' || timeStr.trim() === '') return null
  52. try {
  53. const parts = timeStr.trim().split(' ')
  54. if (parts.length !== 2) return null
  55. const datePart = parts[0].split('/')
  56. const timePart = parts[1].split(':')
  57. if (datePart.length !== 3 || timePart.length !== 2) return null
  58. const date = new Date(
  59. parseInt(datePart[0], 10),
  60. parseInt(datePart[1], 10) - 1,
  61. parseInt(datePart[2], 10),
  62. parseInt(timePart[0], 10),
  63. parseInt(timePart[1], 10),
  64. 0, 0
  65. )
  66. return isNaN(date.getTime()) ? null : date
  67. } catch (e) {
  68. return null
  69. }
  70. }
  71. function parseDelayString(delayStr) {
  72. if (!delayStr || typeof delayStr !== 'string' || delayStr.trim() === '') return 0
  73. try {
  74. const trimmed = delayStr.trim()
  75. const unit = trimmed.slice(-1).toLowerCase()
  76. const value = parseInt(trimmed.slice(0, -1), 10)
  77. if (isNaN(value) || value < 0) return null
  78. switch (unit) {
  79. case 's': return value * 1000
  80. case 'm': return value * 60 * 1000
  81. case 'h': return value * 60 * 60 * 1000
  82. default: return null
  83. }
  84. } catch (e) {
  85. return null
  86. }
  87. }
  88. function calculateWaitTime(data, delay) {
  89. return 0
  90. }
  91. function parseValue(str) {
  92. if (typeof str !== 'string') return str
  93. str = str.trim()
  94. if (str === 'true') return true
  95. if (str === 'false') return false
  96. if ((str.startsWith('"') && str.endsWith('"')) || (str.startsWith("'") && str.endsWith("'"))) {
  97. return str.slice(1, -1).replace(/\\"/g, '"').replace(/\\'/g, "'")
  98. }
  99. if (/^-?\d+(\.\d+)?$/.test(str)) return parseFloat(str)
  100. if (str === 'undefined') return undefined
  101. return str
  102. }
  103. module.exports = {
  104. extractVarName,
  105. replaceVariablesInString,
  106. resolveValue,
  107. parseTimeString,
  108. parseDelayString,
  109. calculateWaitTime,
  110. parseValue,
  111. }