UNPKG

2.07 kBJavaScriptView Raw
1const fs = require('fs-extra');
2const { HUBL_EXTENSIONS } = require('./lib/constants');
3const { validateHubl } = require('./api/validate');
4const { walk } = require('./lib/walk');
5const { logger } = require('./logger');
6const { getExt } = require('./path');
7
8/**
9 * @async
10 * @param {number} portalId
11 * @param {string} filepath
12 * @param {function} callback - Optional
13 * @returns {Promise<Array>}
14 * @throws
15 */
16async function lint(portalId, filepath, callback) {
17 const stats = await fs.stat(filepath);
18 const files = stats.isDirectory() ? await walk(filepath) : [filepath];
19 if (!(files && files.length)) {
20 return [];
21 }
22 return Promise.all(
23 files
24 .filter(file => HUBL_EXTENSIONS.has(getExt(file)))
25 .map(async file => {
26 const source = await fs.readFile(file, { encoding: 'utf8' });
27 if (!(source && source.trim())) {
28 const result = { file, validation: null };
29 if (callback) {
30 callback(result);
31 }
32 return result;
33 }
34 const validation = await validateHubl(portalId, source);
35 const result = {
36 file,
37 validation,
38 };
39 if (callback) {
40 callback(result);
41 }
42 return result;
43 })
44 );
45}
46
47const getErrorsFromHublValidationObject = validation =>
48 (validation && validation.meta && validation.meta.template_errors) || [];
49
50function printHublValidationError(err) {
51 const { severity, message, lineno, startPosition } = err;
52 const method = severity === 'FATAL' ? 'error' : 'warn';
53 logger[method]('[%d, %d]: %s', lineno, startPosition, message);
54}
55
56function printHublValidationResult({ file, validation }) {
57 let count = 0;
58 const errors = getErrorsFromHublValidationObject(validation);
59 if (!errors.length) {
60 return count;
61 }
62 logger.group(file);
63 errors.forEach(err => {
64 if (err.reason !== 'SYNTAX_ERROR') {
65 return;
66 }
67 ++count;
68 printHublValidationError(err);
69 });
70 logger.groupEnd(file);
71 return count;
72}
73
74module.exports = {
75 lint,
76 printHublValidationResult,
77};