7
7
const utils = require ( '../utils' )
8
8
9
9
/**
10
- * @typedef { 'script-setup' | 'composition' | 'composition-vue2' | 'options' } PreferOption
10
+ * @typedef { 'script-setup' | 'script-setup-vapor' | ' composition' | 'composition-vue2' | 'options' } PreferOption
11
11
*
12
12
* @typedef {PreferOption[] } UserPreferOption
13
13
*
14
14
* @typedef {object } NormalizeOptions
15
15
* @property {object } allowsSFC
16
16
* @property {boolean } [allowsSFC.scriptSetup]
17
+ * @property {boolean } [allowsSFC.scriptSetupVapor]
17
18
* @property {boolean } [allowsSFC.composition]
18
19
* @property {boolean } [allowsSFC.compositionVue2]
19
20
* @property {boolean } [allowsSFC.options]
@@ -26,6 +27,7 @@ const utils = require('../utils')
26
27
/** @type {PreferOption[] } */
27
28
const STYLE_OPTIONS = [
28
29
'script-setup' ,
30
+ 'script-setup-vapor' ,
29
31
'composition' ,
30
32
'composition-vue2' ,
31
33
'options'
@@ -48,6 +50,10 @@ function parseOptions(options) {
48
50
opts . allowsSFC . scriptSetup = true
49
51
break
50
52
}
53
+ case 'script-setup-vapor' : {
54
+ opts . allowsSFC . scriptSetupVapor = true
55
+ break
56
+ }
51
57
case 'composition' : {
52
58
opts . allowsSFC . composition = true
53
59
opts . allowsOther . composition = true
@@ -143,6 +149,7 @@ const LIFECYCLE_HOOK_OPTIONS = new Set([
143
149
/**
144
150
* @param {object } allowsOpt
145
151
* @param {boolean } [allowsOpt.scriptSetup]
152
+ * @param {boolean } [allowsOpt.scriptSetupVapor]
146
153
* @param {boolean } [allowsOpt.composition]
147
154
* @param {boolean } [allowsOpt.compositionVue2]
148
155
* @param {boolean } [allowsOpt.options]
@@ -152,6 +159,9 @@ function buildAllowedPhrase(allowsOpt) {
152
159
if ( allowsOpt . scriptSetup ) {
153
160
phrases . push ( '`<script setup>`' )
154
161
}
162
+ if ( allowsOpt . scriptSetupVapor ) {
163
+ phrases . push ( '`<script setup vapor>`' )
164
+ }
155
165
if ( allowsOpt . composition ) {
156
166
phrases . push ( 'Composition API' )
157
167
}
@@ -169,13 +179,36 @@ function buildAllowedPhrase(allowsOpt) {
169
179
/**
170
180
* @param {object } allowsOpt
171
181
* @param {boolean } [allowsOpt.scriptSetup]
182
+ * @param {boolean } [allowsOpt.scriptSetupVapor]
172
183
* @param {boolean } [allowsOpt.composition]
173
184
* @param {boolean } [allowsOpt.compositionVue2]
174
185
* @param {boolean } [allowsOpt.options]
175
186
*/
176
187
function isPreferScriptSetup ( allowsOpt ) {
177
188
if (
178
189
! 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 ||
179
212
allowsOpt . composition ||
180
213
allowsOpt . compositionVue2 ||
181
214
allowsOpt . options
@@ -219,10 +252,14 @@ module.exports = {
219
252
messages : {
220
253
disallowScriptSetup :
221
254
'`<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.' ,
222
257
disallowComponentOption :
223
258
'{{disallowedApi}} is not allowed in your project. {{optionPhrase}} is part of the {{disallowedApi}}. Use {{allowedApis}} instead.' ,
224
259
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.'
226
263
}
227
264
} ,
228
265
/** @param {RuleContext } context */
@@ -232,13 +269,35 @@ module.exports = {
232
269
return utils . compositingVisitors (
233
270
{
234
271
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
+ }
236
294
return
237
295
}
238
- const scriptSetup = utils . getScriptSetupElement ( context )
239
- if ( scriptSetup ) {
296
+
297
+ // <script setup>
298
+ if ( ! scriptSetup ) {
240
299
context . report ( {
241
- node : scriptSetup . startTag ,
300
+ node : scriptSetupElement . startTag ,
242
301
messageId : 'disallowScriptSetup' ,
243
302
data : {
244
303
allowedApis : buildAllowedPhrase ( options . allowsSFC )
@@ -290,9 +349,11 @@ module.exports = {
290
349
if ( disallowApi ) {
291
350
context . report ( {
292
351
node : prop . key ,
293
- messageId : isPreferScriptSetup ( allows )
294
- ? 'disallowComponentOptionPreferScriptSetup'
295
- : 'disallowComponentOption' ,
352
+ messageId : isPreferScriptSetupVapor ( allows )
353
+ ? 'disallowComponentOptionPreferScriptSetupVapor'
354
+ : isPreferScriptSetup ( allows )
355
+ ? 'disallowComponentOptionPreferScriptSetup'
356
+ : 'disallowComponentOption' ,
296
357
data : {
297
358
disallowedApi : disallowApi . apiName ,
298
359
optionPhrase : buildOptionPhrase ( name ) ,
0 commit comments