All files / lib/resource-types text.js

100% Statements 112/112
100% Branches 16/16
100% Functions 5/5
100% Lines 112/112

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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 1131x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 2x 3x 1x 1x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 5x 5x 4x 4x 4x 1x 1x 1x 4x 1x 1x 1x 1x 1x 1x 4x 1x 1x 1x 1x 4x 5x 5x 6x 1x 1x 1x 1x 1x 6x 5x 5x 6x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
"use strict";
/**
 * @module resource-types/text
 */
import fs from "fs";
 
/**
 * Set version value in the text resource, replacing all matches of the regex.
 *
 * @param {String} version - version value to set
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the text file
 * @param {String} resource.params.regex - regular expression which matches
 *   the version value
 * @param {Object} opts - optional settings
 * @param {Boolean} [opts.dryRun] - when true, text file won't be modified
 * @param {Function} cb - standard cb(err, result) callback
 */
function setVersion(version, resource, opts, cb) {
  const regex = resource.params.regex;
  let data = fs.readFileSync(resource.path, "UTF-8");
  data = data.replaceAll(new RegExp(regex, "g"), version);
  if (!opts.dryRun) {
    fs.writeFile(resource.path, data, cb);
  } else {
    cb();
  }
}
 
/**
 * Get version value from the text resource, using the first match of the
 * regex.
 *
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the text file
 * @param {String} resource.params.regex - regular expression which matches
 *   the version value
 * @param {Function} cb - standard cb(err, result) callback, result is the
 *   version value
 */
function getVersion(resource, cb) {
  const regex = resource.params.regex;
 
  function readCb(err, result) {
    let version;
    if (!err) {
      const data = result.match(new RegExp(regex));
      version = data[0];
    }
    cb(err, version);
  }
  fs.readFile(resource.path, "UTF-8", readCb);
}
 
/**
 * Check that the text resource is ready for release, i.e. the regex is valid
 * and it matches a non-empty version value.
 *
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the text file
 * @param {String} resource.params.regex - regular expression which matches
 *   the version value
 * @param {Function} cb - standard cb(err, result) callback, result is true
 *   when the resource is ready for release, an error is passed when the regex
 *   is not configured, is invalid, or doesn't match a non-empty version
 */
function isReadyForRelease(resource, cb) {
  const regex = resource.params && resource.params.regex;
 
  function readCb(err, result) {
    let ready;
    if (!err) {
      try {
        const match = result.match(new RegExp(regex));
        if (!match) {
          err = new Error(
            `Regex ${regex} does not match any version in text resource ${resource.path}`,
          );
        } else if (match[0] === "") {
          err = new Error(
            `Regex ${regex} matches an empty version in text resource ${resource.path}`,
          );
        } else {
          ready = true;
        }
      } catch (regexErr) {
        err = new Error(
          `Invalid regex ${regex} for text resource ${resource.path}. Error: ${regexErr.message}`,
        );
      }
    }
    cb(err, ready);
  }
  if (!regex) {
    cb(
      new Error(
        `text resource ${resource.path} has no params.regex configured`,
      ),
    );
  } else {
    fs.readFile(resource.path, "UTF-8", readCb);
  }
}
 
const exports = {
  setReleaseVersion: setVersion,
  setPostReleaseVersion: setVersion,
  getVersion: getVersion,
  isReadyForRelease: isReadyForRelease,
};
 
export { exports as default };