function _getTargetSkips(targetStr) {
      const targetSkips = [];
      let wasAlphaNum = false;
      let wasUpperCase = false;

      for (let i = 0, len = targetStr.length; i < len; ++i) {
        const code = targetStr.charCodeAt(i);
        const isAlphaNum = _isCodeAlphaNum(code);
        const isUpperCase = _isUpperCase(code);

        if ((isAlphaNum && !wasAlphaNum) || (isUpperCase && !wasUpperCase) || _isCodePunctuation(code)) {
          targetSkips.push(i);
        }

        wasAlphaNum = isAlphaNum;
        wasUpperCase = isUpperCase;
      }

      // We push the length as the last skip so when matching
      // every range aligns between skip[i] and skip[i + 1]
      // and we don't have to do extraneous overflow checks
      targetSkips.push(targetStr.length);

      // NOTE: these can possibly be cached on the items for a faster search next time
      return targetSkips;
    }
A skip index marks word and punctuation boundaries
We use this to skip around the targetStr and quickly find prefix matches
@param {string} targetStr
@returns {number[]}