Skip to content

Commit 5f08da2

Browse files
committed
✨ 增加 validate schema 功能
1 parent a553d0f commit 5f08da2

File tree

10 files changed

+213
-31
lines changed

10 files changed

+213
-31
lines changed

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import * as smartMerge from './src/smartMerge';
2929
import * as virtualFile from './src/virtualFile';
3030
import * as openBrowser from './src/openBrowser';
3131
import * as env from './src/env';
32+
import * as validateSchema from './src/validateSchema';
3233

3334
export {
3435
moduleAlias,

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const internal = [
2222
'virtualFile',
2323
'openBrowser',
2424
'Env',
25+
'validateSchema',
2526
].reduce((obj, key) => {
2627
obj[key] = `./src/${key}`;
2728
return obj;

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@micro-app/shared-utils",
3-
"version": "0.1.6",
3+
"version": "0.1.7",
44
"description": "[Shared] shared utilities for micro-app.",
55
"main": "index.js",
66
"scripts": {
@@ -51,6 +51,8 @@
5151
"webpack-merge": "^4.2.2"
5252
},
5353
"dependencies": {
54+
"ajv": "^6.10.2",
55+
"ajv-keywords": "^3.4.1",
5456
"assert": "^2.0.0",
5557
"chalk": "^2.4.2",
5658
"cheerio": "^1.0.0-rc.3",

src/Env/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
const { execSync } = require('child_process');
44
const fs = require('fs');
55
const path = require('path');
6-
const LRU = require('./node_modules/lru-cache');
7-
const semver = require('./node_modules/semver');
6+
const LRU = require('lru-cache');
7+
const semver = require('semver');
88

99
let _hasYarn;
1010
const _yarnProjects = new LRU({

src/logger/index.js

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,8 @@ Object.keys(_disp).forEach(key => {
3434
npmlog.disp[key] = _disp[key];
3535
});
3636

37-
// reset
38-
npmlog.addLevel('info', 2000, { fg: 'black', bg: 'blue' }, 'INFO');
39-
npmlog.addLevel('http', 3000, { fg: 'black', bg: 'cyan' }, 'HTTP');
40-
npmlog.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN');
41-
npmlog.addLevel('error', 5000, { fg: 'black', bg: 'red' }, 'ERR!');
42-
4337
// npmlog.prefixStyle = {};
44-
const CUSTOM_LEVEL = {
45-
success: {
46-
level: 3500,
47-
fg: 'black',
48-
bg: 'green',
49-
},
50-
noise: {
51-
level: 10000,
52-
fg: 'black',
53-
bg: 'magenta',
54-
beep: true,
55-
},
56-
};
38+
const CUSTOM_LEVEL = require('./levels');
5739
Object.keys(CUSTOM_LEVEL).forEach(key => {
5840
const style = CUSTOM_LEVEL[key];
5941
const disp = style.disp || (key.length > 4 ? key.substr(0, 4) : key).toUpperCase();
@@ -163,7 +145,7 @@ class Logger {
163145
}
164146

165147
debug() {
166-
return this.getMethod('debug')(...arguments);
148+
return this.getMethod('verbose')(...arguments);
167149
}
168150
warn() {
169151
return this.getMethod('warn')(...arguments);
@@ -223,7 +205,9 @@ class Logger {
223205
try {
224206
assert(...args);
225207
} catch (err) {
226-
this.throw('[assert]', err.message);
208+
const e = new Error(err.message);
209+
e.stack = e.stack.split(/\r?\n/mg).slice(1).join(os.EOL);
210+
this.throw(e, '[assert]', err.message);
227211
}
228212
}
229213

@@ -234,9 +218,6 @@ class Logger {
234218
return logger(this.format[type](...args));
235219
};
236220
}
237-
if ([ 'debug' ].includes(type)) { // 不再需要 debug
238-
type = 'verbose';
239-
}
240221
const logger = this.getNpmlogMethod(type);
241222
if (typeof logger !== 'function') {
242223
return logger;
@@ -258,7 +239,7 @@ class Logger {
258239
}
259240

260241
getStdoutMethod(type) {
261-
if ([ 'logo', 'json' ].includes(type)) {
242+
if (![ 'info', 'error', 'warn' ].includes(type)) {
262243
type = 'log';
263244
}
264245
return getStdoutMethod(type);

src/logger/levels.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict';
2+
3+
// 自定义等级
4+
module.exports = {
5+
verbose: {
6+
level: 1000,
7+
fg: 'blue',
8+
bg: 'black',
9+
disp: 'verb',
10+
},
11+
info: {
12+
level: 2000,
13+
fg: 'black',
14+
bg: 'blue',
15+
},
16+
timing: {
17+
level: 2500,
18+
fg: 'green',
19+
bg: 'black',
20+
disp: 'timing',
21+
},
22+
http: {
23+
level: 3000,
24+
fg: 'black',
25+
bg: 'cyan',
26+
},
27+
notice: {
28+
level: 3500,
29+
fg: 'blue',
30+
bg: 'black',
31+
disp: 'notice',
32+
},
33+
success: {
34+
level: 3600,
35+
fg: 'black',
36+
bg: 'green',
37+
},
38+
warn: {
39+
level: 4000,
40+
fg: 'black',
41+
bg: 'yellow',
42+
},
43+
error: {
44+
level: 5000,
45+
fg: 'black',
46+
bg: 'red',
47+
disp: 'ERR!',
48+
},
49+
noise: {
50+
level: 10000,
51+
fg: 'black',
52+
bg: 'magenta',
53+
beep: true,
54+
},
55+
};

src/logger/logger.test.js

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,47 @@ describe('Logger', () => {
4949
it('logger npmlog', () => {
5050

5151
const npmlog = require('npmlog');
52-
npmlog.info('abcddd');
52+
npmlog.info('abcddd', 'ttt');
5353

5454
});
5555

56-
5756
it('logger debug', () => {
5857
logger.level = 'silly';
59-
logger.debug('abc');
58+
logger.debug('abcdef');
59+
});
60+
61+
it('logger timing', () => {
62+
logger.timing('abcdef');
63+
});
64+
65+
it('logger http', () => {
66+
logger.http('abcdef');
67+
});
68+
69+
it('logger notice', () => {
70+
logger.notice('abcdef');
71+
});
72+
73+
it('logger noise', () => {
74+
logger.noise('abcdef', 'sdd');
75+
});
76+
77+
it('logger logo', () => {
78+
logger.logo('abcdef', 'sdd');
79+
});
80+
81+
it('logger json', () => {
82+
logger.json('abcdef', 'sdd');
83+
});
84+
85+
it('logger alias', () => {
86+
logger.setAlias('cctv', 'logo');
87+
logger.cctv('abcdef', 'sdd');
88+
});
89+
90+
it('logger group', () => {
91+
const newLogger = logger.newGroup('cctv', 'logo');
92+
newLogger.info('abcdef', 'sdd');
6093
});
6194

6295
});

src/validateSchema/index.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
const Ajv = require('ajv');
4+
const ajv = new Ajv({
5+
errorDataPath: 'configuration',
6+
allErrors: true,
7+
verbose: true,
8+
});
9+
require('ajv-keywords')(ajv, [ 'instanceof' ]);
10+
11+
function validateSchema(schema, options) {
12+
if (Array.isArray(options)) {
13+
const errors = options.map(options => validateObject(schema, options));
14+
errors.forEach((list, idx) => {
15+
list.forEach(function applyPrefix(err) {
16+
err.dataPath = `[${idx}]${err.dataPath}`;
17+
if (err.children) {
18+
err.children.forEach(applyPrefix);
19+
}
20+
});
21+
});
22+
return errors.reduce((arr, items) => {
23+
return arr.concat(items);
24+
}, []);
25+
}
26+
return validateObject(schema, options);
27+
28+
}
29+
30+
function validateObject(schema, options) {
31+
const validate = ajv.compile(schema);
32+
const valid = validate(options);
33+
return valid ? [] : filterErrors(validate.errors);
34+
}
35+
36+
function filterErrors(errors) {
37+
let newErrors = [];
38+
errors.forEach(err => {
39+
const dataPath = err.dataPath;
40+
let children = [];
41+
newErrors = newErrors.filter(oldError => {
42+
if (oldError.dataPath.includes(dataPath)) {
43+
if (oldError.children) {
44+
children = children.concat(oldError.children.slice(0));
45+
}
46+
oldError.children = undefined;
47+
children.push(oldError);
48+
return false;
49+
}
50+
return true;
51+
});
52+
if (children.length) {
53+
err.children = children;
54+
}
55+
newErrors.push(err);
56+
});
57+
58+
return newErrors;
59+
}
60+
61+
module.exports = validateSchema;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
'use strict';
2+
3+
/* global expect */
4+
5+
const validateSchema = require('.');
6+
7+
const schema = {
8+
additionalProperties: false,
9+
properties: {
10+
name: {
11+
description: '名称. ( string )',
12+
type: 'string',
13+
},
14+
},
15+
type: 'object',
16+
};
17+
18+
describe('validateSchema', () => {
19+
20+
it('validate', () => {
21+
const result = validateSchema(schema, {
22+
name: 'test',
23+
});
24+
expect(result.length).toEqual(0);
25+
});
26+
27+
it('validate error', () => {
28+
const result = validateSchema(schema, {
29+
name: 'test',
30+
desc: 'bbb',
31+
});
32+
expect(result.length).toEqual(1);
33+
});
34+
35+
it('validate error2', () => {
36+
const result = validateSchema(schema, {
37+
name: [ 'test' ],
38+
desc: 'bbb',
39+
});
40+
expect(result.length).toEqual(2);
41+
});
42+
43+
});

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,11 @@ aggregate-error@^3.0.0:
606606
clean-stack "^2.0.0"
607607
indent-string "^4.0.0"
608608

609+
ajv-keywords@^3.4.1:
610+
version "3.4.1"
611+
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
612+
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
613+
609614
ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1:
610615
version "6.10.2"
611616
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"

0 commit comments

Comments
 (0)