1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _es6Promisify = require('es6-promisify');
|
8 |
|
9 | var _es6Promisify2 = _interopRequireDefault(_es6Promisify);
|
10 |
|
11 | var _path = require('path');
|
12 |
|
13 | var _path2 = _interopRequireDefault(_path);
|
14 |
|
15 | var _fs = require('fs');
|
16 |
|
17 | var _fs2 = _interopRequireDefault(_fs);
|
18 |
|
19 | var _minimatch = require('minimatch');
|
20 |
|
21 | var _minimatch2 = _interopRequireDefault(_minimatch);
|
22 |
|
23 | var _String = require('./String');
|
24 |
|
25 | var _String2 = _interopRequireDefault(_String);
|
26 |
|
27 | var _Error = require('../Error');
|
28 |
|
29 | var _Error2 = _interopRequireDefault(_Error);
|
30 |
|
31 | var _Reference = require('../Reference');
|
32 |
|
33 | var _Reference2 = _interopRequireDefault(_Reference);
|
34 |
|
35 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
36 |
|
37 | class 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 |
|
180 | exports.default = FileSchema; |
\ | No newline at end of file |