You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.9 KiB
55 lines
1.9 KiB
|
3 years ago
|
/* @flow */
|
||
|
|
|
||
|
|
import { makeMap } from 'shared/util'
|
||
|
|
|
||
|
|
// these are reserved for web because they are directly compiled away
|
||
|
|
// during template compilation
|
||
|
|
export const isReservedAttr = makeMap('style,class')
|
||
|
|
|
||
|
|
// attributes that should be using props for binding
|
||
|
|
const acceptValue = makeMap('input,textarea,option,select,progress')
|
||
|
|
export const mustUseProp = (tag: string, type: ?string, attr: string): boolean => {
|
||
|
|
return (
|
||
|
|
(attr === 'value' && acceptValue(tag)) && type !== 'button' ||
|
||
|
|
(attr === 'selected' && tag === 'option') ||
|
||
|
|
(attr === 'checked' && tag === 'input') ||
|
||
|
|
(attr === 'muted' && tag === 'video')
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
export const isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck')
|
||
|
|
|
||
|
|
const isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only')
|
||
|
|
|
||
|
|
export const convertEnumeratedValue = (key: string, value: any) => {
|
||
|
|
return isFalsyAttrValue(value) || value === 'false'
|
||
|
|
? 'false'
|
||
|
|
// allow arbitrary string value for contenteditable
|
||
|
|
: key === 'contenteditable' && isValidContentEditableValue(value)
|
||
|
|
? value
|
||
|
|
: 'true'
|
||
|
|
}
|
||
|
|
|
||
|
|
export const isBooleanAttr = makeMap(
|
||
|
|
'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
|
||
|
|
'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
|
||
|
|
'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
|
||
|
|
'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
|
||
|
|
'required,reversed,scoped,seamless,selected,sortable,translate,' +
|
||
|
|
'truespeed,typemustmatch,visible'
|
||
|
|
)
|
||
|
|
|
||
|
|
export const xlinkNS = 'http://www.w3.org/1999/xlink'
|
||
|
|
|
||
|
|
export const isXlink = (name: string): boolean => {
|
||
|
|
return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
|
||
|
|
}
|
||
|
|
|
||
|
|
export const getXlinkProp = (name: string): string => {
|
||
|
|
return isXlink(name) ? name.slice(6, name.length) : ''
|
||
|
|
}
|
||
|
|
|
||
|
|
export const isFalsyAttrValue = (val: any): boolean => {
|
||
|
|
return val == null || val === false
|
||
|
|
}
|