{"version":3,"sources":["../src/bin.ts","../src/node.ts","../src/elements.ts","../src/primitives.ts","../src/element-to-path.ts","../src/feature-detection.ts","../src/traverse.ts","../src/commands.ts","../src/path.ts","../src/style.ts","../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from \"fs\";\nimport { convert } from \"./index\";\n\nconst [, , filename] = process.argv;\n\nif (!filename) {\n  console.log(\"No filename given\");\n  process.exit(1);\n}\n\nasync function main() {\n  const svgString = fs.readFileSync(filename, \"utf8\");\n\n  const model = await convert(svgString);\n\n  console.log(JSON.stringify(model, null, 2));\n}\n\nmain();\n","import camelCase from \"lodash.camelcase\";\nimport upperFirst from \"lodash.upperfirst\";\nimport { path, svg } from \"./elements\";\nimport { rect } from \"./primitives\";\nimport elementToPath from \"./element-to-path\";\nimport { getUnsupportedFeatures } from \"./feature-detection\";\nimport { convert as convertPath } from \"./path\";\nimport { getHrefNode } from \"./traverse\";\nimport { Command, CubicCurve } from \"./commands\";\nimport { Path, SVG } from \"./elements\";\nimport { Point, Rect } from \"./primitives\";\nimport {\n  SVGBaseAttributes,\n  SVGChildNode,\n  SVGDrawableNode,\n  SVGPath,\n  SVGPathAttributes,\n  SVGPathConvertibleNode,\n  SVGRoot,\n  SVGUnknown,\n} from \"./svg-types\";\nimport { style } from \"./style\";\n\ntype Helpers = {\n  getHrefNode: (id: string) => SVGPathConvertibleNode | undefined;\n};\n\nfunction joinTransforms(...transforms: (string | undefined)[]) {\n  return transforms.filter((x) => !!x).join(\" \");\n}\n\nfunction mergeContexts<T extends SVGBaseAttributes>(\n  parentContext: SVGBaseAttributes,\n  context: T\n): T {\n  return {\n    ...parentContext,\n    ...context,\n    transform: joinTransforms(context.transform, parentContext.transform),\n  };\n}\n\nfunction convertToSVGPath(child: SVGPathConvertibleNode): SVGPath {\n  const createPathNode = (attributes: SVGPathAttributes): SVGPath => {\n    return {\n      type: \"element\",\n      name: \"path\",\n      attributes,\n    };\n  };\n\n  switch (child.name) {\n    case \"path\": {\n      return createPathNode(child.attributes);\n    }\n    case \"polyline\":\n    case \"polygon\": {\n      const { points, ...rest } = child.attributes;\n      const path = elementToPath(child);\n      return createPathNode({ d: path, ...rest });\n    }\n    case \"circle\": {\n      const { cx, cy, r, ...rest } = child.attributes;\n      const path = elementToPath(child);\n      return createPathNode({ d: path, ...rest });\n    }\n    case \"rect\": {\n      const { x, y, width, height, rx, ry, ...rest } = child.attributes;\n      const path = elementToPath(child);\n      return createPathNode({ d: path, ...rest });\n    }\n  }\n}\n\nfunction createPathElement(\n  attributes: SVGPathAttributes,\n  context: SVGBaseAttributes\n): Path {\n  const { d } = attributes;\n\n  const {\n    fill,\n    [\"fill-opacity\"]: fillOpacity,\n    stroke,\n    [\"stroke-opacity\"]: strokeOpacity,\n    [\"stroke-width\"]: strokeWidth,\n    [\"stroke-linecap\"]: strokeLineCap,\n  } = { ...context, ...attributes };\n\n  return path(\n    style({\n      fill,\n      fillOpacity,\n      stroke,\n      strokeWidth: strokeWidth != null ? parseFloat(strokeWidth) : undefined,\n      strokeLineCap,\n      strokeOpacity,\n    }),\n    convertPath(d, joinTransforms(context.transform, attributes.transform))\n  );\n}\n\n// Convert all svg nodes into a simplified JSON structure.\n// Currently, all drawing nodes (rect, circle, polyline) are converted\n// to <path> nodes for simpler rendering.\nfunction convertDrawableNode(\n  child: SVGDrawableNode | SVGUnknown,\n  context: SVGBaseAttributes,\n  definitions: Helpers\n): Path | null {\n  switch (child.name) {\n    case \"path\":\n    case \"polyline\":\n    case \"polygon\":\n    case \"circle\":\n    case \"rect\": {\n      const pathNode = convertToSVGPath(child);\n      return createPathElement(pathNode.attributes, context);\n    }\n    case \"use\": {\n      // Only a handful of attributes (x, y, width, height, href) will override those\n      // on the original element definition. All others are applied only if the original\n      // element doesn't define them.\n      const { href, \"xlink:href\": xlinkHref, ...rest } = child.attributes;\n      const ref = (href ?? xlinkHref)?.slice(1);\n\n      if (!ref) {\n        console.error(\"<use> tag must have either href or xlink:href\");\n        return null;\n      }\n\n      const definition = definitions.getHrefNode(ref);\n\n      if (!definition) {\n        console.error(\n          `Could not find element referenced by <use> tag: \"${ref}\"`\n        );\n        return null;\n      }\n\n      const pathNode = convertToSVGPath(definition);\n      return createPathElement(\n        pathNode.attributes,\n        mergeContexts(context, rest)\n      );\n    }\n    default:\n      return null;\n  }\n}\n\n/**\n * Generate a name for an SVG element\n *\n * @param elementName The name of the element's type, e.g. circle\n * @param attributes The elements attributes, potentially containing an id\n * @param index The index of the element within its parent\n */\nfunction generateName(\n  attributes: SVGBaseAttributes | null,\n  elementName: string,\n  index: number\n): string {\n  return (\n    (attributes && upperFirst(camelCase(attributes.id))) ||\n    elementName + index.toString()\n  );\n}\n\ntype ConvertedNode = { element: Path; path: string[] };\n\n/**\n * Convert all children, filtering out groups and adding the \"element path\",\n * which is ultimately used as the variable name, to each node\n */\nfunction convertNodes(\n  nodes: SVGChildNode[],\n  parentPath: string[],\n  context: SVGBaseAttributes,\n  definitions: Helpers\n): ConvertedNode[] {\n  return nodes.reduce(\n    (acc: ConvertedNode[], node: SVGChildNode, index: number) => {\n      const attributes = \"attributes\" in node ? node.attributes : null;\n      const name = generateName(attributes, node.name, index);\n      const path = [...parentPath, name];\n\n      if (node.name === \"g\") {\n        const childContext = mergeContexts(context, node.attributes);\n\n        return [\n          ...acc,\n          ...convertNodes(node.children, path, childContext, definitions),\n        ];\n      } else if (\n        node.name === \"desc\" ||\n        node.name === \"title\" ||\n        node.name === \"defs\" ||\n        node.name === \"mask\"\n      ) {\n        return acc;\n      } else {\n        const element = convertDrawableNode(node, context, definitions);\n\n        if (element) {\n          return [...acc, { element, path }];\n        } else {\n          return acc;\n        }\n      }\n    },\n    []\n  );\n}\n\n// Any node with a unique ID can be referenced in logic by that id.\n// If an ID isn't unique, then we use the full element path.\nexport function assignUniqueIds(converted: ConvertedNode[]) {\n  const getShortId = (node: ConvertedNode): string =>\n    camelCase(node.path[node.path.length - 1]);\n\n  const names = converted.map(getShortId);\n\n  converted.forEach((node) => {\n    const name = getShortId(node);\n\n    // Only use this short name if it's unique\n    if (names.filter((x) => x === name).length == 1) {\n      node.element.id = name;\n    } else {\n      node.element.id = node.path.join(\".\");\n    }\n  });\n\n  return converted;\n}\n\nfunction parseViewBox(viewBox: string): Rect {\n  const [vx, vy, vw, vh] = viewBox.split(\" \").map(parseFloat);\n  return rect(vx, vy, vw, vh);\n}\n\nfunction convertQuadraticToCubic(\n  currentPoint: Point,\n  controlPoint: Point,\n  to: Point\n): CubicCurve {\n  return {\n    type: \"cubicCurve\",\n    to,\n    controlPoint1: {\n      x: currentPoint.x + (2.0 / 3.0) * (controlPoint.x - currentPoint.x),\n      y: currentPoint.y + (2.0 / 3.0) * (controlPoint.y - currentPoint.y),\n    },\n    controlPoint2: {\n      x: to.x + (2.0 / 3.0) * (controlPoint.x - to.x),\n      y: to.y + (2.0 / 3.0) * (controlPoint.y - to.y),\n    },\n  };\n}\n\nfunction findLastPoint(commands: Command[], endIndex: number): Point {\n  for (let i = endIndex; i < commands.length; i--) {\n    const command = commands[i];\n\n    switch (command.type) {\n      case \"line\":\n      case \"move\":\n      case \"quadCurve\":\n      case \"cubicCurve\":\n        return command.to;\n      case \"close\":\n        break;\n    }\n  }\n\n  return { x: 0, y: 0 };\n}\n\nexport type ConvertOptions = {\n  convertQuadraticsToCubics?: boolean;\n};\n\nexport function convertRoot(root: SVGRoot, options?: ConvertOptions): SVG {\n  const { viewBox } = root.attributes;\n  const unsupportedFeatures = getUnsupportedFeatures(root);\n\n  const rootElement = svg(\n    viewBox ? parseViewBox(viewBox) : undefined,\n    unsupportedFeatures\n  );\n\n  const convertedNodes = convertNodes(\n    root.children,\n    [],\n    {},\n    {\n      getHrefNode: getHrefNode.bind(null, root),\n    }\n  );\n\n  assignUniqueIds(convertedNodes);\n\n  rootElement.children = convertedNodes.map((node) => node.element);\n\n  if (options?.convertQuadraticsToCubics) {\n    rootElement.children.forEach((element) => {\n      element.commands = element.commands.map((command, index) => {\n        if (command.type !== \"quadCurve\") return command;\n\n        return convertQuadraticToCubic(\n          findLastPoint(element.commands, index - 1),\n          command.controlPoint,\n          command.to\n        );\n      });\n    });\n  }\n\n  return rootElement;\n}\n","import * as Commands from \"./commands\";\nimport { Rect } from \"./primitives\";\nimport { Style } from \"./style\";\n\nexport type Path = {\n  id: string;\n  commands: Commands.Command[];\n  style: Style;\n};\n\nexport type SVG = {\n  children: Path[];\n  viewBox?: Rect;\n  metadata: {\n    unsupportedFeatures: string[];\n  };\n};\n\nexport type CommandWithoutQuadratics = Exclude<\n  Commands.Command,\n  Commands.QuadCurve\n>;\n\nexport type PathWithoutQuadratics = Omit<Path, \"commands\"> & {\n  commands: CommandWithoutQuadratics[];\n};\n\nexport type SVGWithoutQuadratics = Omit<SVG, \"children\"> & {\n  children: PathWithoutQuadratics[];\n};\n\nexport const path = (style: Style, commands: Commands.Command[]): Path => ({\n  id: \"\",\n  commands,\n  style,\n});\n\nexport const svg = (\n  viewBox: Rect | undefined,\n  unsupportedFeatures: string[]\n): SVG => ({\n  children: [],\n  ...(viewBox && { viewBox }),\n  metadata: {\n    unsupportedFeatures,\n  },\n});\n","export type Point = { x: number; y: number };\n\nexport type Size = { width: number; height: number };\n\nexport type Rect = Point & Size;\n\nexport const point = (x: number, y: number): Point => ({ x, y });\n\nexport const rect = (\n  x: number,\n  y: number,\n  width: number,\n  height: number\n): Rect => ({\n  x,\n  y,\n  width,\n  height,\n});\n","import { SVGNode } from \"./svg-types\";\n\nexport default function elementToPath(element: SVGNode): string {\n  const obj = require(\"element-to-path\");\n  const fn = obj && obj.__esModule ? obj[\"default\"] : obj;\n  return fn(element);\n}\n","import { parseCSSColor } from \"csscolorparser-ts\";\nimport { traverse } from \"./traverse\";\nimport { SVGRoot } from \"./svg-types\";\n\n/**\n * All supported element names.\n */\nexport const SUPPORTED_ELEMENT_NAMES = [\n  \"circle\",\n  \"defs\",\n  \"desc\",\n  \"g\",\n  \"mask\",\n  \"path\",\n  \"polygon\",\n  \"polyline\",\n  \"rect\",\n  \"svg\",\n  \"title\",\n  \"use\",\n];\n\n/**\n * All supported element attributes.\n *\n * We could be more sophisticated and keep a map of which attributes can exist\n * on which element, but that doesn't seem necessary yet.\n */\nexport const SUPPORTED_ATTRIBUTE_NAMES = [\n  \"cx\",\n  \"cy\",\n  \"d\",\n  \"fill-opacity\",\n  \"fill-rule\",\n  \"fill\",\n  \"height\",\n  \"href\",\n  \"id\",\n  \"points\",\n  \"r\",\n  \"rx\",\n  \"ry\",\n  \"stroke-linecap\",\n  \"stroke-opacity\",\n  \"stroke-width\",\n  \"stroke\",\n  \"transform\",\n  \"viewBox\",\n  \"width\",\n  \"x\",\n  \"xlink:href\",\n  \"xmlns\",\n  \"xmlns:xlink\",\n  \"y\",\n];\n\nfunction unique<T>(elements: T[]): T[] {\n  return Array.from(new Set(elements).values());\n}\n\nexport function getUnsupportedFeatures(root: SVGRoot): string[] {\n  const elements: string[] = [];\n  const attributes: string[] = [];\n  const attributeValues: string[] = [];\n\n  traverse(root, (node) => {\n    if (SUPPORTED_ELEMENT_NAMES.includes(node.name)) {\n      if (\"attributes\" in node) {\n        const attributeKeys = Object.keys(node.attributes);\n        attributeKeys.forEach((key) => {\n          if (!SUPPORTED_ATTRIBUTE_NAMES.includes(key)) {\n            attributes.push(`${node.name}.${key}`);\n          }\n        });\n\n        if (\n          node.attributes.fill &&\n          node.attributes.fill !== \"none\" &&\n          !parseCSSColor(node.attributes.fill)\n        ) {\n          attributeValues.push(`${node.name}.fill.${node.attributes.fill}`);\n        }\n\n        if (\n          node.attributes.stroke &&\n          node.attributes.stroke !== \"none\" &&\n          !parseCSSColor(node.attributes.stroke)\n        ) {\n          attributeValues.push(`${node.name}.stroke.${node.attributes.stroke}`);\n        }\n      }\n    } else {\n      elements.push(node.name);\n    }\n  });\n\n  return [\n    ...unique(elements),\n    ...unique(attributes),\n    ...unique(attributeValues),\n  ];\n}\n","import { SVGNode, SVGRoot, SVGPathConvertibleNode } from \"./svg-types\";\n\nexport function traverse(root: SVGNode, f: (node: SVGNode) => void) {\n  f(root);\n\n  if (\"children\" in root && Array.isArray(root.children)) {\n    root.children.forEach((child) => traverse(child, f));\n  }\n}\n\nexport function getDefinition(root: SVGRoot, id: string): SVGNode | undefined {\n  let found;\n  traverse(root, (node) => {\n    if (\"attributes\" in node && node.attributes.id === id) {\n      found = node;\n    }\n  });\n  return found;\n}\n\nexport function getHrefNode(\n  root: SVGRoot,\n  id: string\n): SVGPathConvertibleNode | undefined {\n  const node = getDefinition(root, id);\n\n  if (\n    node &&\n    (node.name === \"rect\" ||\n      node.name === \"circle\" ||\n      node.name === \"polyline\" ||\n      node.name === \"polygon\" ||\n      node.name === \"path\")\n  ) {\n    return node;\n  }\n\n  return undefined;\n}\n","import { Point } from \"./primitives\";\n\nexport const move = (to: Point) => ({ type: \"move\", to } as const);\n\nexport const line = (to: Point) => ({ type: \"line\", to } as const);\n\nexport const quadCurve = (to: Point, controlPoint: Point) =>\n  ({\n    type: \"quadCurve\",\n    to,\n    controlPoint,\n  } as const);\n\nexport const cubicCurve = (\n  to: Point,\n  controlPoint1: Point,\n  controlPoint2: Point\n) =>\n  ({\n    type: \"cubicCurve\",\n    to,\n    controlPoint1,\n    controlPoint2,\n  } as const);\n\nexport const close = () => ({ type: \"close\" } as const);\n\nexport type Move = ReturnType<typeof move>;\nexport type Line = ReturnType<typeof line>;\nexport type QuadCurve = ReturnType<typeof quadCurve>;\nexport type CubicCurve = ReturnType<typeof cubicCurve>;\nexport type Close = ReturnType<typeof close>;\nexport type Command = Move | Line | QuadCurve | CubicCurve | Close;\n","import { point } from \"./primitives\";\nimport { move, line, close, quadCurve, cubicCurve } from \"./commands\";\nimport * as Commands from \"./commands\";\n\nconst svgpath = require(\"svgpath\");\n\nexport function convertCommand(segment: any[], x: number, y: number) {\n  const command: string = segment[0];\n  const parameters: number[] = segment.slice(1);\n\n  switch (command) {\n    case \"M\": {\n      const [x, y] = parameters;\n      return move(point(x, y));\n    }\n    case \"L\": {\n      const [x, y] = parameters;\n      return line(point(x, y));\n    }\n    case \"H\": {\n      const [x] = parameters;\n      return line(point(x, y));\n    }\n    case \"V\": {\n      const [y] = parameters;\n      return line(point(x, y));\n    }\n    case \"Z\": {\n      return close();\n    }\n    case \"Q\": {\n      let [qx1, qy1, qx2, qy2] = parameters;\n\n      return quadCurve(point(qx2, qy2), point(qx1, qy1));\n    }\n    case \"C\": {\n      const [x1, y1, x2, y2, x3, y3] = parameters;\n\n      return cubicCurve(point(x3, y3), point(x1, y1), point(x2, y2));\n    }\n    default:\n      console.error(\"Path segment not used:\", segment);\n      return null;\n  }\n}\n\nexport function convert(string: string, transform: string) {\n  const parsed = svgpath(string);\n\n  parsed.unarc();\n  parsed.unshort();\n  parsed.abs();\n\n  if (transform) {\n    parsed.transform(transform);\n  }\n\n  const drawCommands: Commands.Command[] = [];\n\n  parsed.iterate((segment: any[], index: number, x: number, y: number) => {\n    const command = convertCommand(segment, x, y);\n\n    if (!command) return;\n\n    drawCommands.push(command);\n  });\n\n  return drawCommands;\n}\n","import { parseCSSColor } from \"csscolorparser-ts\";\n\nexport type LineCap = \"butt\" | \"round\" | \"square\";\n\nexport type FillRule = \"nonzero\" | \"evenodd\";\n\n/**\n * We use different defaults in our model than the SVG spec.\n *\n * The SVG defaults are convenient for writing SVG files, but less convenient for drawing.\n * We get rid of the value 'none', instead using undefined (or no key).\n *\n * Model defaults:\n * - fill: undefined\n * - stroke: undefined\n * - strokeWidth: 0\n * - strokeLineCap: 'butt'\n *\n * SVG defaults:\n * - fill: 'black'\n * - stroke: 'none'\n * - strokeWidth: 1\n * - strokeLineCap: 'butt'\n */\nexport type Style = {\n  fill?: string;\n  fillRule: FillRule;\n  stroke?: string;\n  strokeWidth: number;\n  strokeLineCap: LineCap;\n};\n\nfunction applyOpacity(color: string, opacity: number): string {\n  const [r, g, b, a] = parseCSSColor(color) ?? [255, 255, 255, 1];\n\n  if (opacity >= 1) return color;\n\n  return `rgba(${r},${g},${b},${a * opacity})`;\n}\n\nconst validateLineCap = (lineCap: string): LineCap => {\n  if (lineCap !== \"butt\" && lineCap !== \"round\" && lineCap !== \"square\") {\n    console.error(`Unsupported line cap value: ${lineCap}`);\n    return \"butt\";\n  }\n\n  return lineCap;\n};\n\n/**\n * Convert SVG properties to our model format.\n *\n * We apply default values and convert them to a more convenient model for drawing.\n */\nexport const style = ({\n  fill,\n  fillOpacity,\n  fillRule,\n  stroke,\n  strokeWidth,\n  strokeLineCap,\n  strokeOpacity,\n}: {\n  fill?: string;\n  fillOpacity?: number;\n  fillRule?: string;\n  stroke?: string;\n  strokeWidth?: number;\n  strokeLineCap?: string;\n  strokeOpacity?: number;\n} = {}): Style => ({\n  ...(fill !== \"none\" && {\n    fill: applyOpacity(\n      fill || \"black\",\n      typeof fillOpacity === \"number\" ? fillOpacity : 1\n    ),\n  }),\n  fillRule: fillRule === \"evenodd\" ? fillRule : \"nonzero\",\n  ...(stroke &&\n    stroke !== \"none\" && {\n      stroke: applyOpacity(\n        stroke,\n        typeof strokeOpacity === \"number\" ? strokeOpacity : 1\n      ),\n    }),\n  strokeWidth: strokeWidth != null ? strokeWidth : 1,\n  strokeLineCap: strokeLineCap ? validateLineCap(strokeLineCap) : \"butt\",\n});\n","import { ConvertOptions, convertRoot } from \"./node\";\nimport { SVGRoot } from \"./svg-types\";\nimport { SVG, SVGWithoutQuadratics } from \"./elements\";\n\nexport * from \"./elements\";\nexport * from \"./primitives\";\nexport * from \"./commands\";\nexport * from \"./style\";\nexport { parseCSSColor } from \"csscolorparser-ts\";\n\nexport const parse: (string: string) => SVGRoot = require(\"svgson\").parseSync;\n\n/**\n * Synchronously convert an SVG file string into a data model.\n *\n * @param svg {string}\n * @param options {ConvertOptions}\n */\nexport function convert(svg: string, options?: {}): SVG;\nexport function convert(\n  svg: string,\n  options?: { convertQuadraticsToCubics: true }\n): SVGWithoutQuadratics;\nexport function convert(svg: string, options?: ConvertOptions): SVG {\n  const root = parse(svg);\n  return convertRoot(root, options);\n}\n"],"mappings":"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","names":["import_lodash","style","x","y","import_csscolorparser_ts","path","upperFirst","camelCase","import_csscolorparser_ts","convert","svg","fs","convert"]}