common.mjs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { isNil, isPlainObject, set, startCase, transform } from 'lodash-es'
  2. import crypto from 'node:crypto'
  3. /* eslint-disable promise/param-names */
  4. export function createDeferred () {
  5. let result, resolve, reject
  6. return {
  7. resolve: function (value) {
  8. if (resolve) {
  9. resolve(value)
  10. } else {
  11. result = result || new Promise(function (r) { r(value) })
  12. }
  13. },
  14. reject: function (reason) {
  15. if (reject) {
  16. reject(reason)
  17. } else {
  18. result = result || new Promise(function (x, j) { j(reason) })
  19. }
  20. },
  21. promise: new Promise(function (r, j) {
  22. if (result) {
  23. r(result)
  24. } else {
  25. resolve = r
  26. reject = j
  27. }
  28. })
  29. }
  30. }
  31. /**
  32. * Decode a tree path
  33. *
  34. * @param {string} str String to decode
  35. * @returns Decoded tree path
  36. */
  37. export function decodeTreePath (str) {
  38. return str.replaceAll('_', '-').replaceAll('.', '/')
  39. }
  40. /**
  41. * Encode a tree path
  42. *
  43. * @param {string} str String to encode
  44. * @returns Encoded tree path
  45. */
  46. export function encodeTreePath (str) {
  47. return str?.toLowerCase()?.replaceAll('-', '_')?.replaceAll('/', '.') || ''
  48. }
  49. /**
  50. * Generate SHA-1 Hash of a string
  51. *
  52. * @param {string} str String to hash
  53. * @returns Hashed string
  54. */
  55. export function generateHash (str) {
  56. return crypto.createHash('sha1').update(str).digest('hex')
  57. }
  58. /**
  59. * Get default value of type
  60. *
  61. * @param {any} type primitive type name
  62. * @returns Default value
  63. */
  64. export function getTypeDefaultValue (type) {
  65. switch (type.toLowerCase()) {
  66. case 'string':
  67. return ''
  68. case 'number':
  69. return 0
  70. case 'boolean':
  71. return false
  72. }
  73. }
  74. export function parseModuleProps (props) {
  75. return transform(props, (result, value, key) => {
  76. let defaultValue = ''
  77. if (isPlainObject(value)) {
  78. defaultValue = !isNil(value.default) ? value.default : getTypeDefaultValue(value.type)
  79. } else {
  80. defaultValue = getTypeDefaultValue(value)
  81. }
  82. set(result, key, {
  83. default: defaultValue,
  84. type: (value.type || value).toLowerCase(),
  85. title: value.title || startCase(key),
  86. hint: value.hint || '',
  87. enum: value.enum || false,
  88. enumDisplay: value.enumDisplay || 'select',
  89. multiline: value.multiline || false,
  90. sensitive: value.sensitive || false,
  91. icon: value.icon || 'rename',
  92. order: value.order || 100
  93. })
  94. return result
  95. }, {})
  96. }