0d1af635964b9c43a814f7fd877a51b797911c07e34743310ddecfc5c53d3e22e0a63f46c05bc998bb9f48899b93e7dfb4b51555a8506aebbacadee11b0cf8 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const url = require('url')
  2. const path = require('path')
  3. const Stream = require('stream').Stream
  4. const os = require('os')
  5. const debug = require('./debug')
  6. function validateString (data, k, val) {
  7. data[k] = String(val)
  8. }
  9. function validatePath (data, k, val) {
  10. if (val === true) {
  11. return false
  12. }
  13. if (val === null) {
  14. return true
  15. }
  16. val = String(val)
  17. const isWin = process.platform === 'win32'
  18. const homePattern = isWin ? /^~(\/|\\)/ : /^~\//
  19. const home = os.homedir()
  20. if (home && val.match(homePattern)) {
  21. data[k] = path.resolve(home, val.slice(2))
  22. } else {
  23. data[k] = path.resolve(val)
  24. }
  25. return true
  26. }
  27. function validateNumber (data, k, val) {
  28. debug('validate Number %j %j %j', k, val, isNaN(val))
  29. if (isNaN(val)) {
  30. return false
  31. }
  32. data[k] = +val
  33. }
  34. function validateDate (data, k, val) {
  35. const s = Date.parse(val)
  36. debug('validate Date %j %j %j', k, val, s)
  37. if (isNaN(s)) {
  38. return false
  39. }
  40. data[k] = new Date(val)
  41. }
  42. function validateBoolean (data, k, val) {
  43. if (typeof val === 'string') {
  44. if (!isNaN(val)) {
  45. val = !!(+val)
  46. } else if (val === 'null' || val === 'false') {
  47. val = false
  48. } else {
  49. val = true
  50. }
  51. } else {
  52. val = !!val
  53. }
  54. data[k] = val
  55. }
  56. function validateUrl (data, k, val) {
  57. // Changing this would be a breaking change in the npm cli
  58. /* eslint-disable-next-line node/no-deprecated-api */
  59. val = url.parse(String(val))
  60. if (!val.host) {
  61. return false
  62. }
  63. data[k] = val.href
  64. }
  65. function validateStream (data, k, val) {
  66. if (!(val instanceof Stream)) {
  67. return false
  68. }
  69. data[k] = val
  70. }
  71. module.exports = {
  72. String: { type: String, validate: validateString },
  73. Boolean: { type: Boolean, validate: validateBoolean },
  74. url: { type: url, validate: validateUrl },
  75. Number: { type: Number, validate: validateNumber },
  76. path: { type: path, validate: validatePath },
  77. Stream: { type: Stream, validate: validateStream },
  78. Date: { type: Date, validate: validateDate },
  79. Array: { type: Array },
  80. }