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

96.55% Statements 28/29
66.66% Branches 4/6
100% Functions 4/4
100% Lines 27/27

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 57 58 59 60 61 62 63 64 651x 1x 1x   1x 1x                 63x 63x   2x   2x 4x           4x 4x   4x     2x           2x   2x     2x 2x 2x   2x 2x 2x 2x     2x 2x       1x         1x  
import fs from 'fs-extra';
import path from 'path';
import { constants } from '../../../tools';
 
import log from '../../../logger';
import { getFiles, existsMustBeDir, dumpJSON, loadJSON, sanitize } from '../../../utils';
 
import { DirectoryHandler } from './index';
import DirectoryContext from '..';
import { Asset, ParsedAsset } from '../../../types';
 
type ParsedRules = ParsedAsset<'rules', Asset[]>;
 
function parse(context: DirectoryContext): ParsedRules {
  const rulesFolder = path.join(context.filePath, constants.RULES_DIRECTORY);
  if (!existsMustBeDir(rulesFolder)) return { rules: null }; // Skip
 
  const files: string[] = getFiles(rulesFolder, ['.json']);
 
  const rules = files.map((f) => {
    const rule = {
      ...loadJSON(f, {
        mappings: context.mappings,
        disableKeywordReplacement: context.disableKeywordReplacement,
      }),
    };
    Eif (rule.script) {
      rule.script = context.loadFile(rule.script, constants.RULES_DIRECTORY);
    }
    return rule;
  });
 
  return {
    rules,
  };
}
 
async function dump(context: DirectoryContext): Promise<void> {
  const { rules } = context.assets;
 
  Iif (!rules) return; // Skip, nothing to dump
 
  // Create Rules folder
  const rulesFolder = path.join(context.filePath, constants.RULES_DIRECTORY);
  fs.ensureDirSync(rulesFolder);
  rules.forEach((rule) => {
    // Dump script to file
    const name = sanitize(rule.name);
    const ruleJS = path.join(rulesFolder, `${name}.js`);
    log.info(`Writing ${ruleJS}`);
    fs.writeFileSync(ruleJS, rule.script);
 
    // Dump template metadata
    const ruleFile = path.join(rulesFolder, `${name}.json`);
    dumpJSON(ruleFile, { ...rule, script: `./${name}.js` });
  });
}
 
const rulesHandler: DirectoryHandler<ParsedRules> = {
  parse,
  dump,
};
 
export default rulesHandler;