ocrmnav
Version:
DevStack - The Complete Developer Toolkit - Virtual file system, workflow automation, and more than 65+ other development tools / features in one seamless extension. Cutting down dev times never before seen.
807 lines (639 loc) • 21.8 kB
JavaScript
;
exports.id = 91;
exports.ids = [91];
exports.modules = {
/***/ 1523:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ isStandardSyntaxValue)
/* harmony export */ });
/* harmony import */ var _hasInterpolation_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1524);
/**
* Check whether a value is standard
*
* @param {string} value
* @returns {boolean}
*/
function isStandardSyntaxValue(value) {
let normalizedValue = value;
// Ignore operators before variables (example -$variable)
if (/^[-+*/]/.test(value.charAt(0))) {
normalizedValue = normalizedValue.slice(1);
}
// SCSS variable (example $variable)
// styled component interpolation (example ${foo => foo.bar})
if (normalizedValue.startsWith('$')) {
return false;
}
// SCSS namespace (example namespace.$variable)
if (/^.+\.\$/.test(value)) {
return false;
}
// SCSS namespace (example namespace.function-name())
if (/^.+\.[-\w]+\(/.test(value)) {
return false;
}
// Less variable
if (normalizedValue.startsWith('@')) {
return false;
}
// SCSS or Less interpolation
if ((0,_hasInterpolation_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(normalizedValue)) {
return false;
}
// WebExtension replacement keyword used by Chrome/Firefox
// more information: https://developer.chrome.com/extensions/i18n
// and https://github.com/stylelint/stylelint/issues/4707
if (/__MSG_\S+__/.test(value)) {
return false;
}
return true;
}
/***/ }),
/***/ 1524:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ hasInterpolation)
/* harmony export */ });
/* harmony import */ var _hasLessInterpolation_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1525);
/* harmony import */ var _hasPsvInterpolation_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1526);
/* harmony import */ var _hasScssInterpolation_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1527);
/* harmony import */ var _hasTplInterpolation_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1528);
/**
* Check whether a string has interpolation
*
* @param {string} string
* @returns {boolean} If `true`, a string has interpolation
*/
function hasInterpolation(string) {
// SCSS or Less interpolation
if (
(0,_hasLessInterpolation_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(string) ||
(0,_hasScssInterpolation_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(string) ||
(0,_hasTplInterpolation_mjs__WEBPACK_IMPORTED_MODULE_3__["default"])(string) ||
(0,_hasPsvInterpolation_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(string)
) {
return true;
}
return false;
}
/***/ }),
/***/ 1525:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ hasLessInterpolation)
/* harmony export */ });
const HAS_LESS_INTERPOLATION = /@\{.+?\}/;
/**
* Check whether a string has less interpolation
*
* @param {string} string
* @returns {boolean} If `true`, a string has less interpolation
*/
function hasLessInterpolation(string) {
return HAS_LESS_INTERPOLATION.test(string);
}
/***/ }),
/***/ 1526:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ hasPsvInterpolation)
/* harmony export */ });
const HAS_PSV_INTERPOLATION = /\$\(.+?\)/;
/**
* Check whether a string has postcss-simple-vars interpolation
*
* @param {string} string
* @returns {boolean}
*/
function hasPsvInterpolation(string) {
return HAS_PSV_INTERPOLATION.test(string);
}
/***/ }),
/***/ 1527:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ hasScssInterpolation)
/* harmony export */ });
const HAS_SCSS_INTERPOLATION = /#\{.+?\}/s;
/**
* Check whether a string has scss interpolation
*
* @param {string} string
* @returns {boolean}
*/
function hasScssInterpolation(string) {
return HAS_SCSS_INTERPOLATION.test(string);
}
/***/ }),
/***/ 1528:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ hasTplInterpolation)
/* harmony export */ });
const HAS_TPL_INTERPOLATION = /\{.+?\}/s;
/**
* Check whether a string has JS template literal interpolation or HTML-like template
*
* @param {string} string
* @returns {boolean} If `true`, a string has template literal interpolation
*/
function hasTplInterpolation(string) {
return HAS_TPL_INTERPOLATION.test(string);
}
/***/ }),
/***/ 1636:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1591);
/* harmony import */ var _utils_findFontFamily_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1637);
/* harmony import */ var _utils_isStandardSyntaxValue_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1523);
/* harmony import */ var _utils_isVariable_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1641);
/* harmony import */ var _utils_report_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(945);
/* harmony import */ var _utils_ruleMessages_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(950);
/* harmony import */ var _utils_validateOptions_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(873);
const ruleName = 'font-family-name-quotes';
const messages = (0,_utils_ruleMessages_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])(ruleName, {
expected: (family) => `Expected quotes around "${family}"`,
rejected: (family) => `Unexpected quotes around "${family}"`,
});
const meta = {
url: 'https://stylelint.io/user-guide/rules/font-family-name-quotes',
fixable: true,
};
/**
* @param {string} font
* @returns {boolean}
*/
function isSystemFontKeyword(font) {
if (_reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_0__.prefixedSystemFonts.has(font)) {
return true;
}
if (font === 'BlinkMacSystemFont') {
return true;
}
return false;
}
/**
* "To avoid mistakes in escaping, it is recommended to quote font family names
* that contain white space, digits, or punctuation characters other than hyphens"
* (https://www.w3.org/TR/CSS2/fonts.html#font-family-prop)
*
* @param {string} family
* @returns {boolean}
*/
function quotesRecommended(family) {
return !/^[-a-z]+$/i.test(family);
}
/**
* Quotes are required if the family is not a valid CSS identifier
* (regexes from https://mathiasbynens.be/notes/unquoted-font-family)
*
* @param {string} family
* @returns {boolean}
*/
function quotesRequired(family) {
return family
.split(/\s+/)
.some((word) => /^(?:-?\d|--)/.test(word) || !/^[-\w\u{00A0}-\u{10FFFF}]+$/u.test(word));
}
/**
* @typedef {{
* name: string,
* rawName: string,
* hasQuotes: boolean,
* sourceIndex: number,
* resetIndexes: (offset: number) => void,
* removeQuotes: () => void,
* addQuotes: () => void,
* }} MutableNode
*/
/**
* @param {import('postcss-value-parser').Node[]} fontFamilies
* @param {import('postcss').Declaration} decl
* @returns {MutableNode[]}
*/
const makeMutableFontFamilies = (fontFamilies, decl) => {
/**
* @type {MutableNode[]}
*/
const mutableNodes = [];
fontFamilies.forEach((fontFamily, idx) => {
const quote = 'quote' in fontFamily && fontFamily.quote;
const name = fontFamily.value;
/** @type {MutableNode} */
const newNode = {
name,
rawName: quote ? `${quote}${name}${quote}` : name,
sourceIndex: fontFamily.sourceIndex,
hasQuotes: Boolean(quote),
resetIndexes(offset) {
mutableNodes.slice(idx + 1).forEach((n) => (n.sourceIndex += offset));
},
removeQuotes() {
if (this.hasQuotes === false) return;
const openIndex = this.sourceIndex;
const closeIndex = openIndex + this.name.length + 2;
this.hasQuotes = false;
decl.value = decl.value.slice(0, openIndex) + this.name + decl.value.substring(closeIndex);
this.resetIndexes(-2);
},
addQuotes() {
if (this.hasQuotes === true) return;
const openIndex = this.sourceIndex;
const closeIndex = openIndex + this.name.length;
this.hasQuotes = true;
const fixedName = `"${this.name}"`;
decl.value = decl.value.slice(0, openIndex) + fixedName + decl.value.substring(closeIndex);
this.resetIndexes(2);
},
};
mutableNodes.push(newNode);
});
return mutableNodes;
};
/** @type {import('stylelint').CoreRules[ruleName]} */
const rule = (primary) => {
return (root, result) => {
const validOptions = (0,_utils_validateOptions_mjs__WEBPACK_IMPORTED_MODULE_6__["default"])(result, ruleName, {
actual: primary,
possible: ['always-where-required', 'always-where-recommended', 'always-unless-keyword'],
});
if (!validOptions) {
return;
}
root.walkDecls(/^font(-family)?$/i, (decl) => {
if (!(0,_utils_isStandardSyntaxValue_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(decl.value)) {
return;
}
let fontFamilyNodes = makeMutableFontFamilies((0,_utils_findFontFamily_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(decl.value), decl);
if (fontFamilyNodes.length === 0) {
return;
}
for (const fontFamilyNode of fontFamilyNodes) {
checkFamilyName(fontFamilyNode, decl);
}
});
/**
* @param {MutableNode} fontFamilyNode
* @param {import('postcss').Declaration} decl
*/
function checkFamilyName(fontFamilyNode, decl) {
const { name: family, rawName: rawFamily, hasQuotes } = fontFamilyNode;
if ((0,_utils_isVariable_mjs__WEBPACK_IMPORTED_MODULE_3__["default"])(rawFamily)) {
return;
}
// Disallow quotes around (case-insensitive) keywords
// and system font keywords in all cases
if (_reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_0__.fontFamilyKeywords.has(family.toLowerCase()) || isSystemFontKeyword(family)) {
if (hasQuotes) {
return complain('rejected', fontFamilyNode, decl);
}
return;
}
const required = quotesRequired(family);
const recommended = quotesRecommended(family);
switch (primary) {
case 'always-unless-keyword':
if (!hasQuotes) {
return complain('expected', fontFamilyNode, decl);
}
return;
case 'always-where-recommended':
if (!recommended && hasQuotes) {
return complain('rejected', fontFamilyNode, decl);
}
if (recommended && !hasQuotes) {
return complain('expected', fontFamilyNode, decl);
}
return;
case 'always-where-required':
if (!required && hasQuotes) {
return complain('rejected', fontFamilyNode, decl);
}
if (required && !hasQuotes) {
return complain('expected', fontFamilyNode, decl);
}
}
}
/**
* @param {keyof messages} messageType
* @param {MutableNode} fontFamilyNode
* @param {import('postcss').Declaration} decl
*/
function complain(messageType, fontFamilyNode, decl) {
const { name, rawName } = fontFamilyNode;
const fix = () => {
return messageType === 'expected'
? fontFamilyNode.addQuotes()
: fontFamilyNode.removeQuotes();
};
(0,_utils_report_mjs__WEBPACK_IMPORTED_MODULE_4__["default"])({
result,
ruleName,
message: messages[messageType],
messageArgs: [name],
node: decl,
word: rawName,
fix: {
apply: fix,
node: decl,
},
});
}
};
};
rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (rule);
/***/ }),
/***/ 1637:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ findFontFamily)
/* harmony export */ });
/* harmony import */ var postcss_value_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1514);
/* harmony import */ var _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1591);
/* harmony import */ var _validateTypes_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(579);
/* harmony import */ var _isNumbery_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1638);
/* harmony import */ var _isStandardSyntaxValue_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1523);
/* harmony import */ var _isValidFontSize_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1639);
/* harmony import */ var _isVariable_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1641);
const nodeTypesToCheck = new Set(['word', 'string', 'space', 'div']);
/** @typedef {import('postcss-value-parser').Node} Node */
/**
* @param {Node} firstNode
* @param {Node} secondNode
* @param {string | null} charactersBetween
* @returns {Node}
*/
function joinValueNodes(firstNode, secondNode, charactersBetween) {
firstNode.value = firstNode.value + charactersBetween + secondNode.value;
return firstNode;
}
/**
* @param {Node} valueNode
* @returns {valueNode is postcssValueParser.DivNode & { value: ',' }}
*/
const isCommaDiv = (valueNode) => valueNode.type === 'div' && valueNode.value === ',';
/**
* Get the font-families within a `font` shorthand property value.
*
* @param {string} value
* @returns {Node[]} Collection font-family nodes
*/
function findFontFamily(value) {
/** @type {Node[]} */
const fontFamilies = [];
const valueNodes = postcss_value_parser__WEBPACK_IMPORTED_MODULE_0__(value);
const { nodes: children } = valueNodes;
// Handle `inherit`, `initial` and etc
if (children.length === 1 && children[0] && _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__.basicKeywords.has(children[0].value.toLowerCase())) {
return [children[0]];
}
let needMergeNodesByValue = false;
/** @type {string | null} */
let mergeCharacters = null;
valueNodes.walk((valueNode, index, nodes) => {
if (valueNode.type === 'function') {
return false;
}
if (!nodeTypesToCheck.has(valueNode.type)) {
return;
}
const valueLowerCase = valueNode.value.toLowerCase();
// Ignore non standard syntax
if (!(0,_isStandardSyntaxValue_mjs__WEBPACK_IMPORTED_MODULE_4__["default"])(valueLowerCase)) {
return;
}
// Ignore variables
if ((0,_isVariable_mjs__WEBPACK_IMPORTED_MODULE_6__["default"])(valueLowerCase)) {
return;
}
const isFontFamilyKeyword = _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__.fontFamilyKeywords.has(valueLowerCase);
// Ignore keywords for other font parts
if (!isFontFamilyKeyword && _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__.fontShorthandKeywords.has(valueLowerCase)) {
return;
}
// Ignore font-sizes
// NOTE: `math` is a keyword for both `font-family` and `font-size`.
if (!isFontFamilyKeyword && (0,_isValidFontSize_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])(valueNode.value)) {
return;
}
const nextNode = nodes[index + 1];
const prevNode = nodes[index - 1];
const prevPrevNode = nodes[index - 2];
const allPrevNodes = nodes.slice(0, index);
// When the value is a keyword for both `font-family` and `font-size` (e.g. `math`),
// if its next node is a comma, or if it is already the last node, or if there is any comma before it,
// then treat it as a `font-family` keyword, otherwise treat it as a `font-size` keyword.
if (
isFontFamilyKeyword &&
_reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__.fontSizeKeywords.has(valueLowerCase) &&
!(!nextNode || isCommaDiv(nextNode) || allPrevNodes.find(isCommaDiv))
)
return;
// Ignore anything come after a <font-size>/, because it's a line-height
if (prevNode && prevNode.value === '/' && prevPrevNode && (0,_isValidFontSize_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])(prevPrevNode.value)) {
return;
}
// Ignore number values
if ((0,_isNumbery_mjs__WEBPACK_IMPORTED_MODULE_3__["default"])(valueLowerCase)) {
return;
}
// Detect when a space or comma is dividing a list of font-families, and save the joining character.
if (
(valueNode.type === 'space' || (valueNode.type === 'div' && valueNode.value !== ',')) &&
fontFamilies.length !== 0
) {
needMergeNodesByValue = true;
mergeCharacters = valueNode.value;
return;
}
if (valueNode.type === 'space' || valueNode.type === 'div') {
return;
}
const fontFamily = valueNode;
if (needMergeNodesByValue) {
const lastFontFamily = fontFamilies[fontFamilies.length - 1];
(0,_validateTypes_mjs__WEBPACK_IMPORTED_MODULE_2__.assert)(lastFontFamily);
joinValueNodes(lastFontFamily, fontFamily, mergeCharacters);
needMergeNodesByValue = false;
mergeCharacters = null;
} else {
fontFamilies.push(fontFamily);
}
});
return fontFamilies;
}
/***/ }),
/***/ 1638:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ isNumbery)
/* harmony export */ });
/**
* Check whether it's a number or a number-like string:
* i.e. when coerced to a number it == itself.
*
* @param {string | number} value
*/
function isNumbery(value) {
return value.toString().trim().length !== 0 && Number(value) == value; // eslint-disable-line eqeqeq
}
/***/ }),
/***/ 1639:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ isValidFontSize)
/* harmony export */ });
/* harmony import */ var postcss_value_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1514);
/* harmony import */ var _reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1591);
/* harmony import */ var _reference_units_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1640);
/**
* Check if a word is a font-size value.
*
* @param {string} word
* @returns {boolean}
*/
function isValidFontSize(word) {
if (!word) {
return false;
}
if (_reference_keywords_mjs__WEBPACK_IMPORTED_MODULE_1__.fontSizeKeywords.has(word)) {
return true;
}
const numberUnit = postcss_value_parser__WEBPACK_IMPORTED_MODULE_0__.unit(word);
if (!numberUnit) {
return false;
}
const unit = numberUnit.unit;
if (unit === '%') {
return true;
}
if (_reference_units_mjs__WEBPACK_IMPORTED_MODULE_2__.lengthUnits.has(unit.toLowerCase())) {
return true;
}
return false;
}
/***/ }),
/***/ 1640:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ lengthUnits: () => (/* binding */ lengthUnits),
/* harmony export */ resolutionUnits: () => (/* binding */ resolutionUnits),
/* harmony export */ units: () => (/* binding */ units)
/* harmony export */ });
/* harmony import */ var _utils_uniteSets_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1537);
/** @type {ReadonlySet<string>} */
const lengthUnits = new Set([
// Font-relative length units
'cap',
'ch',
'em',
'ex',
'ic',
'lh',
'rcap',
'rch',
'rem',
'rex',
'ric',
'rlh',
// Viewport-percentage lengths
'dvb',
'dvh',
'dvi',
'dvmax',
'dvmin',
'dvw',
'lvb',
'lvh',
'lvi',
'lvmax',
'lvmin',
'lvw',
'svb',
'svh',
'svi',
'svmax',
'svmin',
'svw',
'vb',
'vh',
'vi',
'vw',
'vmin',
'vmax',
'vm',
// Absolute length units
'px',
'mm',
'cm',
'in',
'pt',
'pc',
'q',
'mozmm',
// Flexible length units
'fr',
// Container query units
'cqw',
'cqh',
'cqi',
'cqb',
'cqmin',
'cqmax',
]);
/** @type {ReadonlySet<string>} */
const resolutionUnits = new Set(['dpi', 'dpcm', 'dppx', 'x']);
/** @type {ReadonlySet<string>} */
const units = (0,_utils_uniteSets_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(lengthUnits, resolutionUnits, [
// Relative length units
'%',
// Time length units
's',
'ms',
// Angle
'deg',
'grad',
'turn',
'rad',
// Frequency
'Hz',
'kHz',
]);
/***/ }),
/***/ 1641:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ isVariable)
/* harmony export */ });
/**
* Check whether a word is a variable i.e var(--custom-property).
*
* @param {string} word
* @returns {boolean}
*/
function isVariable(word) {
return word.toLowerCase().startsWith('var(');
}
/***/ })
};
;
//# sourceMappingURL=91.extension.js.map