All files / packages/sds-stylelint-config/src/utils/global validateProperty.js

0% Statements 0/52
0% Branches 0/58
0% Functions 0/3
0% Lines 0/50

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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136                                                                                                                                                                                                                                                                               
const chalk = require('chalk');
const metadata = require('../../metadata/metadata.js');
const { analyzeFuzzy, removeFromSet } = require('../search');
 
/**
 * Validate Property
 * @param {Object} obj The object from the first Promise that has valuable information about the custom prop
 * @todo Skip scope validation based on stylelint option
 * @returns {Object} Validation object
 */
const validateGlobalProperty = (obj) => {
  if (obj.validate.scope.isComponent || obj.validate.scope.isShared) return { skip: true };
  const results = analyzeFuzzy(obj).filter((item) => item.word);
 
  if (obj.keys.property === 3 && obj.lastKey === 3) {
    obj.customMessage.push(
      `We received "${chalk.bold(
        obj.groups[obj.keys.property],
      )}" as the last value in the custom property. A global styling hook requires a numerical range as the last value.`,
    );
    return {
      valid: false,
      expected: obj.groups[obj.keys.property],
    };
  } // We have a previous customMessage, meaning we have already failed a validation
  else if (obj.customMessage.length > 0) {
    return { skip: true };
  }
  // we're good
  else if (obj.keys.property === 3 && obj.lastKey >= 4) {
    return { valid: true, received: obj.groups[obj.keys.property] };
  }
  // We have unknown keys, lets check if they are optional
  else if (obj.fuzzyKeys.size > 0 && results.length > 0) {
    let valid;
    results.map((item) => {
      // optional property or pairing discovered, can't determine which
      if (obj.keys.category === 2 && !obj.keys.property && obj.keys.role === 4) {
        if (obj.validate.category.received === 'color') {
          valid = { skip: true };
          obj.customMessage.push(
            `We received "${chalk.bold(
              obj.groups[item.key],
            )}" and have high confidence that this should be a pairing. Possible values are ${chalk.bold(
              metadata.global.valid.pairing,
            )}.`,
          );
        } else {
          obj.keys.property = obj.keys.category + 1;
          obj.fuzzyKeys = removeFromSet(obj.fuzzyKeys, obj.keys.property);
          valid = { valid: false, received: obj.groups[item.key] };
          obj.customMessage.push(
            `We received "${chalk.bold(
              obj.groups[item.key],
            )}" and have medium confidence that this could be a property or a pairing. Possible values are ${chalk.bold(
              metadata.global.valid.property,
            )},${chalk.bold(metadata.global.valid.pairing)}.`,
          );
        }
      }
      // We know there are 2 keys unassigned between the category and range and can't determine which is the property
      else if (obj.keys.category === 2 && obj.keys.range >= 4 && results.length >= 2) {
        if (obj.keys.role && obj.groups[obj.keys.role] === 'palette') {
          valid = { skip: true };
        } else if (obj.keys.role && !obj.groups[obj.keys.role] === 'palette') {
          valid = { valid: false, received: item.word };
          obj.customMessage.push(
            `We received "${chalk.bold(
              obj.groups[item.key],
            )}" and have low confidence that this could be a property, or a pairing. Possible values are ${chalk.bold(
              metadata.global.valid.property,
            )},${chalk.bold(metadata.global.valid.pairing)}.`,
          );
        } else {
          valid = { valid: false, received: item.word };
          obj.customMessage.push(
            `We received "${chalk.bold(
              obj.groups[item.key],
            )}" and have low confidence that this could be a property, a pairing, or a role. Possible values are ${chalk.bold(
              metadata.global.valid.property,
            )},${chalk.bold(metadata.global.valid.pairing)},${chalk.bold(metadata.global.valid.role)}.`,
          );
        }
      }
      // optional property discovered since we have a category and a pairing
      else if (obj.keys.category === 2 && !obj.keys.property && obj.keys.pairing === 4) {
        obj.keys.property = obj.keys.category + 1;
        obj.fuzzyKeys = removeFromSet(obj.fuzzyKeys, obj.keys.property);
        valid = {
          valid: false,
          expected: metadata.global.valid.property,
          received: obj.groups[obj.keys.property],
        };
      }
      // --slds-g-font-sizeeee-base
      else if (obj.keys.category === 2 && obj.keys.attribute === 4 && !obj.keys.role) {
        obj.keys.property = obj.keys.category + 1;
        obj.fuzzyKeys = removeFromSet(obj.fuzzyKeys, obj.keys.property);
        valid = {
          valid: false,
          expected: metadata.global.valid.property,
          received: obj.groups[obj.keys.property],
        };
      }
      // optional property discovered since we have a category and a context that is valid as the last key
      else if (obj.keys.category === 2 && obj.keys.context === 4 && !obj.keys.role) {
        obj.keys.property = obj.keys.category + 1;
        obj.fuzzyKeys = removeFromSet(obj.fuzzyKeys, obj.keys.property);
        valid = {
          valid: false,
          expected: metadata.global.valid.property,
          received: obj.groups[obj.keys.property],
        };
      } else if (obj.keys.category === 2 && obj.keys.property && obj.keys.property !== 3) {
        valid = { valid: false, received: obj.groups[item.key] };
        // valid = { skip: true };
        obj.customMessage.push(
          `We received "${chalk.bold(
            obj.groups[item.key],
          )}" and you cannot have keys in between the category and a valid property.`,
        );
      } else {
        valid = { skip: true };
      }
    });
    return valid;
  } else {
    // This is a required key so throw an error if undefined
    // return { valid: false, expected: metadata.global.valid.property };
    // This is an optional key so skip
    return { skip: true };
  }
};
 
module.exports = validateGlobalProperty;