UNPKG

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