1 | var url = require('url')
|
2 | var path = require('path')
|
3 | var Stream = require('stream').Stream
|
4 | var os = require('os')
|
5 | const debug = require('./debug')
|
6 |
|
7 | function validateString (data, k, val) {
|
8 | data[k] = String(val)
|
9 | }
|
10 |
|
11 | function 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 |
|
33 | function 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 |
|
41 | function 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 |
|
50 | function 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 |
|
65 | function validateUrl (data, k, val) {
|
66 |
|
67 |
|
68 | val = url.parse(String(val))
|
69 | if (!val.host) {
|
70 | return false
|
71 | }
|
72 | data[k] = val.href
|
73 | }
|
74 |
|
75 | function validateStream (data, k, val) {
|
76 | if (!(val instanceof Stream)) {
|
77 | return false
|
78 | }
|
79 | data[k] = val
|
80 | }
|
81 |
|
82 | module.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 | }
|