@@ -26,6 +26,7 @@ export default {
2626			useLocaleInstead : 'Using `lang` is deprecated - use `locale` instead' , 
2727			useTypeDateRangeInstead : 'Using `range` is deprecated - use `type` with `date-range` or `datetime-range` instead' , 
2828			useNoCloseInstead : 'Using `can-close` is deprecated - use `no-close` instead' , 
29+ 			useNoCloseOnClickOutsideInstead : 'Using `close-on-click-outside` is deprecated - use `no-close-on-click-outside` instead' , 
2930			useDisableSwipeForModalInstead : 'Using `enable-swipe` is deprecated - use `disable-swipe` instead' , 
3031			useNoFocusTrapInstead : 'Using `focus-trap` is deprecated - use `no-focus-trap` instead' , 
3132			useKeepOpenInstead : 'Using `close-on-select` is deprecated - use `keep-open` instead' , 
@@ -35,13 +36,16 @@ export default {
3536			removeLimitWidth : 'Using `limit-width` is deprecated - remove prop from components, otherwise root element will inherit incorrect attribute.' , 
3637			removeExact : 'Using `exact` is deprecated - consult Vue Router documentation for alternatives.' , 
3738			useCloseButtonOutsideInstead : 'Using `close-button-contained` is deprecated - use `close-button-outside` instead' , 
39+ 			useModelValueInsteadChecked : 'Using `checked` is deprecated - use `model-value` or `v-model` instead' , 
40+ 			useModelValueInsteadValue : 'Using `value` is deprecated - use `model-value` or `v-model` instead' , 
3841		} , 
3942	} , 
4043
4144	create ( context )  { 
4245		const  versionSatisfies  =  createLibVersionValidator ( context ) 
4346		const  isVue3Valid  =  versionSatisfies ( '9.0.0' )  // #6651 
4447		const  isAriaHiddenValid  =  versionSatisfies ( '8.2.0' )  // #4835 
48+ 		const  isModelValueValid  =  versionSatisfies ( '8.20.0' )  // #6172 
4549		const  isDisableSwipeValid  =  versionSatisfies ( '8.23.0' )  // #6452 
4650		const  isVariantTypeValid  =  versionSatisfies ( '8.24.0' )  // #6472 
4751		const  isDefaultBooleanFalseValid  =  versionSatisfies ( '8.24.0' )  // #6656 
@@ -246,6 +250,18 @@ export default {
246250				} ) 
247251			} , 
248252
253+ 			'VElement[name="ncpopover"] VAttribute:has(VIdentifier[name="close-on-click-outside"])' : function ( node )  { 
254+ 				if  ( ! isVue3Valid )  { 
255+ 					// Do not throw for v8.X.X 
256+ 					return 
257+ 				} 
258+ 
259+ 				context . report ( { 
260+ 					node, 
261+ 					messageId : 'useNoCloseOnClickOutsideInstead' , 
262+ 				} ) 
263+ 			} , 
264+ 
249265			'VElement[name="ncmodal"] VAttribute:has(VIdentifier[name="enable-swipe"])' : function ( node )  { 
250266				if  ( ! isDisableSwipeValid )  { 
251267					context . report ( {  node,  messageId : 'outdatedVueLibrary'  } ) 
@@ -371,6 +387,84 @@ export default {
371387					messageId : 'removeExact' , 
372388				} ) 
373389			} , 
390+ 
391+ 			'VElement VAttribute:has(VIdentifier[name="checked"])' : function ( node )  { 
392+ 				if  ( ! [ 
393+ 					'ncactioncheckbox' , 
394+ 					'ncactionradio' , 
395+ 					'nccheckboxradioswitch' , 
396+ 				] . includes ( node . parent . parent . name ) )  { 
397+ 					return 
398+ 				} 
399+ 
400+ 				if  ( ! isModelValueValid )  { 
401+ 					context . report ( {  node,  messageId : 'outdatedVueLibrary'  } ) 
402+ 					return 
403+ 				} 
404+ 
405+ 				context . report ( { 
406+ 					node, 
407+ 					messageId : 'useModelValueInsteadChecked' , 
408+ 					fix : ( fixer )  =>  { 
409+ 						if  ( node . key . type  ===  'VIdentifier' )  { 
410+ 							return  fixer . replaceTextRange ( node . key . range ,  'model-value' ) 
411+ 						}  else  if  ( node . key . type  ===  'VDirectiveKey' )  { 
412+ 							if  ( node . key . name . name  ===  'model' )  { 
413+ 								return  fixer . replaceTextRange ( node . key . range ,  'v-model' ) 
414+ 							}  else  if  ( node . key . modifiers . some ( ( m )  =>  m . name  ===  'sync' ) )  { 
415+ 								return  fixer . replaceTextRange ( node . key . range ,  'v-model' ) 
416+ 							}  else  { 
417+ 								return  fixer . replaceTextRange ( node . key . argument . range ,  'model-value' ) 
418+ 							} 
419+ 						} 
420+ 					} , 
421+ 				} ) 
422+ 			} , 
423+ 
424+ 			'VElement VAttribute:has(VIdentifier[name="value"])' : function ( node )  { 
425+ 				if  ( ! [ 
426+ 					'ncactioninput' , 
427+ 					'ncactiontexteditable' , 
428+ 					'nccolorpicker' , 
429+ 					'ncdatetimepicker' , 
430+ 					'ncdatetimepickernative' , 
431+ 					'ncinputfield' , 
432+ 					'nctextfield' , 
433+ 					'ncpasswordfield' , 
434+ 					'ncrichcontenteditable' , 
435+ 					'ncselecttags' , 
436+ 					'ncselect' , 
437+ 					'ncsettingsinputtext' , 
438+ 					'ncsettingsselectgroup' , 
439+ 					'nctextarea' , 
440+ 					'nctimezonepicker' , 
441+ 				] . includes ( node . parent . parent . name ) )  { 
442+ 					return 
443+ 				} 
444+ 
445+ 				if  ( ! isModelValueValid )  { 
446+ 					context . report ( {  node,  messageId : 'outdatedVueLibrary'  } ) 
447+ 					return 
448+ 				} 
449+ 
450+ 				context . report ( { 
451+ 					node, 
452+ 					messageId : 'useModelValueInsteadValue' , 
453+ 					fix : ( fixer )  =>  { 
454+ 						if  ( node . key . type  ===  'VIdentifier' )  { 
455+ 							return  fixer . replaceTextRange ( node . key . range ,  'model-value' ) 
456+ 						}  else  if  ( node . key . type  ===  'VDirectiveKey' )  { 
457+ 							if  ( node . key . name . name  ===  'model' )  { 
458+ 								return  fixer . replaceTextRange ( node . key . range ,  'v-model' ) 
459+ 							}  else  if  ( node . key . modifiers . some ( ( m )  =>  m . name  ===  'sync' ) )  { 
460+ 								return  fixer . replaceTextRange ( node . key . range ,  'v-model' ) 
461+ 							}  else  { 
462+ 								return  fixer . replaceTextRange ( node . key . argument . range ,  'model-value' ) 
463+ 							} 
464+ 						} 
465+ 					} , 
466+ 				} ) 
467+ 			} , 
374468		} ) 
375469	} , 
376470}  satisfies  Rule . RuleModule 
0 commit comments