UNPKG

eslint-plugin-vue

Version:

Official ESLint plugin for Vue.js

156 lines (153 loc) 7.11 kB
'use strict'; const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js'); const require_index = require('../utils/index.js'); const require_slot_scope_attribute$1 = require('./syntaxes/slot-scope-attribute.js'); const require_v_is$1 = require('./syntaxes/v-is.js'); const require_dynamic_directive_arguments$1 = require('./syntaxes/dynamic-directive-arguments.js'); const require_v_slot$1 = require('./syntaxes/v-slot.js'); const require_script_setup$1 = require('./syntaxes/script-setup.js'); const require_style_css_vars_injection$1 = require('./syntaxes/style-css-vars-injection.js'); const require_v_model_argument$1 = require('./syntaxes/v-model-argument.js'); const require_v_model_custom_modifiers$1 = require('./syntaxes/v-model-custom-modifiers.js'); const require_is_attribute_with_vue_prefix$1 = require('./syntaxes/is-attribute-with-vue-prefix.js'); const require_v_memo$1 = require('./syntaxes/v-memo.js'); const require_v_bind_prop_modifier_shorthand$1 = require('./syntaxes/v-bind-prop-modifier-shorthand.js'); const require_v_bind_attr_modifier$1 = require('./syntaxes/v-bind-attr-modifier.js'); const require_define_options$1 = require('./syntaxes/define-options.js'); const require_define_slots$1 = require('./syntaxes/define-slots.js'); const require_define_model$1 = require('./syntaxes/define-model.js'); const require_v_bind_same_name_shorthand$1 = require('./syntaxes/v-bind-same-name-shorthand.js'); //#region lib/rules/no-unsupported-features.js /** * @author Yosuke Ota * See LICENSE file in root directory for full license. */ var require_no_unsupported_features = /* @__PURE__ */ require_rolldown_runtime.__commonJSMin(((exports, module) => { const semver = require("semver"); const utils = require_index.default; /** * @typedef {object} SyntaxRule * @property {string} supported * @property { (context: RuleContext) => TemplateListener } [createTemplateBodyVisitor] * @property { (context: RuleContext) => RuleListener } [createScriptVisitor] */ const FEATURES = { "slot-scope-attribute": require_slot_scope_attribute$1.default, "dynamic-directive-arguments": require_dynamic_directive_arguments$1.default, "v-slot": require_v_slot$1.default, "script-setup": require_script_setup$1.default, "style-css-vars-injection": require_style_css_vars_injection$1.default, "v-model-argument": require_v_model_argument$1.default, "v-model-custom-modifiers": require_v_model_custom_modifiers$1.default, "v-is": require_v_is$1.default, "is-attribute-with-vue-prefix": require_is_attribute_with_vue_prefix$1.default, "v-memo": require_v_memo$1.default, "v-bind-prop-modifier-shorthand": require_v_bind_prop_modifier_shorthand$1.default, "v-bind-attr-modifier": require_v_bind_attr_modifier$1.default, "define-options": require_define_options$1.default, "define-slots": require_define_slots$1.default, "define-model": require_define_model$1.default, "v-bind-same-name-shorthand": require_v_bind_same_name_shorthand$1.default }; const SYNTAX_NAMES = Object.keys(FEATURES); const cache = /* @__PURE__ */ new Map(); /** * Get the `semver.Range` object of a given range text. * @param {string} x The text expression for a semver range. * @returns {semver.Range} The range object of a given range text. * It's null if the `x` is not a valid range text. */ function getSemverRange(x) { const s = String(x); let ret = cache.get(s) || null; if (!ret) { try { ret = new semver.Range(s); } catch {} cache.set(s, ret); } return ret; } module.exports = { meta: { type: "suggestion", docs: { description: "disallow unsupported Vue.js syntax on the specified version", categories: void 0, url: "https://eslint.vuejs.org/rules/no-unsupported-features.html" }, fixable: "code", schema: [{ type: "object", properties: { version: { type: "string" }, ignores: { type: "array", items: { enum: SYNTAX_NAMES }, uniqueItems: true } }, additionalProperties: false }], messages: { forbiddenSlotScopeAttribute: "`slot-scope` are not supported except Vue.js \">=2.5.0 <3.0.0\".", forbiddenDynamicDirectiveArguments: "Dynamic arguments are not supported until Vue.js \"2.6.0\".", forbiddenVSlot: "`v-slot` are not supported until Vue.js \"2.6.0\".", forbiddenScriptSetup: "`<script setup>` is not supported until Vue.js \"2.7.0\".", forbiddenStyleCssVarsInjection: "SFC CSS variable injection is not supported until Vue.js \">=3.0.3 || >=2.7.0 <3.0.0\".", forbiddenVModelArgument: "Argument on `v-model` is not supported until Vue.js \"3.0.0\".", forbiddenVModelCustomModifiers: "Custom modifiers on `v-model` are not supported until Vue.js \"3.0.0\".", forbiddenVIs: "`v-is` are not supported until Vue.js \"3.0.0\".", forbiddenIsAttributeWithVuePrefix: "`is=\"vue:\"` are not supported until Vue.js \"3.1.0\".", forbiddenVMemo: "`v-memo` are not supported until Vue.js \"3.2.0\".", forbiddenVBindPropModifierShorthand: "`.prop` shorthand are not supported until Vue.js \"3.2.0\".", forbiddenVBindAttrModifier: "`.attr` modifiers on `v-bind` are not supported until Vue.js \"3.2.0\".", forbiddenDefineOptions: "`defineOptions()` macros are not supported until Vue.js \"3.3.0\".", forbiddenDefineSlots: "`defineSlots()` macros are not supported until Vue.js \"3.3.0\".", forbiddenDefineModel: "`defineModel()` macros are not supported until Vue.js \"3.4.0\".", forbiddenVBindSameNameShorthand: "`v-bind` same-name shorthand is not supported until Vue.js \"3.4.0\"." } }, create(context) { const { version, ignores } = Object.assign({ version: null, ignores: [] }, context.options[0] || {}); if (!version) return {}; const versionRange = getSemverRange(version); /** * Check whether a given case object is full-supported on the configured node version. * @param {SyntaxRule} aCase The case object to check. * @returns {boolean} `true` if it's supporting. */ function isNotSupportingVersion(aCase) { return !semver.subset(versionRange, getSemverRange(aCase.supported)); } /** @type {TemplateListener} */ let templateBodyVisitor = {}; /** @type {RuleListener} */ let scriptVisitor = {}; for (const syntaxName of SYNTAX_NAMES) { /** @type {SyntaxRule} */ const syntax = FEATURES[syntaxName]; if (ignores.includes(syntaxName) || !isNotSupportingVersion(syntax)) continue; if (syntax.createTemplateBodyVisitor) { const visitor = syntax.createTemplateBodyVisitor(context); templateBodyVisitor = utils.compositingVisitors(templateBodyVisitor, visitor); } if (syntax.createScriptVisitor) { const visitor = syntax.createScriptVisitor(context); scriptVisitor = utils.compositingVisitors(scriptVisitor, visitor); } } return utils.defineTemplateBodyVisitor(context, templateBodyVisitor, scriptVisitor); } }; })); //#endregion Object.defineProperty(exports, 'default', { enumerable: true, get: function () { return require_no_unsupported_features(); } });