All files / src/context/yaml/handlers rules.ts

95.65% Statements 22/23
75% Branches 3/4
100% Functions 4/4
95.45% Lines 21/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 571x 1x   1x 1x                 41x   41x   2x   1x                 6x   6x         6x 6x   6x   2x 2x 2x 2x 2x     6x     1x         1x  
import path from 'path';
import fs from 'fs-extra';
 
import { sanitize } from '../../../utils';
import log from '../../../logger';
 
import { YAMLHandler } from '.';
import YAMLContext from '..';
import { Asset, ParsedAsset } from '../../../types';
 
type ParsedRules = ParsedAsset<'rules', Asset[]>;
 
async function parse(context: YAMLContext): Promise<ParsedRules> {
  const { rules } = context.assets;
 
  if (!rules) return { rules: null };
 
  return {
    rules: [
      ...rules.map((rule) => ({
        ...rule,
        script: context.loadFile(rule.script),
      })),
    ],
  };
}
 
async function dump(context: YAMLContext): Promise<ParsedRules> {
  let { rules } = context.assets;
 
  Iif (!rules) {
    return { rules: null };
  }
 
  // Create Rules folder
  const rulesFolder = path.join(context.basePath, 'rules');
  fs.ensureDirSync(rulesFolder);
 
  rules = rules.map((rule) => {
    // Dump rule to file
    const scriptName = sanitize(`${rule.name}.js`);
    const scriptFile = path.join(rulesFolder, scriptName);
    log.info(`Writing ${scriptFile}`);
    fs.writeFileSync(scriptFile, rule.script);
    return { ...rule, script: `./rules/${scriptName}` };
  });
 
  return { rules };
}
 
const rulesHandler: YAMLHandler<ParsedRules> = {
  parse,
  dump,
};
 
export default rulesHandler;