1 | const fs = require('fs-extra');
|
2 | const { HUBL_EXTENSIONS } = require('./lib/constants');
|
3 | const { validateHubl } = require('./api/validate');
|
4 | const { walk } = require('./lib/walk');
|
5 | const { logger } = require('./logger');
|
6 | const { getExt } = require('./path');
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | async 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 |
|
47 | const getErrorsFromHublValidationObject = validation =>
|
48 | (validation && validation.meta && validation.meta.template_errors) || [];
|
49 |
|
50 | function 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 |
|
56 | function 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 |
|
74 | module.exports = {
|
75 | lint,
|
76 | printHublValidationResult,
|
77 | };
|