mirror of https://github.com/vuejs/core.git
				
				
				
			refactor: reuse htmlNesting from compiler-dom
This commit is contained in:
		
							parent
							
								
									e5af194486
								
							
						
					
					
						commit
						aa28e9c496
					
				|  | @ -75,4 +75,5 @@ export { | ||||||
|   DOMErrorMessages, |   DOMErrorMessages, | ||||||
| } from './errors' | } from './errors' | ||||||
| export { resolveModifiers } from './transforms/vOn' | export { resolveModifiers } from './transforms/vOn' | ||||||
|  | export { isValidHTMLNesting } from './htmlNesting' | ||||||
| export * from '@vue/compiler-core' | export * from '@vue/compiler-core' | ||||||
|  |  | ||||||
|  | @ -1,196 +0,0 @@ | ||||||
| /** |  | ||||||
|  * Copied from https://github.com/MananTank/validate-html-nesting
 |  | ||||||
|  * with ISC license |  | ||||||
|  * |  | ||||||
|  * To avoid runtime dependency on validate-html-nesting |  | ||||||
|  * This file should not change very often in the original repo |  | ||||||
|  * but we may need to keep it up-to-date from time to time. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * returns true if given parent-child nesting is valid HTML |  | ||||||
|  */ |  | ||||||
| export function isValidHTMLNesting(parent: string, child: string): boolean { |  | ||||||
|   // if we know the list of children that are the only valid children for the given parent
 |  | ||||||
|   if (parent in onlyValidChildren) { |  | ||||||
|     return onlyValidChildren[parent].has(child) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // if we know the list of parents that are the only valid parents for the given child
 |  | ||||||
|   if (child in onlyValidParents) { |  | ||||||
|     return onlyValidParents[child].has(parent) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // if we know the list of children that are NOT valid for the given parent
 |  | ||||||
|   if (parent in knownInvalidChildren) { |  | ||||||
|     // check if the child is in the list of invalid children
 |  | ||||||
|     // if so, return false
 |  | ||||||
|     if (knownInvalidChildren[parent].has(child)) return false |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // if we know the list of parents that are NOT valid for the given child
 |  | ||||||
|   if (child in knownInvalidParents) { |  | ||||||
|     // check if the parent is in the list of invalid parents
 |  | ||||||
|     // if so, return false
 |  | ||||||
|     if (knownInvalidParents[child].has(parent)) return false |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return true |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const headings = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) |  | ||||||
| const emptySet = new Set([]) |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * maps element to set of elements that can be it's children, no other */ |  | ||||||
| const onlyValidChildren: Record<string, Set<string>> = { |  | ||||||
|   head: new Set([ |  | ||||||
|     'base', |  | ||||||
|     'basefront', |  | ||||||
|     'bgsound', |  | ||||||
|     'link', |  | ||||||
|     'meta', |  | ||||||
|     'title', |  | ||||||
|     'noscript', |  | ||||||
|     'noframes', |  | ||||||
|     'style', |  | ||||||
|     'script', |  | ||||||
|     'template', |  | ||||||
|   ]), |  | ||||||
|   optgroup: new Set(['option']), |  | ||||||
|   select: new Set(['optgroup', 'option']), |  | ||||||
|   math: new Set(['mrow']), |  | ||||||
|   script: new Set(), |  | ||||||
|   // table
 |  | ||||||
|   table: new Set(['caption', 'colgroup', 'tbody', 'tfoot', 'thead']), |  | ||||||
|   tr: new Set(['td', 'th']), |  | ||||||
|   colgroup: new Set(['col']), |  | ||||||
|   tbody: new Set(['tr']), |  | ||||||
|   thead: new Set(['tr']), |  | ||||||
|   tfoot: new Set(['tr']), |  | ||||||
|   // these elements can not have any children elements
 |  | ||||||
|   iframe: emptySet, |  | ||||||
|   option: emptySet, |  | ||||||
|   textarea: emptySet, |  | ||||||
|   style: emptySet, |  | ||||||
|   title: emptySet, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** maps elements to set of elements which can be it's parent, no other */ |  | ||||||
| const onlyValidParents: Record<string, Set<string>> = { |  | ||||||
|   // sections
 |  | ||||||
|   html: emptySet, |  | ||||||
|   body: new Set(['html']), |  | ||||||
|   head: new Set(['html']), |  | ||||||
|   // table
 |  | ||||||
|   td: new Set(['tr']), |  | ||||||
|   colgroup: new Set(['table']), |  | ||||||
|   caption: new Set(['table']), |  | ||||||
|   tbody: new Set(['table']), |  | ||||||
|   tfoot: new Set(['table']), |  | ||||||
|   col: new Set(['colgroup']), |  | ||||||
|   th: new Set(['tr']), |  | ||||||
|   thead: new Set(['table']), |  | ||||||
|   tr: new Set(['tbody', 'thead', 'tfoot']), |  | ||||||
|   // data list
 |  | ||||||
|   dd: new Set(['dl', 'div']), |  | ||||||
|   dt: new Set(['dl', 'div']), |  | ||||||
|   // other
 |  | ||||||
|   figcaption: new Set(['figure']), |  | ||||||
|   // li: new Set(["ul", "ol"]),
 |  | ||||||
|   summary: new Set(['details']), |  | ||||||
|   area: new Set(['map']), |  | ||||||
| } as const |  | ||||||
| 
 |  | ||||||
| /** maps element to set of elements that can not be it's children, others can */ |  | ||||||
| const knownInvalidChildren: Record<string, Set<string>> = { |  | ||||||
|   p: new Set([ |  | ||||||
|     'address', |  | ||||||
|     'article', |  | ||||||
|     'aside', |  | ||||||
|     'blockquote', |  | ||||||
|     'center', |  | ||||||
|     'details', |  | ||||||
|     'dialog', |  | ||||||
|     'dir', |  | ||||||
|     'div', |  | ||||||
|     'dl', |  | ||||||
|     'fieldset', |  | ||||||
|     'figure', |  | ||||||
|     'footer', |  | ||||||
|     'form', |  | ||||||
|     'h1', |  | ||||||
|     'h2', |  | ||||||
|     'h3', |  | ||||||
|     'h4', |  | ||||||
|     'h5', |  | ||||||
|     'h6', |  | ||||||
|     'header', |  | ||||||
|     'hgroup', |  | ||||||
|     'hr', |  | ||||||
|     'li', |  | ||||||
|     'main', |  | ||||||
|     'nav', |  | ||||||
|     'menu', |  | ||||||
|     'ol', |  | ||||||
|     'p', |  | ||||||
|     'pre', |  | ||||||
|     'section', |  | ||||||
|     'table', |  | ||||||
|     'ul', |  | ||||||
|   ]), |  | ||||||
|   svg: new Set([ |  | ||||||
|     'b', |  | ||||||
|     'blockquote', |  | ||||||
|     'br', |  | ||||||
|     'code', |  | ||||||
|     'dd', |  | ||||||
|     'div', |  | ||||||
|     'dl', |  | ||||||
|     'dt', |  | ||||||
|     'em', |  | ||||||
|     'embed', |  | ||||||
|     'h1', |  | ||||||
|     'h2', |  | ||||||
|     'h3', |  | ||||||
|     'h4', |  | ||||||
|     'h5', |  | ||||||
|     'h6', |  | ||||||
|     'hr', |  | ||||||
|     'i', |  | ||||||
|     'img', |  | ||||||
|     'li', |  | ||||||
|     'menu', |  | ||||||
|     'meta', |  | ||||||
|     'ol', |  | ||||||
|     'p', |  | ||||||
|     'pre', |  | ||||||
|     'ruby', |  | ||||||
|     's', |  | ||||||
|     'small', |  | ||||||
|     'span', |  | ||||||
|     'strong', |  | ||||||
|     'sub', |  | ||||||
|     'sup', |  | ||||||
|     'table', |  | ||||||
|     'u', |  | ||||||
|     'ul', |  | ||||||
|     'var', |  | ||||||
|   ]), |  | ||||||
| } as const |  | ||||||
| 
 |  | ||||||
| /** maps element to set of elements that can not be it's parent, others can */ |  | ||||||
| const knownInvalidParents: Record<string, Set<string>> = { |  | ||||||
|   a: new Set(['a']), |  | ||||||
|   button: new Set(['button']), |  | ||||||
|   dd: new Set(['dd', 'dt']), |  | ||||||
|   dt: new Set(['dd', 'dt']), |  | ||||||
|   form: new Set(['form']), |  | ||||||
|   li: new Set(['li']), |  | ||||||
|   h1: headings, |  | ||||||
|   h2: headings, |  | ||||||
|   h3: headings, |  | ||||||
|   h4: headings, |  | ||||||
|   h5: headings, |  | ||||||
|   h6: headings, |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import { isValidHTMLNesting } from '../html-nesting' | import { isValidHTMLNesting } from '@vue/compiler-dom' | ||||||
| import { | import { | ||||||
|   type AttributeNode, |   type AttributeNode, | ||||||
|   type ComponentNode, |   type ComponentNode, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue