77const utils = require ( '../utils' )
88
99/**
10- * @typedef { 'script-setup' | 'composition' | 'composition-vue2' | 'options' } PreferOption
10+ * @typedef { 'script-setup' | 'script-setup-vapor' | ' composition' | 'composition-vue2' | 'options' } PreferOption
1111 *
1212 * @typedef {PreferOption[] } UserPreferOption
1313 *
1414 * @typedef {object } NormalizeOptions
1515 * @property {object } allowsSFC
1616 * @property {boolean } [allowsSFC.scriptSetup]
17+ * @property {boolean } [allowsSFC.scriptSetupVapor]
1718 * @property {boolean } [allowsSFC.composition]
1819 * @property {boolean } [allowsSFC.compositionVue2]
1920 * @property {boolean } [allowsSFC.options]
@@ -26,6 +27,7 @@ const utils = require('../utils')
2627/** @type {PreferOption[] } */
2728const STYLE_OPTIONS = [
2829 'script-setup' ,
30+ 'script-setup-vapor' ,
2931 'composition' ,
3032 'composition-vue2' ,
3133 'options'
@@ -48,6 +50,10 @@ function parseOptions(options) {
4850 opts . allowsSFC . scriptSetup = true
4951 break
5052 }
53+ case 'script-setup-vapor' : {
54+ opts . allowsSFC . scriptSetupVapor = true
55+ break
56+ }
5157 case 'composition' : {
5258 opts . allowsSFC . composition = true
5359 opts . allowsOther . composition = true
@@ -143,6 +149,7 @@ const LIFECYCLE_HOOK_OPTIONS = new Set([
143149/**
144150 * @param {object } allowsOpt
145151 * @param {boolean } [allowsOpt.scriptSetup]
152+ * @param {boolean } [allowsOpt.scriptSetupVapor]
146153 * @param {boolean } [allowsOpt.composition]
147154 * @param {boolean } [allowsOpt.compositionVue2]
148155 * @param {boolean } [allowsOpt.options]
@@ -152,6 +159,9 @@ function buildAllowedPhrase(allowsOpt) {
152159 if ( allowsOpt . scriptSetup ) {
153160 phrases . push ( '`<script setup>`' )
154161 }
162+ if ( allowsOpt . scriptSetupVapor ) {
163+ phrases . push ( '`<script setup vapor>`' )
164+ }
155165 if ( allowsOpt . composition ) {
156166 phrases . push ( 'Composition API' )
157167 }
@@ -169,13 +179,36 @@ function buildAllowedPhrase(allowsOpt) {
169179/**
170180 * @param {object } allowsOpt
171181 * @param {boolean } [allowsOpt.scriptSetup]
182+ * @param {boolean } [allowsOpt.scriptSetupVapor]
172183 * @param {boolean } [allowsOpt.composition]
173184 * @param {boolean } [allowsOpt.compositionVue2]
174185 * @param {boolean } [allowsOpt.options]
175186 */
176187function isPreferScriptSetup ( allowsOpt ) {
177188 if (
178189 ! allowsOpt . scriptSetup ||
190+ allowsOpt . scriptSetupVapor ||
191+ allowsOpt . composition ||
192+ allowsOpt . compositionVue2 ||
193+ allowsOpt . options
194+ ) {
195+ return false
196+ }
197+ return true
198+ }
199+
200+ /**
201+ * @param {object } allowsOpt
202+ * @param {boolean } [allowsOpt.scriptSetup]
203+ * @param {boolean } [allowsOpt.scriptSetupVapor]
204+ * @param {boolean } [allowsOpt.composition]
205+ * @param {boolean } [allowsOpt.compositionVue2]
206+ * @param {boolean } [allowsOpt.options]
207+ */
208+ function isPreferScriptSetupVapor ( allowsOpt ) {
209+ if (
210+ ! allowsOpt . scriptSetupVapor ||
211+ allowsOpt . scriptSetup ||
179212 allowsOpt . composition ||
180213 allowsOpt . compositionVue2 ||
181214 allowsOpt . options
@@ -219,10 +252,14 @@ module.exports = {
219252 messages : {
220253 disallowScriptSetup :
221254 '`<script setup>` is not allowed in your project. Use {{allowedApis}} instead.' ,
255+ disallowScriptSetupVapor :
256+ '`<script setup vapor>` is not allowed in your project. Use {{allowedApis}} instead.' ,
222257 disallowComponentOption :
223258 '{{disallowedApi}} is not allowed in your project. {{optionPhrase}} is part of the {{disallowedApi}}. Use {{allowedApis}} instead.' ,
224259 disallowComponentOptionPreferScriptSetup :
225- '{{disallowedApi}} is not allowed in your project. Use `<script setup>` instead.'
260+ '{{disallowedApi}} is not allowed in your project. Use `<script setup>` instead.' ,
261+ disallowComponentOptionPreferScriptSetupVapor :
262+ '{{disallowedApi}} is not allowed in your project. Use `<script setup vapor>` instead.'
226263 }
227264 } ,
228265 /** @param {RuleContext } context */
@@ -232,13 +269,35 @@ module.exports = {
232269 return utils . compositingVisitors (
233270 {
234271 Program ( ) {
235- if ( options . allowsSFC . scriptSetup ) {
272+ const { scriptSetup, scriptSetupVapor } = options . allowsSFC
273+ if ( scriptSetup && scriptSetupVapor ) {
274+ return
275+ }
276+ const scriptSetupElement = utils . getScriptSetupElement ( context )
277+ if ( ! scriptSetupElement ) {
278+ return
279+ }
280+
281+ const hasVapor = utils . hasAttribute ( scriptSetupElement , 'vapor' )
282+
283+ // <script setup vapor>
284+ if ( hasVapor ) {
285+ if ( ! scriptSetupVapor ) {
286+ context . report ( {
287+ node : scriptSetupElement . startTag ,
288+ messageId : 'disallowScriptSetupVapor' ,
289+ data : {
290+ allowedApis : buildAllowedPhrase ( options . allowsSFC )
291+ }
292+ } )
293+ }
236294 return
237295 }
238- const scriptSetup = utils . getScriptSetupElement ( context )
239- if ( scriptSetup ) {
296+
297+ // <script setup>
298+ if ( ! scriptSetup ) {
240299 context . report ( {
241- node : scriptSetup . startTag ,
300+ node : scriptSetupElement . startTag ,
242301 messageId : 'disallowScriptSetup' ,
243302 data : {
244303 allowedApis : buildAllowedPhrase ( options . allowsSFC )
@@ -290,9 +349,11 @@ module.exports = {
290349 if ( disallowApi ) {
291350 context . report ( {
292351 node : prop . key ,
293- messageId : isPreferScriptSetup ( allows )
294- ? 'disallowComponentOptionPreferScriptSetup'
295- : 'disallowComponentOption' ,
352+ messageId : isPreferScriptSetupVapor ( allows )
353+ ? 'disallowComponentOptionPreferScriptSetupVapor'
354+ : isPreferScriptSetup ( allows )
355+ ? 'disallowComponentOptionPreferScriptSetup'
356+ : 'disallowComponentOption' ,
296357 data : {
297358 disallowedApi : disallowApi . apiName ,
298359 optionPhrase : buildOptionPhrase ( name ) ,
0 commit comments