UNPKG

5.52 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _es6Promisify = require('es6-promisify');
8
9var _es6Promisify2 = _interopRequireDefault(_es6Promisify);
10
11var _path = require('path');
12
13var _path2 = _interopRequireDefault(_path);
14
15var _fs = require('fs');
16
17var _fs2 = _interopRequireDefault(_fs);
18
19var _minimatch = require('minimatch');
20
21var _minimatch2 = _interopRequireDefault(_minimatch);
22
23var _String = require('./String');
24
25var _String2 = _interopRequireDefault(_String);
26
27var _Error = require('../Error');
28
29var _Error2 = _interopRequireDefault(_Error);
30
31var _Reference = require('../Reference');
32
33var _Reference2 = _interopRequireDefault(_Reference);
34
35function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36
37class FileSchema extends _String2.default {
38 constructor(base) {
39 super(base);
40
41 let raw = this._rules.descriptor.pop();
42 let allow = this._rules.descriptor.pop();
43 this._rules.descriptor.push(this._baseDescriptor, allow, this._existsDescriptor, this._resolveDescriptor, raw);
44 raw = this._rules.validator.pop();
45 allow = this._rules.validator.pop();
46 this._rules.validator.push(this._baseValidator, allow, this._existsValidator, this._resolveValidator, raw);
47 }
48
49 stripEmpty() {
50 return this._setError('stripEmpty');
51 }
52 truncate() {
53 return this._setError('truncate');
54 }
55 pad() {
56 return this._setError('pad');
57 }
58
59 _typeDescriptor() {
60 return 'It has to be a valid file or directory location.\n';
61 }
62
63 baseDir(base) {
64 return this._setAny('baseDir', base);
65 }
66
67 _baseDescriptor() {
68 const set = this._setting;
69 let msg = '';
70 if (set.base) {
71 if (this._isReference('baseDir')) {
72 msg += `If a relative path is given it will be resolved from the location defined under \
73${set.baseDir.description}. `;
74 } else msg += `If a relative path is given it will be resolved from ${set.baseDir}. `;
75 }
76 return msg.length ? `${msg.trim()}\n` : msg;
77 }
78
79 _baseValidator(data) {
80 const check = this._check;
81 try {
82 this._checkString('baseDir');
83 } catch (err) {
84 return Promise.reject(new _Error2.default(this, data, err.message));
85 }
86
87 if (check.baseDir) data.temp.resolved = _path2.default.resolve(check.baseDir, data.value);else data.temp.resolved = _path2.default.resolve(data.value);
88 return Promise.resolve();
89 }
90
91 _allowValidator(data) {
92 const check = this._check;
93 this._checkArray('allow');
94 this._checkArray('deny');
95
96 if (check.deny && check.deny.length && check.deny.filter(e => (0, _minimatch2.default)(data.value, e)).length) {
97 return Promise.reject(new _Error2.default(this, data, 'Element found in blacklist (denyed item).'));
98 }
99
100 if (check.allow && check.allow.length && check.allow.filter(e => (0, _minimatch2.default)(data.value, e)).length === 0) {
101 return Promise.reject(new _Error2.default(this, data, 'Element not in whitelist (allowed item).'));
102 }
103
104 return Promise.resolve();
105 }
106
107 exists(flag) {
108 return this._setFlag('exists', flag);
109 }
110 readable(flag) {
111 return this._setFlag('readable', flag);
112 }
113 writable(flag) {
114 return this._setFlag('writable', flag);
115 }
116
117 _existsDescriptor() {
118 const set = this._setting;
119 let msg = '';
120 if (set.writable) {
121 if (this._isReference('writable')) {
122 msg += `The file has to be writable if defined under ${set.writable.description}. `;
123 } else msg += 'The file has to be writable. ';
124 } else if (set.readable) {
125 if (this._isReference('readable')) {
126 msg += `The file has to be readable if defined under ${set.readable.description}. `;
127 } else msg += 'The file has to be readable. ';
128 } else if (set.exists) {
129 if (this._isReference('exists')) {
130 msg += `The file has to exist if defined under ${set.exists.description}. `;
131 } else msg += 'The file has to exist. ';
132 }
133 return msg.length ? `${msg.trim()}\n` : msg;
134 }
135
136 _existsValidator(data) {
137 const check = this._check;
138 try {
139 this._checkBoolean('exists');
140 this._checkBoolean('readable');
141 this._checkBoolean('writable');
142 } catch (err) {
143 return Promise.reject(new _Error2.default(this, data, err.message));
144 }
145
146 let p = Promise.resolve();
147 if (check.readable) p = p.then(() => (0, _es6Promisify2.default)(_fs2.default.access)(data.temp.resolved, _fs2.default.R_OK));else if (check.writable) p = p.then(() => (0, _es6Promisify2.default)(_fs2.default.access)(data.temp.resolved, _fs2.default.W_OK));else if (check.exists) p = p.then(() => (0, _es6Promisify2.default)(_fs2.default.access)(data.temp.resolved, _fs2.default.F_OK));
148 return p;
149 }
150
151 resolve(flag) {
152 return this._setFlag('resolve', flag);
153 }
154
155 _resolveDescriptor() {
156 const set = this._setting;
157 let msg = '';
158 if (set.resolve) {
159 if (this._isReference('resolve')) {
160 msg += `A relative address will be set to it's absolute location if set under \
161${set.resolve.description}. `;
162 } else msg += 'A relative address will be set to it\'s absolute location. ';
163 }
164 return msg.length ? `${msg.trim()}\n` : msg;
165 }
166
167 _resolveValidator(data) {
168 const check = this._check;
169 try {
170 this._checkBoolean('resolve');
171 } catch (err) {
172 return Promise.reject(new _Error2.default(this, data, err.message));
173 }
174
175 if (check.resolve) data.value = data.temp.resolved;
176 return Promise.resolve();
177 }
178}
179
180exports.default = FileSchema;
\No newline at end of file