UNPKG

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
"use strict"; 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