all files / src/hyperscript/ svg-helpers.ts

90.63% Statements 87/96
0% Branches 0/9
40% Functions 2/5
90.63% Lines 87/96
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203                   79×                                                                                                                                                                                                                      
import { HyperscriptChildren, h } from './h'
import { SvgTagNames, VNode, VNodeProps } from '../'
 
export interface SvgHyperscriptHelperFn<T extends SVGElement> {
  (): VNode<T>
  (data: VNodeProps<T>): VNode<T>
  (data: VNodeProps<T>, children: HyperscriptChildren): VNode<T>
  (children: HyperscriptChildren): VNode<T>
}
 
function hh <T extends SVGElement>(tagName: SvgTagNames): SvgHyperscriptHelperFn<T> {
  return function(): VNode<T> {
    const data = arguments[0]
    const children = arguments[1]
 
    if (Array.isArray(data))
      return h<T>(tagName, {}, data)
 
    if (typeof data === 'object')
      return h<T>(tagName, data, children)
 
    return h<T>(tagName, {})
  }
}
 
function isValidString(param: any): boolean {
  return typeof param === 'string' && param.length > 0
}
 
function isSelector(param: any): boolean {
  return isValidString(param) && (param[0] === '.' || param[0] === '#')
}
 
export interface SVGHelperFn extends SvgHyperscriptHelperFn<SVGElement> {
  a: SvgHyperscriptHelperFn<SVGElement>
  altGlyph: SvgHyperscriptHelperFn<SVGElement>
  altGlyphDef: SvgHyperscriptHelperFn<SVGElement>
  altGlyphItem: SvgHyperscriptHelperFn<SVGElement>
  animate: SvgHyperscriptHelperFn<SVGElement>
  animateColor: SvgHyperscriptHelperFn<SVGElement>
  animateMotion: SvgHyperscriptHelperFn<SVGElement>
  animateTransform: SvgHyperscriptHelperFn<SVGElement>
  circle: SvgHyperscriptHelperFn<SVGElement>
  clipPath: SvgHyperscriptHelperFn<SVGElement>
  colorProfile: SvgHyperscriptHelperFn<SVGElement>
  cursor: SvgHyperscriptHelperFn<SVGElement>
  defs: SvgHyperscriptHelperFn<SVGElement>
  desc: SvgHyperscriptHelperFn<SVGElement>
  ellipse: SvgHyperscriptHelperFn<SVGElement>
  feBlend: SvgHyperscriptHelperFn<SVGElement>
  feColorMatrix: SvgHyperscriptHelperFn<SVGElement>
  feComponentTransfer: SvgHyperscriptHelperFn<SVGElement>
  feComposite: SvgHyperscriptHelperFn<SVGElement>
  feConvolveMatrix: SvgHyperscriptHelperFn<SVGElement>
  feDiffuseLighting: SvgHyperscriptHelperFn<SVGElement>
  feDisplacementMap: SvgHyperscriptHelperFn<SVGElement>
  feDistantLight: SvgHyperscriptHelperFn<SVGElement>
  feFlood: SvgHyperscriptHelperFn<SVGElement>
  feFuncA: SvgHyperscriptHelperFn<SVGElement>
  feFuncB: SvgHyperscriptHelperFn<SVGElement>
  feFuncG: SvgHyperscriptHelperFn<SVGElement>
  feFuncR: SvgHyperscriptHelperFn<SVGElement>
  feGaussianBlur: SvgHyperscriptHelperFn<SVGElement>
  feImage: SvgHyperscriptHelperFn<SVGElement>
  feMerge: SvgHyperscriptHelperFn<SVGElement>
  feMergeNode: SvgHyperscriptHelperFn<SVGElement>
  feMorphology: SvgHyperscriptHelperFn<SVGElement>
  feOffset: SvgHyperscriptHelperFn<SVGElement>
  fePointLight: SvgHyperscriptHelperFn<SVGElement>
  feSpecularLighting: SvgHyperscriptHelperFn<SVGElement>
  feSpotlight: SvgHyperscriptHelperFn<SVGElement>
  feTile: SvgHyperscriptHelperFn<SVGElement>
  feTurbulence: SvgHyperscriptHelperFn<SVGElement>
  filter: SvgHyperscriptHelperFn<SVGElement>
  font: SvgHyperscriptHelperFn<SVGElement>
  fontFace: SvgHyperscriptHelperFn<SVGElement>
  fontFaceFormat: SvgHyperscriptHelperFn<SVGElement>
  fontFaceName: SvgHyperscriptHelperFn<SVGElement>
  fontFaceSrc: SvgHyperscriptHelperFn<SVGElement>
  fontFaceUri: SvgHyperscriptHelperFn<SVGElement>
  foreignObject: SvgHyperscriptHelperFn<SVGElement>
  g: SvgHyperscriptHelperFn<SVGElement>
  glyph: SvgHyperscriptHelperFn<SVGElement>
  glyphRef: SvgHyperscriptHelperFn<SVGElement>
  hkern: SvgHyperscriptHelperFn<SVGElement>
  image: SvgHyperscriptHelperFn<SVGElement>
  line: SvgHyperscriptHelperFn<SVGElement>
  linearGradient: SvgHyperscriptHelperFn<SVGElement>
  marker: SvgHyperscriptHelperFn<SVGElement>
  mask: SvgHyperscriptHelperFn<SVGElement>
  metadata: SvgHyperscriptHelperFn<SVGElement>
  missingGlyph: SvgHyperscriptHelperFn<SVGElement>
  mpath: SvgHyperscriptHelperFn<SVGElement>
  path: SvgHyperscriptHelperFn<SVGElement>
  pattern: SvgHyperscriptHelperFn<SVGElement>
  polygon: SvgHyperscriptHelperFn<SVGElement>
  polyline: SvgHyperscriptHelperFn<SVGElement>
  radialGradient: SvgHyperscriptHelperFn<SVGElement>
  rect: SvgHyperscriptHelperFn<SVGElement>
  script: SvgHyperscriptHelperFn<SVGElement>
  set: SvgHyperscriptHelperFn<SVGElement>
  stop: SvgHyperscriptHelperFn<SVGElement>
  style: SvgHyperscriptHelperFn<SVGElement>
  switch: SvgHyperscriptHelperFn<SVGElement>
  symbol: SvgHyperscriptHelperFn<SVGElement>
  text: SvgHyperscriptHelperFn<SVGElement>
  textPath: SvgHyperscriptHelperFn<SVGElement>
  title: SvgHyperscriptHelperFn<SVGElement>
  tref: SvgHyperscriptHelperFn<SVGElement>
  tspan: SvgHyperscriptHelperFn<SVGElement>
  use: SvgHyperscriptHelperFn<SVGElement>
  view: SvgHyperscriptHelperFn<SVGElement>
  vkern: SvgHyperscriptHelperFn<SVGElement>
}
 
function createSVGHelper(): SVGHelperFn {
  // tslint:disable:no-shadowed-variable
  const svg: any = hh('svg')
 
  svg.a = hh('a')
  svg.altGlyph = hh('altGlyph')
  svg.altGlyphDef = hh('altGlyphDef')
  svg.altGlyphItem = hh('altGlyphItem')
  svg.animate = hh('animate')
  svg.animateColor = hh('animateColor')
  svg.animateMotion = hh('animateMotion')
  svg.animateTransform = hh('animateTransform')
  svg.circle = hh('circle')
  svg.clipPath = hh('clipPath')
  svg.colorProfile = hh('colorProfile')
  svg.cursor = hh('cursor')
  svg.defs = hh('defs')
  svg.desc = hh('desc')
  svg.ellipse = hh('ellipse')
  svg.feBlend = hh('feBlend')
  svg.feColorMatrix = hh('feColorMatrix')
  svg.feComponentTransfer = hh('feComponentTransfer')
  svg.feComposite = hh('feComposite')
  svg.feConvolveMatrix = hh('feConvolveMatrix')
  svg.feDiffuseLighting = hh('feDiffuseLighting')
  svg.feDisplacementMap = hh('feDisplacementMap')
  svg.feDistantLight = hh('feDistantLight')
  svg.feFlood = hh('feFlood')
  svg.feFuncA = hh('feFuncA')
  svg.feFuncB = hh('feFuncB')
  svg.feFuncG = hh('feFuncG')
  svg.feFuncR = hh('feFuncR')
  svg.feGaussianBlur = hh('feGaussianBlur')
  svg.feImage = hh('feImage')
  svg.feMerge = hh('feMerge')
  svg.feMergeNode = hh('feMergeNode')
  svg.feMorphology = hh('feMorphology')
  svg.feOffset = hh('feOffset')
  svg.fePointLight = hh('fePointLight')
  svg.feSpecularLighting = hh('feSpecularLighting')
  svg.feSpotlight = hh('feSpotlight')
  svg.feTile = hh('feTile')
  svg.feTurbulence = hh('feTurbulence')
  svg.filter = hh('filter')
  svg.font = hh('font')
  svg.fontFace = hh('fontFace')
  svg.fontFaceFormat = hh('fontFaceFormat')
  svg.fontFaceName = hh('fontFaceName')
  svg.fontFaceSrc = hh('fontFaceSrc')
  svg.fontFaceUri = hh('fontFaceUri')
  svg.foreignObject = hh('foreignObject')
  svg.g = hh('g')
  svg.glyph = hh('glyph')
  svg.glyphRef = hh('glyphRef')
  svg.hkern = hh('hkern')
  svg.image = hh('image')
  svg.linearGradient = hh('linearGradient')
  svg.marker = hh('marker')
  svg.mask = hh('mask')
  svg.metadata = hh('metadata')
  svg.missingGlyph = hh('missingGlyph')
  svg.mpath = hh('mpath')
  svg.path = hh('path')
  svg.pattern = hh('pattern')
  svg.polygon = hh('polygon')
  svg.polyline = hh('polyline')
  svg.radialGradient = hh('radialGradient')
  svg.rect = hh('rect')
  svg.script = hh('script')
  svg.set = hh('set')
  svg.stop = hh('stop')
  svg.style = hh('style')
  svg.switch = hh('switch')
  svg.symbol = hh('symbol')
  svg.text = hh('text')
  svg.textPath = hh('textPath')
  svg.title = hh('title')
  svg.tref = hh('tref')
  svg.tspan = hh('tspan')
  svg.use = hh('use')
  svg.view = hh('view')
  svg.vkern = hh('vkern')
 
  return svg as SVGHelperFn
}
 
export const svg: SVGHelperFn = createSVGHelper()