UNPKG

5.11 kBJavaScriptView Raw
1const Joi = require('@hapi/joi');
2const logger = require('../utils/logger');
3
4const createSchema = ((fn) => fn(Joi));
5
6const validate = (obj, schema) => {
7 return new Promise((resolve) => {
8 const result = Joi.validate(obj, schema);
9
10 if (result.error) {
11 /* eslint-disable-next-line no-underscore-dangle */
12 delete result.error._object;
13 logger.warn('物料数据校验不通过');
14 console.log(result.error);
15 }
16 resolve(true);
17 });
18};
19
20const authorSchema = createSchema((joi) => [joi.string().allow(''), joi.object().keys({
21 name: joi.string(),
22 email: joi.string().email(),
23}).unknown()]);
24
25const componentSchema = createSchema((joi) => joi.object().keys({
26 name: joi.string().required(), // (必选)名称
27 title: joi.string().required(),
28 description: joi.string().required(), // (必选)描述
29 homepage: joi.string().uri().required(), // (必选)预览地址
30 categories: joi.array(), // (可选)分类
31 category: joi.string().allow(''), // (必选)分类,允许其他分类
32 repository: joi.string().uri(), // (可选)源码地址
33 source: joi.object().keys({ // (必选)描述安装方式
34 type: joi.string().only(['npm']), // (必选)安装方式 npm
35 npm: joi.string().required(), // (必选)npm package name
36 version: joi.string().required(), // (必选)版本号
37 registry: joi.string().uri().required(), // (必选)npm 源
38 author: authorSchema, // (可选)作者信息
39 }),
40 dependencies: joi.object().required(), // (必选)依赖关系
41 publishTime: joi.string().isoDate().required(), // (必选)发布时间
42 updateTime: joi.string().isoDate().required(), // (必选)最后更新时间
43}).unknown());
44
45const blockSchema = createSchema((joi) => joi.object().keys({
46 name: joi.string().required(), // (必选)名称
47 title: joi.string().required(),
48 description: joi.string().required(), // (必选)描述
49 homepage: joi.string().uri().required(), // (必选)预览地址
50 categories: joi.array(), // (可选)分类
51 category: joi.string().allow(''), // (必选)分类,允许其他分类
52 repository: joi.string().uri().required(), // (必选)源码地址
53 source: joi.object().keys({ // (必选)描述安装方式
54 type: joi.string().only(['npm']), // (必选)安装方式 npm
55 npm: joi.string().required(), // (必选)npm package name
56 version: joi.string().required(), // (必选)版本号
57 registry: joi.string().uri().required(), // (必选)npm 源
58 sourceCodeDirectory: joi.string().uri({ relativeOnly: true }).required(),
59 author: authorSchema, // (可选)作者信息
60 }),
61 screenshot: joi.string().uri().required(), // (必选)截图
62 screenshots: joi.array().items(joi.string().uri()), // (可选)多张截图
63 dependencies: joi.object().required(), // (必选)依赖关系
64 publishTime: joi.string().isoDate().required(), // (必选)发布时间
65 updateTime: joi.string().isoDate().required(), // (必选)最后更新时间
66}).unknown());
67
68const scaffoldSchema = createSchema((joi) => joi.object().keys({
69 name: joi.string().required(), // (必选)名称
70 title: joi.string().required(),
71 description: joi.string().required(), // (必选)描述
72 homepage: joi.string().uri().required(), // (必选)预览地址
73 category: joi.string().allow(''), // (必选)分类
74 repository: joi.string().uri().required(), // (必选)源码地址
75 source: joi.object().keys({ // (必选)描述安装方式
76 type: joi.string().only(['npm']), // (必选)安装方式 npm
77 npm: joi.string().required(), // (必选)npm package name
78 version: joi.string().required(), // (必选)版本号
79 registry: joi.string().uri().required(), // (必选)npm 源
80 author: authorSchema, // (可选)作者信息
81 }),
82 screenshot: joi.string().uri().required(), // (必选)截图
83 screenshots: joi.array().items(joi.string().uri()), // (必选)站点模板预览需要多张截图
84 dependencies: joi.object().required(), // (必选)依赖关系
85 publishTime: joi.string().isoDate().required(), // (必选)发布时间
86 updateTime: joi.string().isoDate().required(), // (必选)最后更新时间
87}).unknown());
88
89const materialSchema = createSchema((joi) => joi.object().keys({
90 type: joi.string().required(),
91 name: joi.string().required(),
92 description: joi.string(),
93 logo: joi.string().uri(),
94 homepage: joi.string().uri(),
95 author: authorSchema,
96 components: joi.array().items(componentSchema).required(),
97 blocks: joi.array().items(blockSchema).required(),
98 scaffolds: joi.array().items(scaffoldSchema).required(),
99}).unknown());
100
101const validateMaterial = (obj) => validate(obj, materialSchema);
102const validateComponent = (obj) => validate(obj, componentSchema);
103const validateBlock = (obj) => validate(obj, blockSchema);
104const validateScaffold = (obj) => validate(obj, scaffoldSchema);
105
106module.exports = {
107 validateMaterial,
108 validateComponent,
109 validateBlock,
110 validateScaffold,
111};