svger-cli 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (729) hide show
  1. package/CHANGELOG.md +399 -0
  2. package/README.md +448 -37
  3. package/SECURITY.md +3 -3
  4. package/assets/svges/500px.svg +3 -0
  5. package/assets/svges/adobe.svg +3 -0
  6. package/assets/svges/adonis.svg +3 -0
  7. package/assets/svges/aeroplane-1.svg +3 -0
  8. package/assets/svges/agenda.svg +3 -0
  9. package/assets/svges/airbnb.svg +3 -0
  10. package/assets/svges/airtable.svg +3 -0
  11. package/assets/svges/alarm-1.svg +7 -0
  12. package/assets/svges/align-text-center.svg +6 -0
  13. package/assets/svges/align-text-left.svg +6 -0
  14. package/assets/svges/align-text-right.svg +6 -0
  15. package/assets/svges/alpinejs.svg +4 -0
  16. package/assets/svges/amazon-original.svg +5 -0
  17. package/assets/svges/amazon-pay.svg +7 -0
  18. package/assets/svges/amazon.svg +10 -0
  19. package/assets/svges/ambulance-1.svg +4 -0
  20. package/assets/svges/amd.svg +3 -0
  21. package/assets/svges/amex.svg +4 -0
  22. package/assets/svges/anchor.svg +3 -0
  23. package/assets/svges/android-old.svg +3 -0
  24. package/assets/svges/android.svg +3 -0
  25. package/assets/svges/angellist.svg +3 -0
  26. package/assets/svges/angle-double-down.svg +4 -0
  27. package/assets/svges/angle-double-left.svg +4 -0
  28. package/assets/svges/angle-double-right.svg +4 -0
  29. package/assets/svges/angle-double-up.svg +4 -0
  30. package/assets/svges/angular.svg +3 -0
  31. package/assets/svges/app-store.svg +3 -0
  32. package/assets/svges/apple-brand.svg +3 -0
  33. package/assets/svges/apple-music-alt.svg +3 -0
  34. package/assets/svges/apple-music.svg +3 -0
  35. package/assets/svges/apple-pay.svg +3 -0
  36. package/assets/svges/arc-browser.svg +6 -0
  37. package/assets/svges/arrow-all-direction.svg +6 -0
  38. package/assets/svges/arrow-angular-top-left.svg +3 -0
  39. package/assets/svges/arrow-angular-top-right.svg +3 -0
  40. package/assets/svges/arrow-both-direction-horizontal-1.svg +3 -0
  41. package/assets/svges/arrow-both-direction-vertical-1.svg +3 -0
  42. package/assets/svges/arrow-downward.svg +3 -0
  43. package/assets/svges/arrow-left-circle.svg +4 -0
  44. package/assets/svges/arrow-left.svg +3 -0
  45. package/assets/svges/arrow-right-circle.svg +4 -0
  46. package/assets/svges/arrow-right.svg +3 -0
  47. package/assets/svges/arrow-upward.svg +3 -0
  48. package/assets/svges/asana.svg +3 -0
  49. package/assets/svges/astro.svg +4 -0
  50. package/assets/svges/atlassian.svg +3 -0
  51. package/assets/svges/audi-alt.svg +3 -0
  52. package/assets/svges/audi.svg +3 -0
  53. package/assets/svges/aws.svg +3 -0
  54. package/assets/svges/azure.svg +3 -0
  55. package/assets/svges/badge-decagram-percent.svg +6 -0
  56. package/assets/svges/balloons.svg +3 -0
  57. package/assets/svges/ban-2.svg +3 -0
  58. package/assets/svges/bar-chart-4.svg +6 -0
  59. package/assets/svges/bar-chart-dollar.svg +6 -0
  60. package/assets/svges/basket-shopping-3.svg +5 -0
  61. package/assets/svges/beat.svg +3 -0
  62. package/assets/svges/behance.svg +5 -0
  63. package/assets/svges/bell-1.svg +3 -0
  64. package/assets/svges/bike.svg +6 -0
  65. package/assets/svges/bing.svg +5 -0
  66. package/assets/svges/bitbucket.svg +5 -0
  67. package/assets/svges/bitcoin.svg +5 -0
  68. package/assets/svges/bittorrent.svg +6 -0
  69. package/assets/svges/blogger-alt.svg +3 -0
  70. package/assets/svges/blogger.svg +3 -0
  71. package/assets/svges/bluetooth-logo.svg +3 -0
  72. package/assets/svges/bluetooth.svg +3 -0
  73. package/assets/svges/bmw.svg +7 -0
  74. package/assets/svges/board-writing-3.svg +3 -0
  75. package/assets/svges/bold.svg +3 -0
  76. package/assets/svges/bolt-2.svg +3 -0
  77. package/assets/svges/bolt-3.svg +3 -0
  78. package/assets/svges/book-1.svg +4 -0
  79. package/assets/svges/bookmark-1.svg +3 -0
  80. package/assets/svges/bookmark-circle.svg +4 -0
  81. package/assets/svges/books-2.svg +3 -0
  82. package/assets/svges/bootstrap-5-square.svg +3 -0
  83. package/assets/svges/bootstrap-5.svg +3 -0
  84. package/assets/svges/box-archive-1.svg +4 -0
  85. package/assets/svges/box-closed.svg +3 -0
  86. package/assets/svges/box-gift-1.svg +3 -0
  87. package/assets/svges/brave.svg +3 -0
  88. package/assets/svges/bricks.svg +3 -0
  89. package/assets/svges/bridge-3.svg +3 -0
  90. package/assets/svges/briefcase-1.svg +3 -0
  91. package/assets/svges/briefcase-2.svg +3 -0
  92. package/assets/svges/briefcase-plus-1.svg +4 -0
  93. package/assets/svges/brush-1-rotated.svg +3 -0
  94. package/assets/svges/brush-2.svg +3 -0
  95. package/assets/svges/btc.svg +3 -0
  96. package/assets/svges/bug-1.svg +3 -0
  97. package/assets/svges/buildings-1.svg +5 -0
  98. package/assets/svges/bulb-2.svg +3 -0
  99. package/assets/svges/bulb-4.svg +9 -0
  100. package/assets/svges/burger-1.svg +3 -0
  101. package/assets/svges/burger-drink.svg +4 -0
  102. package/assets/svges/bus-1.svg +5 -0
  103. package/assets/svges/busket-ball.svg +3 -0
  104. package/assets/svges/cake-1.svg +3 -0
  105. package/assets/svges/calculator-1.svg +8 -0
  106. package/assets/svges/calculator-2.svg +13 -0
  107. package/assets/svges/calendar-days.svg +9 -0
  108. package/assets/svges/camera-1.svg +4 -0
  109. package/assets/svges/camera-movie-1.svg +3 -0
  110. package/assets/svges/candy-cane-2.svg +3 -0
  111. package/assets/svges/candy-round-1.svg +3 -0
  112. package/assets/svges/canva.svg +3 -0
  113. package/assets/svges/capsule-1.svg +3 -0
  114. package/assets/svges/car-2.svg +5 -0
  115. package/assets/svges/car-4.svg +3 -0
  116. package/assets/svges/car-6.svg +5 -0
  117. package/assets/svges/caravan-1.svg +3 -0
  118. package/assets/svges/cart-1.svg +5 -0
  119. package/assets/svges/cart-2.svg +5 -0
  120. package/assets/svges/cash-app.svg +3 -0
  121. package/assets/svges/certificate-badge-1.svg +6 -0
  122. package/assets/svges/chat-bubble-2.svg +5 -0
  123. package/assets/svges/check-circle-1.svg +4 -0
  124. package/assets/svges/check-square-2.svg +4 -0
  125. package/assets/svges/check.svg +3 -0
  126. package/assets/svges/chevron-down-circle.svg +4 -0
  127. package/assets/svges/chevron-down.svg +3 -0
  128. package/assets/svges/chevron-left-circle.svg +4 -0
  129. package/assets/svges/chevron-left.svg +3 -0
  130. package/assets/svges/chevron-right-circle.svg +4 -0
  131. package/assets/svges/chevron-up-circle.svg +4 -0
  132. package/assets/svges/chevron-up.svg +3 -0
  133. package/assets/svges/chrome.svg +6 -0
  134. package/assets/svges/chromecast.svg +3 -0
  135. package/assets/svges/cisco.svg +3 -0
  136. package/assets/svges/claude.svg +3 -0
  137. package/assets/svges/clickup.svg +4 -0
  138. package/assets/svges/clipboard.svg +3 -0
  139. package/assets/svges/cloud-2.svg +3 -0
  140. package/assets/svges/cloud-bolt-1.svg +4 -0
  141. package/assets/svges/cloud-bolt-2.svg +4 -0
  142. package/assets/svges/cloud-check-circle.svg +5 -0
  143. package/assets/svges/cloud-download.svg +5 -0
  144. package/assets/svges/cloud-iot-2.svg +3 -0
  145. package/assets/svges/cloud-rain.svg +6 -0
  146. package/assets/svges/cloud-refresh-clockwise.svg +5 -0
  147. package/assets/svges/cloud-sun.svg +9 -0
  148. package/assets/svges/cloud-upload.svg +5 -0
  149. package/assets/svges/cloudflare.svg +3 -0
  150. package/assets/svges/code-1.svg +5 -0
  151. package/assets/svges/code-s.svg +5 -0
  152. package/assets/svges/codepen.svg +3 -0
  153. package/assets/svges/coffee-cup-2.svg +6 -0
  154. package/assets/svges/coinbase.svg +10 -0
  155. package/assets/svges/colour-palette-3.svg +7 -0
  156. package/assets/svges/comment-1-share.svg +4 -0
  157. package/assets/svges/comment-1-text.svg +5 -0
  158. package/assets/svges/comment-1.svg +3 -0
  159. package/assets/svges/compass-drafting-2.svg +3 -0
  160. package/assets/svges/connectdevelop.svg +3 -0
  161. package/assets/svges/copilot.svg +8 -0
  162. package/assets/svges/coral.svg +3 -0
  163. package/assets/svges/cpanel.svg +3 -0
  164. package/assets/svges/crane-4.svg +3 -0
  165. package/assets/svges/creative-commons.svg +4 -0
  166. package/assets/svges/credit-card-multiple.svg +3 -0
  167. package/assets/svges/crop-2.svg +3 -0
  168. package/assets/svges/crown-3.svg +3 -0
  169. package/assets/svges/css3.svg +3 -0
  170. package/assets/svges/dashboard-square-1.svg +6 -0
  171. package/assets/svges/database-2.svg +3 -0
  172. package/assets/svges/deno.svg +4 -0
  173. package/assets/svges/dev.svg +3 -0
  174. package/assets/svges/dialogflow.svg +4 -0
  175. package/assets/svges/diamonds-1.svg +3 -0
  176. package/assets/svges/diamonds-2.svg +3 -0
  177. package/assets/svges/digitalocean.svg +3 -0
  178. package/assets/svges/diners-club.svg +38 -0
  179. package/assets/svges/direction-ltr.svg +4 -0
  180. package/assets/svges/direction-rtl.svg +4 -0
  181. package/assets/svges/discord-chat.svg +5 -0
  182. package/assets/svges/discord.svg +3 -0
  183. package/assets/svges/discover.svg +3 -0
  184. package/assets/svges/docker.svg +3 -0
  185. package/assets/svges/dollar-circle.svg +4 -0
  186. package/assets/svges/dollar.svg +3 -0
  187. package/assets/svges/double-quotes-end-1.svg +4 -0
  188. package/assets/svges/download-1.svg +4 -0
  189. package/assets/svges/download-circle-1.svg +4 -0
  190. package/assets/svges/dribbble-symbol.svg +3 -0
  191. package/assets/svges/dribbble.svg +3 -0
  192. package/assets/svges/drizzle.svg +6 -0
  193. package/assets/svges/dropbox.svg +7 -0
  194. package/assets/svges/drupal.svg +3 -0
  195. package/assets/svges/dumbbell-1.svg +3 -0
  196. package/assets/svges/edge.svg +3 -0
  197. package/assets/svges/emoji-expressionless-flat-eyes.svg +6 -0
  198. package/assets/svges/emoji-expressionless.svg +6 -0
  199. package/assets/svges/emoji-grin.svg +6 -0
  200. package/assets/svges/emoji-sad.svg +6 -0
  201. package/assets/svges/emoji-smile-side.svg +6 -0
  202. package/assets/svges/emoji-smile-sunglass.svg +5 -0
  203. package/assets/svges/emoji-smile-tongue.svg +3 -0
  204. package/assets/svges/emoji-smile.svg +6 -0
  205. package/assets/svges/enter-down.svg +4 -0
  206. package/assets/svges/enter.svg +4 -0
  207. package/assets/svges/envato.svg +4 -0
  208. package/assets/svges/envelope-1.svg +3 -0
  209. package/assets/svges/eraser-1.svg +4 -0
  210. package/assets/svges/ethereum-logo.svg +4 -0
  211. package/assets/svges/euro.svg +3 -0
  212. package/assets/svges/exit-up.svg +4 -0
  213. package/assets/svges/exit.svg +4 -0
  214. package/assets/svges/expand-arrow-1.svg +3 -0
  215. package/assets/svges/expand-square-4.svg +6 -0
  216. package/assets/svges/expressjs.svg +4 -0
  217. package/assets/svges/eye.svg +4 -0
  218. package/assets/svges/facebook-messenger.svg +3 -0
  219. package/assets/svges/facebook-rounded.svg +4 -0
  220. package/assets/svges/facebook-square.svg +3 -0
  221. package/assets/svges/facebook.svg +3 -0
  222. package/assets/svges/facetime.svg +3 -0
  223. package/assets/svges/figma.svg +3 -0
  224. package/assets/svges/file-format-zip.svg +4 -0
  225. package/assets/svges/file-multiple.svg +4 -0
  226. package/assets/svges/file-pencil.svg +4 -0
  227. package/assets/svges/file-plus-circle.svg +5 -0
  228. package/assets/svges/file-question.svg +5 -0
  229. package/assets/svges/file-xmark.svg +4 -0
  230. package/assets/svges/firebase.svg +3 -0
  231. package/assets/svges/firefox.svg +3 -0
  232. package/assets/svges/firework-rocket-4.svg +3 -0
  233. package/assets/svges/fitbit.svg +3 -0
  234. package/assets/svges/flag-1.svg +3 -0
  235. package/assets/svges/flag-2.svg +3 -0
  236. package/assets/svges/flickr.svg +4 -0
  237. package/assets/svges/floppy-disk-1.svg +3 -0
  238. package/assets/svges/flower-2.svg +3 -0
  239. package/assets/svges/flutter.svg +3 -0
  240. package/assets/svges/folder-1.svg +3 -0
  241. package/assets/svges/ford.svg +3 -0
  242. package/assets/svges/framer.svg +3 -0
  243. package/assets/svges/funnel-1.svg +3 -0
  244. package/assets/svges/gallery.svg +4 -0
  245. package/assets/svges/game-pad-modern-1.svg +6 -0
  246. package/assets/svges/gatsby.svg +3 -0
  247. package/assets/svges/gauge-1.svg +5 -0
  248. package/assets/svges/gear-1.svg +4 -0
  249. package/assets/svges/gears-3.svg +6 -0
  250. package/assets/svges/gemini.svg +3 -0
  251. package/assets/svges/git.svg +3 -0
  252. package/assets/svges/github.svg +3 -0
  253. package/assets/svges/glass-juice-1.svg +3 -0
  254. package/assets/svges/globe-1.svg +3 -0
  255. package/assets/svges/globe-stand.svg +4 -0
  256. package/assets/svges/go.svg +7 -0
  257. package/assets/svges/goodreads.svg +3 -0
  258. package/assets/svges/google-cloud.svg +3 -0
  259. package/assets/svges/google-drive.svg +3 -0
  260. package/assets/svges/google-meet.svg +3 -0
  261. package/assets/svges/google-pay.svg +3 -0
  262. package/assets/svges/google-wallet.svg +3 -0
  263. package/assets/svges/google.svg +3 -0
  264. package/assets/svges/graduation-cap-1.svg +3 -0
  265. package/assets/svges/grammarly.svg +3 -0
  266. package/assets/svges/hacker-news.svg +3 -0
  267. package/assets/svges/hammer-1.svg +3 -0
  268. package/assets/svges/hammer-2.svg +3 -0
  269. package/assets/svges/hand-mic.svg +3 -0
  270. package/assets/svges/hand-shake.svg +3 -0
  271. package/assets/svges/hand-stop.svg +3 -0
  272. package/assets/svges/hand-taking-dollar.svg +4 -0
  273. package/assets/svges/hand-taking-leaf-1.svg +5 -0
  274. package/assets/svges/hand-taking-user.svg +5 -0
  275. package/assets/svges/hashnode.svg +3 -0
  276. package/assets/svges/hat-chef-3.svg +3 -0
  277. package/assets/svges/headphone-1.svg +3 -0
  278. package/assets/svges/heart.svg +3 -0
  279. package/assets/svges/helicopter-2.svg +4 -0
  280. package/assets/svges/helmet-safety-1.svg +3 -0
  281. package/assets/svges/hierarchy-1.svg +9 -0
  282. package/assets/svges/highlighter-1.svg +3 -0
  283. package/assets/svges/highlighter-2.svg +3 -0
  284. package/assets/svges/home-2.svg +3 -0
  285. package/assets/svges/hospital-2.svg +4 -0
  286. package/assets/svges/hourglass.svg +3 -0
  287. package/assets/svges/html5.svg +4 -0
  288. package/assets/svges/ibm.svg +3 -0
  289. package/assets/svges/id-card.svg +7 -0
  290. package/assets/svges/imdb.svg +7 -0
  291. package/assets/svges/indent.svg +8 -0
  292. package/assets/svges/info.svg +4 -0
  293. package/assets/svges/injection-1.svg +3 -0
  294. package/assets/svges/instagram-logotype.svg +3 -0
  295. package/assets/svges/instagram.svg +4 -0
  296. package/assets/svges/intel.svg +4 -0
  297. package/assets/svges/ios.svg +3 -0
  298. package/assets/svges/island-2.svg +4 -0
  299. package/assets/svges/jaguar.svg +3 -0
  300. package/assets/svges/jamstack.svg +3 -0
  301. package/assets/svges/java.svg +3 -0
  302. package/assets/svges/javascript.svg +3 -0
  303. package/assets/svges/jcb.svg +3 -0
  304. package/assets/svges/joomla.svg +6 -0
  305. package/assets/svges/jsfiddle.svg +4 -0
  306. package/assets/svges/key-1.svg +3 -0
  307. package/assets/svges/keyboard.svg +12 -0
  308. package/assets/svges/knife-fork-1.svg +5 -0
  309. package/assets/svges/kubernetes.svg +11 -0
  310. package/assets/svges/label-dollar-2.svg +4 -0
  311. package/assets/svges/laptop-2.svg +3 -0
  312. package/assets/svges/laptop-phone.svg +5 -0
  313. package/assets/svges/laravel.svg +3 -0
  314. package/assets/svges/layers-1.svg +4 -0
  315. package/assets/svges/layout-26.svg +3 -0
  316. package/assets/svges/layout-9.svg +3 -0
  317. package/assets/svges/leaf-1.svg +3 -0
  318. package/assets/svges/leaf-6.svg +4 -0
  319. package/assets/svges/lemon-squeezy.svg +6 -0
  320. package/assets/svges/life-guard-tube-1.svg +3 -0
  321. package/assets/svges/line-dashed.svg +5 -0
  322. package/assets/svges/line-dotted.svg +8 -0
  323. package/assets/svges/line-height.svg +7 -0
  324. package/assets/svges/line.svg +3 -0
  325. package/assets/svges/lineicons.svg +6 -0
  326. package/assets/svges/link-2-angular-right.svg +3 -0
  327. package/assets/svges/linkedin.svg +3 -0
  328. package/assets/svges/location-arrow-right.svg +3 -0
  329. package/assets/svges/locked-1.svg +4 -0
  330. package/assets/svges/locked-2.svg +4 -0
  331. package/assets/svges/loom.svg +3 -0
  332. package/assets/svges/magento.svg +4 -0
  333. package/assets/svges/magnet.svg +3 -0
  334. package/assets/svges/mailchimp.svg +3 -0
  335. package/assets/svges/map-marker-1.svg +6 -0
  336. package/assets/svges/map-marker-5.svg +4 -0
  337. package/assets/svges/map-pin-5.svg +3 -0
  338. package/assets/svges/markdown.svg +5 -0
  339. package/assets/svges/mastercard.svg +7 -0
  340. package/assets/svges/medium-alt.svg +3 -0
  341. package/assets/svges/medium.svg +3 -0
  342. package/assets/svges/megaphone-1.svg +3 -0
  343. package/assets/svges/menu-cheesburger.svg +8 -0
  344. package/assets/svges/menu-hamburger-1.svg +5 -0
  345. package/assets/svges/menu-meatballs-1.svg +5 -0
  346. package/assets/svges/menu-meatballs-2.svg +5 -0
  347. package/assets/svges/mercedes.svg +3 -0
  348. package/assets/svges/message-2-question.svg +5 -0
  349. package/assets/svges/message-2.svg +3 -0
  350. package/assets/svges/message-3-text.svg +5 -0
  351. package/assets/svges/meta-alt.svg +3 -0
  352. package/assets/svges/meta.svg +7 -0
  353. package/assets/svges/microphone-1.svg +4 -0
  354. package/assets/svges/microscope.svg +3 -0
  355. package/assets/svges/microsoft-edge.svg +5 -0
  356. package/assets/svges/microsoft-teams.svg +6 -0
  357. package/assets/svges/microsoft.svg +6 -0
  358. package/assets/svges/minus-circle.svg +4 -0
  359. package/assets/svges/minus.svg +3 -0
  360. package/assets/svges/mongodb.svg +3 -0
  361. package/assets/svges/monitor-code.svg +5 -0
  362. package/assets/svges/monitor-mac.svg +3 -0
  363. package/assets/svges/monitor.svg +3 -0
  364. package/assets/svges/moon-half-right-5.svg +3 -0
  365. package/assets/svges/mountains-2.svg +3 -0
  366. package/assets/svges/mouse-2.svg +3 -0
  367. package/assets/svges/mushroom-1.svg +3 -0
  368. package/assets/svges/mushroom-5.svg +6 -0
  369. package/assets/svges/music.svg +3 -0
  370. package/assets/svges/mysql.svg +3 -0
  371. package/assets/svges/nasa.svg +3 -0
  372. package/assets/svges/netflix.svg +3 -0
  373. package/assets/svges/netlify.svg +3 -0
  374. package/assets/svges/next-step-2.svg +3 -0
  375. package/assets/svges/nextjs.svg +3 -0
  376. package/assets/svges/nike.svg +3 -0
  377. package/assets/svges/nissan.svg +3 -0
  378. package/assets/svges/nodejs-alt.svg +3 -0
  379. package/assets/svges/nodejs.svg +3 -0
  380. package/assets/svges/notebook-1.svg +3 -0
  381. package/assets/svges/notion.svg +3 -0
  382. package/assets/svges/npm.svg +3 -0
  383. package/assets/svges/nuxt.svg +3 -0
  384. package/assets/svges/nvidia.svg +3 -0
  385. package/assets/svges/oculus.svg +4 -0
  386. package/assets/svges/open-ai.svg +3 -0
  387. package/assets/svges/opera-mini.svg +3 -0
  388. package/assets/svges/oracle.svg +3 -0
  389. package/assets/svges/outdent.svg +8 -0
  390. package/assets/svges/paddle.svg +3 -0
  391. package/assets/svges/page-break-1.svg +7 -0
  392. package/assets/svges/pagination.svg +7 -0
  393. package/assets/svges/paint-bucket.svg +3 -0
  394. package/assets/svges/paint-roller-1.svg +3 -0
  395. package/assets/svges/paperclip-1.svg +3 -0
  396. package/assets/svges/party-flags.svg +3 -0
  397. package/assets/svges/party-spray.svg +3 -0
  398. package/assets/svges/patreon.svg +3 -0
  399. package/assets/svges/pause.svg +4 -0
  400. package/assets/svges/payoneer.svg +4 -0
  401. package/assets/svges/paypal.svg +4 -0
  402. package/assets/svges/pen-to-square.svg +4 -0
  403. package/assets/svges/pencil-1.svg +3 -0
  404. package/assets/svges/pepsi.svg +4 -0
  405. package/assets/svges/phone.svg +4 -0
  406. package/assets/svges/photos.svg +4 -0
  407. package/assets/svges/php.svg +3 -0
  408. package/assets/svges/pie-chart-2.svg +3 -0
  409. package/assets/svges/pilcrow.svg +3 -0
  410. package/assets/svges/pimjo-logo.svg +9 -0
  411. package/assets/svges/pimjo-symbol.svg +3 -0
  412. package/assets/svges/pinterest.svg +3 -0
  413. package/assets/svges/pizza-2.svg +6 -0
  414. package/assets/svges/placeholder-dollar.svg +4 -0
  415. package/assets/svges/plantscale.svg +3 -0
  416. package/assets/svges/play-store.svg +3 -0
  417. package/assets/svges/play.svg +3 -0
  418. package/assets/svges/playstation.svg +5 -0
  419. package/assets/svges/plug-1.svg +3 -0
  420. package/assets/svges/plus-circle.svg +4 -0
  421. package/assets/svges/plus.svg +3 -0
  422. package/assets/svges/pnpm.svg +10 -0
  423. package/assets/svges/postgresql.svg +3 -0
  424. package/assets/svges/postman.svg +3 -0
  425. package/assets/svges/pound.svg +3 -0
  426. package/assets/svges/power-button.svg +4 -0
  427. package/assets/svges/previous-step-2.svg +3 -0
  428. package/assets/svges/printer.svg +3 -0
  429. package/assets/svges/prisma.svg +3 -0
  430. package/assets/svges/producthunt.svg +4 -0
  431. package/assets/svges/proton-mail-logo.svg +3 -0
  432. package/assets/svges/proton-mail-symbol.svg +3 -0
  433. package/assets/svges/python.svg +3 -0
  434. package/assets/svges/question-mark-circle.svg +5 -0
  435. package/assets/svges/question-mark.svg +4 -0
  436. package/assets/svges/quora.svg +4 -0
  437. package/assets/svges/radis.svg +3 -0
  438. package/assets/svges/react.svg +3 -0
  439. package/assets/svges/reddit.svg +6 -0
  440. package/assets/svges/refresh-circle-1-clockwise.svg +4 -0
  441. package/assets/svges/refresh-dollar-1.svg +5 -0
  442. package/assets/svges/refresh-user-1.svg +6 -0
  443. package/assets/svges/remix-js.svg +4 -0
  444. package/assets/svges/road-1.svg +6 -0
  445. package/assets/svges/rocket-5.svg +5 -0
  446. package/assets/svges/route-1.svg +7 -0
  447. package/assets/svges/rss-right.svg +6 -0
  448. package/assets/svges/ruler-1.svg +3 -0
  449. package/assets/svges/ruler-pen.svg +4 -0
  450. package/assets/svges/rupee.svg +3 -0
  451. package/assets/svges/safari.svg +35 -0
  452. package/assets/svges/sanity.svg +20 -0
  453. package/assets/svges/school-bench-1.svg +4 -0
  454. package/assets/svges/school-bench-2.svg +4 -0
  455. package/assets/svges/scissors-1-vertical.svg +4 -0
  456. package/assets/svges/scoter.svg +8 -0
  457. package/assets/svges/scroll-down-2.svg +6 -0
  458. package/assets/svges/search-1.svg +3 -0
  459. package/assets/svges/search-2.svg +4 -0
  460. package/assets/svges/search-minus.svg +4 -0
  461. package/assets/svges/search-plus.svg +4 -0
  462. package/assets/svges/search-text.svg +5 -0
  463. package/assets/svges/select-cursor-1.svg +10 -0
  464. package/assets/svges/seo-monitor.svg +6 -0
  465. package/assets/svges/service-bell-1.svg +3 -0
  466. package/assets/svges/share-1-circle.svg +4 -0
  467. package/assets/svges/share-1.svg +3 -0
  468. package/assets/svges/share-2.svg +4 -0
  469. package/assets/svges/shield-2-check.svg +4 -0
  470. package/assets/svges/shield-2.svg +3 -0
  471. package/assets/svges/shield-dollar.svg +4 -0
  472. package/assets/svges/shift-left.svg +4 -0
  473. package/assets/svges/shift-right.svg +4 -0
  474. package/assets/svges/ship-1.svg +5 -0
  475. package/assets/svges/shirt-1.svg +3 -0
  476. package/assets/svges/shopify.svg +3 -0
  477. package/assets/svges/shovel.svg +3 -0
  478. package/assets/svges/shuffle.svg +3 -0
  479. package/assets/svges/sign-post-left.svg +3 -0
  480. package/assets/svges/signal-app.svg +3 -0
  481. package/assets/svges/signs-post-2.svg +3 -0
  482. package/assets/svges/sketch.svg +3 -0
  483. package/assets/svges/skype.svg +3 -0
  484. package/assets/svges/slack.svg +10 -0
  485. package/assets/svges/slice-2.svg +3 -0
  486. package/assets/svges/sliders-horizontal-square-2.svg +7 -0
  487. package/assets/svges/slideshare.svg +5 -0
  488. package/assets/svges/snapchat.svg +3 -0
  489. package/assets/svges/sort-alphabetical.svg +5 -0
  490. package/assets/svges/sort-high-to-low.svg +7 -0
  491. package/assets/svges/soundcloud.svg +3 -0
  492. package/assets/svges/spacex.svg +4 -0
  493. package/assets/svges/spellcheck.svg +4 -0
  494. package/assets/svges/spinner-2-sacle.svg +10 -0
  495. package/assets/svges/spinner-3.svg +3 -0
  496. package/assets/svges/sports.svg +3 -0
  497. package/assets/svges/spotify-alt.svg +6 -0
  498. package/assets/svges/spotify.svg +3 -0
  499. package/assets/svges/squarespace.svg +3 -0
  500. package/assets/svges/stackoverflow.svg +8 -0
  501. package/assets/svges/stamp.svg +3 -0
  502. package/assets/svges/star-fat-half-2.svg +4 -0
  503. package/assets/svges/star-fat.svg +3 -0
  504. package/assets/svges/star-sharp-disabled.svg +4 -0
  505. package/assets/svges/statista.svg +3 -0
  506. package/assets/svges/steam.svg +5 -0
  507. package/assets/svges/stethoscope-1.svg +3 -0
  508. package/assets/svges/stopwatch.svg +5 -0
  509. package/assets/svges/storage-hdd-2.svg +4 -0
  510. package/assets/svges/strikethrough-1.svg +5 -0
  511. package/assets/svges/stripe.svg +9 -0
  512. package/assets/svges/stumbleupon.svg +3 -0
  513. package/assets/svges/sun-1.svg +11 -0
  514. package/assets/svges/supabase.svg +5 -0
  515. package/assets/svges/surfboard-2.svg +3 -0
  516. package/assets/svges/svelte.svg +3 -0
  517. package/assets/svges/swift.svg +3 -0
  518. package/assets/svges/tab.svg +4 -0
  519. package/assets/svges/tailwindcss.svg +3 -0
  520. package/assets/svges/target-user.svg +5 -0
  521. package/assets/svges/telegram.svg +3 -0
  522. package/assets/svges/telephone-1.svg +4 -0
  523. package/assets/svges/telephone-3.svg +5 -0
  524. package/assets/svges/tesla.svg +3 -0
  525. package/assets/svges/text-format-remove.svg +5 -0
  526. package/assets/svges/text-format.svg +5 -0
  527. package/assets/svges/text-paragraph.svg +6 -0
  528. package/assets/svges/thumbs-down-3.svg +3 -0
  529. package/assets/svges/thumbs-up-3.svg +3 -0
  530. package/assets/svges/ticket-1.svg +3 -0
  531. package/assets/svges/tickets-3.svg +7 -0
  532. package/assets/svges/tiktok-alt.svg +3 -0
  533. package/assets/svges/tiktok.svg +3 -0
  534. package/assets/svges/tower-broadcast-1.svg +7 -0
  535. package/assets/svges/toyota.svg +4 -0
  536. package/assets/svges/train-1.svg +4 -0
  537. package/assets/svges/train-3.svg +5 -0
  538. package/assets/svges/trash-3.svg +5 -0
  539. package/assets/svges/tree-2.svg +3 -0
  540. package/assets/svges/trees-3.svg +3 -0
  541. package/assets/svges/trello.svg +3 -0
  542. package/assets/svges/trend-down-1.svg +3 -0
  543. package/assets/svges/trend-up-1.svg +3 -0
  544. package/assets/svges/trophy-1.svg +3 -0
  545. package/assets/svges/trowel-1.svg +3 -0
  546. package/assets/svges/truck-delivery-1.svg +3 -0
  547. package/assets/svges/tumblr.svg +3 -0
  548. package/assets/svges/turborepo.svg +4 -0
  549. package/assets/svges/twitch.svg +3 -0
  550. package/assets/svges/twitter-old.svg +3 -0
  551. package/assets/svges/typescript.svg +3 -0
  552. package/assets/svges/uber-symbol.svg +3 -0
  553. package/assets/svges/uber.svg +3 -0
  554. package/assets/svges/ubuntu.svg +3 -0
  555. package/assets/svges/underline.svg +4 -0
  556. package/assets/svges/unlink-2-angular-eft.svg +8 -0
  557. package/assets/svges/unlocked-2.svg +4 -0
  558. package/assets/svges/unsplash.svg +4 -0
  559. package/assets/svges/upload-1.svg +4 -0
  560. package/assets/svges/upload-circle-1.svg +4 -0
  561. package/assets/svges/user-4.svg +4 -0
  562. package/assets/svges/user-multiple-4.svg +6 -0
  563. package/assets/svges/vector-nodes-6.svg +3 -0
  564. package/assets/svges/vector-nodes-7.svg +3 -0
  565. package/assets/svges/vercel.svg +3 -0
  566. package/assets/svges/vimeo.svg +3 -0
  567. package/assets/svges/visa.svg +3 -0
  568. package/assets/svges/vite.svg +6 -0
  569. package/assets/svges/vk.svg +3 -0
  570. package/assets/svges/vmware.svg +4 -0
  571. package/assets/svges/volkswagen.svg +8 -0
  572. package/assets/svges/volume-1.svg +5 -0
  573. package/assets/svges/volume-high.svg +6 -0
  574. package/assets/svges/volume-low.svg +4 -0
  575. package/assets/svges/volume-mute.svg +6 -0
  576. package/assets/svges/volume-off.svg +3 -0
  577. package/assets/svges/vs-code.svg +3 -0
  578. package/assets/svges/vuejs.svg +3 -0
  579. package/assets/svges/wallet-1.svg +3 -0
  580. package/assets/svges/watch-beat-1.svg +4 -0
  581. package/assets/svges/water-drop-1.svg +4 -0
  582. package/assets/svges/webflow.svg +3 -0
  583. package/assets/svges/webhooks.svg +3 -0
  584. package/assets/svges/wechat.svg +4 -0
  585. package/assets/svges/weight-machine-1.svg +4 -0
  586. package/assets/svges/whatsapp.svg +3 -0
  587. package/assets/svges/wheelbarrow-empty.svg +3 -0
  588. package/assets/svges/wheelchair-1.svg +3 -0
  589. package/assets/svges/windows.svg +6 -0
  590. package/assets/svges/wise.svg +3 -0
  591. package/assets/svges/wordpress.svg +3 -0
  592. package/assets/svges/www-cursor.svg +5 -0
  593. package/assets/svges/www.svg +4 -0
  594. package/assets/svges/x.svg +3 -0
  595. package/assets/svges/xampp.svg +5 -0
  596. package/assets/svges/xbox.svg +6 -0
  597. package/assets/svges/xmark-circle.svg +4 -0
  598. package/assets/svges/xmark.svg +3 -0
  599. package/assets/svges/xrp.svg +3 -0
  600. package/assets/svges/yahoo.svg +3 -0
  601. package/assets/svges/yarn.svg +4 -0
  602. package/assets/svges/ycombinator.svg +3 -0
  603. package/assets/svges/yen.svg +3 -0
  604. package/assets/svges/youtube-kids.svg +3 -0
  605. package/assets/svges/youtube-music.svg +4 -0
  606. package/assets/svges/youtube.svg +3 -0
  607. package/assets/svges/zapier.svg +3 -0
  608. package/assets/svges/zero-size.svg +6 -0
  609. package/assets/svges/zoom.svg +4 -0
  610. package/bin/test-svger.js +163 -0
  611. package/dist/__tests__/__mocks__/visual-diff.d.ts +7 -0
  612. package/dist/__tests__/__mocks__/visual-diff.js +13 -0
  613. package/dist/__tests__/fixtures.js +18 -18
  614. package/dist/cli.js +148 -2
  615. package/dist/config.js +4 -1
  616. package/dist/core/enhanced-plugin-manager.d.ts +107 -0
  617. package/dist/core/enhanced-plugin-manager.js +315 -0
  618. package/dist/core/error-handler.d.ts +1 -1
  619. package/dist/core/error-handler.js +14 -17
  620. package/dist/core/framework-templates.js +37 -47
  621. package/dist/core/logger.js +0 -1
  622. package/dist/core/performance-engine.js +10 -15
  623. package/dist/core/plugin-manager.js +4 -4
  624. package/dist/core/style-compiler.d.ts +0 -1
  625. package/dist/core/style-compiler.js +3 -6
  626. package/dist/index.d.ts +4 -0
  627. package/dist/index.js +4 -0
  628. package/dist/integrations/babel.d.ts +1 -1
  629. package/dist/integrations/babel.js +31 -12
  630. package/dist/integrations/jest-preset.js +1 -1
  631. package/dist/integrations/rollup.js +29 -10
  632. package/dist/integrations/vite.js +29 -14
  633. package/dist/integrations/webpack.d.ts +1 -0
  634. package/dist/integrations/webpack.js +29 -10
  635. package/dist/optimizers/advanced-stages.d.ts +40 -0
  636. package/dist/optimizers/advanced-stages.js +297 -0
  637. package/dist/optimizers/basic-cleaner.d.ts +68 -0
  638. package/dist/optimizers/basic-cleaner.js +198 -0
  639. package/dist/optimizers/collapse-useless-groups.d.ts +26 -0
  640. package/dist/optimizers/collapse-useless-groups.js +104 -0
  641. package/dist/optimizers/command-optimizer.d.ts +48 -0
  642. package/dist/optimizers/command-optimizer.js +299 -0
  643. package/dist/optimizers/index.d.ts +14 -0
  644. package/dist/optimizers/index.js +15 -0
  645. package/dist/optimizers/move-attrs-to-parent.d.ts +31 -0
  646. package/dist/optimizers/move-attrs-to-parent.js +115 -0
  647. package/dist/optimizers/numeric-optimizer.d.ts +43 -0
  648. package/dist/optimizers/numeric-optimizer.js +383 -0
  649. package/dist/optimizers/optimizer-pipeline.d.ts +39 -0
  650. package/dist/optimizers/optimizer-pipeline.js +81 -0
  651. package/dist/optimizers/path-deduplicator.d.ts +37 -0
  652. package/dist/optimizers/path-deduplicator.js +406 -0
  653. package/dist/optimizers/path-parser.d.ts +60 -0
  654. package/dist/optimizers/path-parser.js +428 -0
  655. package/dist/optimizers/path-shortener.d.ts +41 -0
  656. package/dist/optimizers/path-shortener.js +274 -0
  657. package/dist/optimizers/path-simplifier.d.ts +30 -0
  658. package/dist/optimizers/path-simplifier.js +326 -0
  659. package/dist/optimizers/remove-hidden-empty.d.ts +29 -0
  660. package/dist/optimizers/remove-hidden-empty.js +130 -0
  661. package/dist/optimizers/remove-unused-defs.d.ts +24 -0
  662. package/dist/optimizers/remove-unused-defs.js +132 -0
  663. package/dist/optimizers/shape-conversion.d.ts +74 -0
  664. package/dist/optimizers/shape-conversion.js +277 -0
  665. package/dist/optimizers/style-optimizer.d.ts +30 -0
  666. package/dist/optimizers/style-optimizer.js +324 -0
  667. package/dist/optimizers/svg-tree-parser.d.ts +55 -0
  668. package/dist/optimizers/svg-tree-parser.js +352 -0
  669. package/dist/optimizers/transform-collapsing.d.ts +38 -0
  670. package/dist/optimizers/transform-collapsing.js +444 -0
  671. package/dist/optimizers/transform-optimizer.d.ts +65 -0
  672. package/dist/optimizers/transform-optimizer.js +320 -0
  673. package/dist/optimizers/tree-serializer.d.ts +46 -0
  674. package/dist/optimizers/tree-serializer.js +190 -0
  675. package/dist/optimizers/tree-stages.d.ts +27 -0
  676. package/dist/optimizers/tree-stages.js +141 -0
  677. package/dist/optimizers/types.d.ts +207 -0
  678. package/dist/optimizers/types.js +122 -0
  679. package/dist/plugins/color-replacer.d.ts +39 -0
  680. package/dist/plugins/color-replacer.js +126 -0
  681. package/dist/plugins/gradient-optimizer.d.ts +33 -0
  682. package/dist/plugins/gradient-optimizer.js +197 -0
  683. package/dist/plugins/stroke-normalizer.d.ts +33 -0
  684. package/dist/plugins/stroke-normalizer.js +166 -0
  685. package/dist/plugins/watermark-remover.d.ts +32 -0
  686. package/dist/plugins/watermark-remover.js +133 -0
  687. package/dist/processors/svg-processor.d.ts +17 -2
  688. package/dist/processors/svg-processor.js +108 -32
  689. package/dist/services/config.d.ts +4 -0
  690. package/dist/services/config.js +62 -1
  691. package/dist/services/file-watcher.d.ts +1 -1
  692. package/dist/services/file-watcher.js +1 -1
  693. package/dist/services/svg-service.d.ts +6 -0
  694. package/dist/services/svg-service.js +66 -16
  695. package/dist/types/index.d.ts +1 -0
  696. package/dist/types/plugin-system.d.ts +153 -0
  697. package/dist/types/plugin-system.js +5 -0
  698. package/dist/utils/visual-diff.d.ts +150 -0
  699. package/dist/utils/visual-diff.js +247 -0
  700. package/dist/watch.js +0 -2
  701. package/docs/COMPLETE-ACHIEVEMENT-SUMMARY.md +401 -0
  702. package/docs/MIGRATION-4.0.0.md +271 -0
  703. package/docs/PIPELINE-INTEGRATION.md +406 -0
  704. package/docs/PLUGIN-DEVELOPMENT-GUIDE.md +807 -0
  705. package/docs/QUICK-REFERENCE.md +176 -0
  706. package/docs/SAMPLE-SVGS-TESTING.md +276 -0
  707. package/docs/archive/PHASE-1-ARCHITECTURE.md +345 -0
  708. package/docs/archive/PHASE-1-IMPLEMENTATION.md +307 -0
  709. package/docs/archive/PHASE-1-SUMMARY.md +298 -0
  710. package/docs/archive/PHASE-2-COMPLETE.md +207 -0
  711. package/docs/archive/PHASE-3-SUMMARY.md +149 -0
  712. package/docs/archive/PHASE-4.3-COMMAND-OPTIMIZER.md +323 -0
  713. package/docs/archive/PHASE-4.4-PATH-SIMPLIFICATION.md +81 -0
  714. package/docs/archive/PHASE-4.5-PATH-DEDUPLICATION.md +449 -0
  715. package/docs/archive/PHASE-5.1-SUCCESS-REPORT.md +207 -0
  716. package/docs/archive/PHASE-5.1-TRANSFORM-COLLAPSING.md +362 -0
  717. package/docs/archive/PHASE-6.1-SHAPE-CONVERSION-DESIGN.md +518 -0
  718. package/docs/archive/PHASE-6.2-PLUGIN-SYSTEM-STATUS.md +403 -0
  719. package/docs/archive/PHASE-6.3-FINAL-STATUS.md +193 -0
  720. package/docs/archive/PHASE-6.3-VALIDATION-PROGRESS.md +345 -0
  721. package/docs/archive/PHASE-6.3-VISUAL-DIFF-DESIGN.md +553 -0
  722. package/docs/archive/PHASE-6.3-VISUAL-DIFF-SUMMARY.md +367 -0
  723. package/docs/archive/PHASE-6.3-XML-SERIALIZATION-FIX.md +210 -0
  724. package/docs/archive/RELEASE-NOTES-3.2.0.md +344 -0
  725. package/docs/archive/RELEASE-PREP-3.2.0.md +376 -0
  726. package/docs/performance/PERFORMANCE-RESULTS.md +31 -0
  727. package/docs/performance/REAL-WORLD-BENCHMARKS.md +159 -0
  728. package/package.json +16 -6
  729. package/DEVELOPMENT.md +0 -353
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Phase 3: Numeric & Attribute Optimizer
3
+ *
4
+ * Responsibilities:
5
+ * 1. Round floating-point numbers with configurable precision
6
+ * 2. Optimize color representations (#RRGGBB → #RGB, named → hex)
7
+ * 3. Remove default/unnecessary attributes
8
+ * 4. Shorten numeric values (remove trailing zeros, unnecessary decimals)
9
+ */
10
+ /**
11
+ * SVG default attribute values by element type
12
+ * Only remove if value matches default exactly
13
+ */
14
+ const SVG_DEFAULTS = {
15
+ '*': {
16
+ // Universal defaults
17
+ fill: 'black',
18
+ 'fill-opacity': '1',
19
+ 'fill-rule': 'nonzero',
20
+ stroke: 'none',
21
+ 'stroke-width': '1',
22
+ 'stroke-opacity': '1',
23
+ 'stroke-linecap': 'butt',
24
+ 'stroke-linejoin': 'miter',
25
+ 'stroke-miterlimit': '4',
26
+ opacity: '1',
27
+ visibility: 'visible',
28
+ display: 'inline',
29
+ },
30
+ text: {
31
+ 'font-size': '16',
32
+ 'font-family': 'sans-serif',
33
+ 'text-anchor': 'start',
34
+ },
35
+ path: {
36
+ 'fill-rule': 'nonzero',
37
+ },
38
+ };
39
+ /**
40
+ * Named CSS colors that can be shortened
41
+ * Maps long color names to shorter hex equivalents
42
+ */
43
+ const NAMED_COLOR_SHORTCUTS = {
44
+ // Short hex is shorter than name
45
+ white: '#fff',
46
+ black: '#000',
47
+ red: '#f00',
48
+ lime: '#0f0',
49
+ blue: '#00f',
50
+ yellow: '#ff0',
51
+ cyan: '#0ff',
52
+ magenta: '#f0f',
53
+ silver: '#c0c0c0',
54
+ gray: '#808080',
55
+ maroon: '#800000',
56
+ olive: '#808000',
57
+ green: '#008000',
58
+ purple: '#800080',
59
+ teal: '#008080',
60
+ navy: '#000080',
61
+ };
62
+ /**
63
+ * Hex colors that can use named equivalents (if shorter)
64
+ * Reverse of above - maps hex to name when name is shorter
65
+ */
66
+ const HEX_TO_NAME = {
67
+ '#f0ffff': 'azure',
68
+ '#f5f5dc': 'beige',
69
+ '#ffe4c4': 'bisque',
70
+ '#a52a2a': 'brown',
71
+ '#ff7f50': 'coral',
72
+ '#ffd700': 'gold',
73
+ '#808080': 'gray',
74
+ '#008000': 'green',
75
+ '#4b0082': 'indigo',
76
+ '#fffff0': 'ivory',
77
+ '#f0e68c': 'khaki',
78
+ '#faf0e6': 'linen',
79
+ '#800000': 'maroon',
80
+ '#000080': 'navy',
81
+ '#808000': 'olive',
82
+ '#ffa500': 'orange',
83
+ '#da70d6': 'orchid',
84
+ '#cd853f': 'peru',
85
+ '#ffc0cb': 'pink',
86
+ '#dda0dd': 'plum',
87
+ '#800080': 'purple',
88
+ '#f00': 'red',
89
+ '#fa8072': 'salmon',
90
+ '#a0522d': 'sienna',
91
+ '#c0c0c0': 'silver',
92
+ '#fffafa': 'snow',
93
+ '#d2b48c': 'tan',
94
+ '#008080': 'teal',
95
+ '#ff6347': 'tomato',
96
+ '#ee82ee': 'violet',
97
+ '#f5deb3': 'wheat',
98
+ };
99
+ /**
100
+ * Round a number to specified decimal places
101
+ * Removes trailing zeros and unnecessary decimal point
102
+ */
103
+ export function roundNumber(value, precision) {
104
+ if (!isFinite(value)) {
105
+ return String(value);
106
+ }
107
+ // Round to precision
108
+ const multiplier = Math.pow(10, precision);
109
+ const rounded = Math.round(value * multiplier) / multiplier;
110
+ // Convert to string and remove trailing zeros
111
+ let result = rounded.toFixed(precision);
112
+ // Remove trailing zeros after decimal point
113
+ if (result.includes('.')) {
114
+ result = result.replace(/\.?0+$/, '');
115
+ }
116
+ // Handle negative zero
117
+ if (result === '-0') {
118
+ result = '0';
119
+ }
120
+ return result;
121
+ }
122
+ /**
123
+ * Optimize a numeric string value
124
+ * Removes unnecessary decimals, trailing zeros, etc.
125
+ */
126
+ export function optimizeNumericString(value, precision) {
127
+ // Try to parse as number
128
+ const num = parseFloat(value);
129
+ if (isNaN(num)) {
130
+ return value;
131
+ }
132
+ return roundNumber(num, precision);
133
+ }
134
+ /**
135
+ * Convert rgb(r, g, b) to hex
136
+ */
137
+ function rgbToHex(r, g, b) {
138
+ const toHex = (n) => {
139
+ const hex = Math.round(n).toString(16);
140
+ return hex.length === 1 ? '0' + hex : hex;
141
+ };
142
+ return '#' + toHex(r) + toHex(g) + toHex(b);
143
+ }
144
+ /**
145
+ * Shorten hex color #RRGGBB to #RGB if possible
146
+ */
147
+ function shortenHexColor(hex) {
148
+ // Match #RRGGBB format
149
+ const match = hex.match(/^#([0-9a-f]{6})$/i);
150
+ if (!match) {
151
+ return hex;
152
+ }
153
+ const [, rrggbb] = match;
154
+ const r1 = rrggbb[0];
155
+ const r2 = rrggbb[1];
156
+ const g1 = rrggbb[2];
157
+ const g2 = rrggbb[3];
158
+ const b1 = rrggbb[4];
159
+ const b2 = rrggbb[5];
160
+ // Can shorten if each pair has identical digits
161
+ if (r1 === r2 && g1 === g2 && b1 === b2) {
162
+ return `#${r1}${g1}${b1}`.toLowerCase();
163
+ }
164
+ return hex.toLowerCase();
165
+ }
166
+ /**
167
+ * Optimize color value to shortest representation
168
+ * Handles: named colors, hex colors, rgb() notation
169
+ */
170
+ export function optimizeColor(color) {
171
+ const trimmed = color.trim().toLowerCase();
172
+ // Handle named colors → hex
173
+ if (NAMED_COLOR_SHORTCUTS[trimmed]) {
174
+ return NAMED_COLOR_SHORTCUTS[trimmed];
175
+ }
176
+ // Handle rgb(r, g, b) notation
177
+ const rgbMatch = trimmed.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);
178
+ if (rgbMatch) {
179
+ const r = parseInt(rgbMatch[1], 10);
180
+ const g = parseInt(rgbMatch[2], 10);
181
+ const b = parseInt(rgbMatch[3], 10);
182
+ const hex = rgbToHex(r, g, b);
183
+ return shortenHexColor(hex);
184
+ }
185
+ // Handle rgba with alpha=1 (can drop alpha)
186
+ const rgbaMatch = trimmed.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*1(\.0*)?\s*\)$/);
187
+ if (rgbaMatch) {
188
+ const r = parseInt(rgbaMatch[1], 10);
189
+ const g = parseInt(rgbaMatch[2], 10);
190
+ const b = parseInt(rgbaMatch[3], 10);
191
+ const hex = rgbToHex(r, g, b);
192
+ return shortenHexColor(hex);
193
+ }
194
+ // Handle hex colors
195
+ if (trimmed.startsWith('#')) {
196
+ const shortened = shortenHexColor(trimmed);
197
+ // Check if a named color is shorter
198
+ const named = HEX_TO_NAME[shortened];
199
+ if (named && named.length < shortened.length) {
200
+ return named;
201
+ }
202
+ return shortened;
203
+ }
204
+ // Return as-is if no optimization possible
205
+ return color;
206
+ }
207
+ /**
208
+ * Check if attribute value is the default for the element
209
+ */
210
+ function isDefaultValue(elementTag, attrName, attrValue) {
211
+ // Check element-specific defaults
212
+ const elementDefaults = SVG_DEFAULTS[elementTag];
213
+ if (elementDefaults && elementDefaults[attrName] === attrValue) {
214
+ return true;
215
+ }
216
+ // Check universal defaults
217
+ const universalDefaults = SVG_DEFAULTS['*'];
218
+ if (universalDefaults && universalDefaults[attrName] === attrValue) {
219
+ return true;
220
+ }
221
+ return false;
222
+ }
223
+ /**
224
+ * Optimize a single attribute value
225
+ */
226
+ function optimizeAttributeValue(attrName, attrValue, config) {
227
+ // Color attributes
228
+ const colorAttrs = new Set([
229
+ 'fill',
230
+ 'stroke',
231
+ 'stop-color',
232
+ 'flood-color',
233
+ 'lighting-color',
234
+ ]);
235
+ if (colorAttrs.has(attrName)) {
236
+ return optimizeColor(attrValue);
237
+ }
238
+ // Numeric attributes
239
+ const numericAttrs = new Set([
240
+ 'x',
241
+ 'y',
242
+ 'cx',
243
+ 'cy',
244
+ 'r',
245
+ 'rx',
246
+ 'ry',
247
+ 'width',
248
+ 'height',
249
+ 'x1',
250
+ 'y1',
251
+ 'x2',
252
+ 'y2',
253
+ 'stroke-width',
254
+ 'font-size',
255
+ 'opacity',
256
+ 'fill-opacity',
257
+ 'stroke-opacity',
258
+ 'offset',
259
+ ]);
260
+ if (numericAttrs.has(attrName)) {
261
+ return optimizeNumericString(attrValue, config.floatPrecision);
262
+ }
263
+ // Path data (d attribute) - special handling
264
+ if (attrName === 'd') {
265
+ return optimizePathData(attrValue, config.floatPrecision);
266
+ }
267
+ // Points attribute (for polygon/polyline)
268
+ if (attrName === 'points') {
269
+ return optimizePointsData(attrValue, config.floatPrecision);
270
+ }
271
+ // ViewBox
272
+ if (attrName === 'viewBox') {
273
+ return optimizeViewBox(attrValue, config.floatPrecision);
274
+ }
275
+ return attrValue;
276
+ }
277
+ /**
278
+ * Optimize path data (d attribute)
279
+ * Rounds numbers, removes unnecessary spaces
280
+ */
281
+ function optimizePathData(pathData, precision) {
282
+ // Replace all numbers with optimized versions
283
+ return pathData.replace(/-?[\d.]+/g, match => {
284
+ const num = parseFloat(match);
285
+ if (isNaN(num)) {
286
+ return match;
287
+ }
288
+ return roundNumber(num, precision);
289
+ });
290
+ }
291
+ /**
292
+ * Optimize points data (for polygon/polyline)
293
+ */
294
+ function optimizePointsData(points, precision) {
295
+ // Split by whitespace and/or commas
296
+ const coords = points.split(/[\s,]+/).filter(Boolean);
297
+ // Optimize each coordinate
298
+ const optimized = coords.map(coord => {
299
+ const num = parseFloat(coord);
300
+ if (isNaN(num)) {
301
+ return coord;
302
+ }
303
+ return roundNumber(num, precision);
304
+ });
305
+ // Join with spaces (shortest separator)
306
+ return optimized.join(' ');
307
+ }
308
+ /**
309
+ * Optimize viewBox attribute
310
+ */
311
+ function optimizeViewBox(viewBox, precision) {
312
+ const values = viewBox.split(/[\s,]+/).filter(Boolean);
313
+ const optimized = values.map(val => {
314
+ const num = parseFloat(val);
315
+ if (isNaN(num)) {
316
+ return val;
317
+ }
318
+ return roundNumber(num, precision);
319
+ });
320
+ return optimized.join(' ');
321
+ }
322
+ /**
323
+ * Remove default and unnecessary attributes from a node
324
+ */
325
+ function removeDefaultAttributes(node) {
326
+ let removedCount = 0;
327
+ const attrsToRemove = [];
328
+ for (const [name, value] of node.attrs) {
329
+ if (isDefaultValue(node.tag, name, value)) {
330
+ attrsToRemove.push(name);
331
+ removedCount++;
332
+ }
333
+ }
334
+ // Remove marked attributes
335
+ for (const name of attrsToRemove) {
336
+ node.attrs.delete(name);
337
+ }
338
+ return removedCount;
339
+ }
340
+ /**
341
+ * Optimize all numeric values and attributes in the tree
342
+ */
343
+ export function optimizeNumericValues(root, config) {
344
+ let optimizedAttributes = 0;
345
+ let removedDefaults = 0;
346
+ // Traverse tree
347
+ const traverse = (node) => {
348
+ // Optimize attribute values
349
+ for (const [name, value] of node.attrs) {
350
+ const optimized = optimizeAttributeValue(name, value, config);
351
+ if (optimized !== value) {
352
+ node.attrs.set(name, optimized);
353
+ optimizedAttributes++;
354
+ }
355
+ }
356
+ // Remove default attributes
357
+ if (config.removeUnnecessaryAttrs) {
358
+ const removed = removeDefaultAttributes(node);
359
+ removedDefaults += removed;
360
+ }
361
+ // Recurse to children
362
+ for (const child of node.children) {
363
+ if (child.type === 'element') {
364
+ traverse(child);
365
+ }
366
+ }
367
+ };
368
+ traverse(root);
369
+ return {
370
+ optimizedAttributes,
371
+ removedDefaults,
372
+ };
373
+ }
374
+ /**
375
+ * Numeric optimization stage for pipeline
376
+ */
377
+ export function numericOptimizationStage(root, config) {
378
+ const stats = optimizeNumericValues(root, config);
379
+ return {
380
+ modified: stats.optimizedAttributes > 0 || stats.removedDefaults > 0,
381
+ stats,
382
+ };
383
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Advanced SVG Optimizer Pipeline
3
+ * Pluggable stage-based optimization system
4
+ */
5
+ import type { OptConfig, OptimizationStage, OptimizationResult } from './types.js';
6
+ import { OptLevel } from './types.js';
7
+ /**
8
+ * SVG Optimizer Pipeline
9
+ * Orchestrates optimization stages in a composable manner
10
+ */
11
+ export declare class OptimizerPipeline {
12
+ private stages;
13
+ private config;
14
+ constructor(config?: Partial<OptConfig>);
15
+ /**
16
+ * Register an optimization stage
17
+ */
18
+ registerStage(name: string, fn: OptimizationStage): this;
19
+ /**
20
+ * Execute optimization pipeline
21
+ */
22
+ optimize(svgString: string): Promise<OptimizationResult>;
23
+ /**
24
+ * Get current configuration
25
+ */
26
+ getConfig(): OptConfig;
27
+ /**
28
+ * Update configuration
29
+ */
30
+ updateConfig(config: Partial<OptConfig>): void;
31
+ /**
32
+ * Clear all registered stages
33
+ */
34
+ clearStages(): void;
35
+ }
36
+ /**
37
+ * Create a pre-configured optimizer pipeline based on optimization level
38
+ */
39
+ export declare function createOptimizerPipeline(level?: OptLevel): OptimizerPipeline;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Advanced SVG Optimizer Pipeline
3
+ * Pluggable stage-based optimization system
4
+ */
5
+ import { OptLevel, getDefaultOptConfig } from './types.js';
6
+ /**
7
+ * SVG Optimizer Pipeline
8
+ * Orchestrates optimization stages in a composable manner
9
+ */
10
+ export class OptimizerPipeline {
11
+ stages = [];
12
+ config;
13
+ constructor(config) {
14
+ const level = config?.level || OptLevel.BALANCED;
15
+ this.config = {
16
+ ...getDefaultOptConfig(level),
17
+ ...config,
18
+ };
19
+ }
20
+ /**
21
+ * Register an optimization stage
22
+ */
23
+ registerStage(name, fn) {
24
+ this.stages.push({ name, fn });
25
+ return this;
26
+ }
27
+ /**
28
+ * Execute optimization pipeline
29
+ */
30
+ async optimize(svgString) {
31
+ const originalSize = Buffer.byteLength(svgString, 'utf8');
32
+ let optimizedSvg = svgString;
33
+ const stagesApplied = [];
34
+ // Execute each stage sequentially
35
+ for (const stage of this.stages) {
36
+ try {
37
+ const result = await stage.fn(optimizedSvg, this.config);
38
+ optimizedSvg = result;
39
+ stagesApplied.push(stage.name);
40
+ }
41
+ catch (error) {
42
+ console.warn(`⚠️ Stage "${stage.name}" failed, skipping:`, error.message);
43
+ // Continue with other stages even if one fails
44
+ }
45
+ }
46
+ const optimizedSize = Buffer.byteLength(optimizedSvg, 'utf8');
47
+ const reductionPercent = ((originalSize - optimizedSize) / originalSize) * 100;
48
+ return {
49
+ optimizedSvg,
50
+ originalSize,
51
+ optimizedSize,
52
+ reductionPercent,
53
+ stagesApplied,
54
+ };
55
+ }
56
+ /**
57
+ * Get current configuration
58
+ */
59
+ getConfig() {
60
+ return { ...this.config };
61
+ }
62
+ /**
63
+ * Update configuration
64
+ */
65
+ updateConfig(config) {
66
+ this.config = { ...this.config, ...config };
67
+ }
68
+ /**
69
+ * Clear all registered stages
70
+ */
71
+ clearStages() {
72
+ this.stages = [];
73
+ }
74
+ }
75
+ /**
76
+ * Create a pre-configured optimizer pipeline based on optimization level
77
+ */
78
+ export function createOptimizerPipeline(level = OptLevel.BALANCED) {
79
+ const config = getDefaultOptConfig(level);
80
+ return new OptimizerPipeline(config);
81
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Phase 4.5: Path Merging + <use> Extraction
3
+ *
4
+ * The ultimate optimization for icon libraries and sprite sheets with repeated shapes.
5
+ * Detects identical shapes and extracts them to <defs> with <use> references.
6
+ *
7
+ * Target: 70-80% reduction on icon sets with duplicates (Material Icons, Font Awesome, etc.)
8
+ *
9
+ * Features:
10
+ * 1. Identical shape detection using path hash + style signature
11
+ * 2. Extract repeated shapes to <defs> and replace with <use>
12
+ * 3. Merge adjacent paths with identical styling
13
+ * 4. Transform-aware deduplication
14
+ * 5. Minimum occurrence threshold (only extract if used 2+ times)
15
+ *
16
+ * This is the crowning achievement that makes svger-cli unbeatable.
17
+ */
18
+ import type { OptConfig } from './types.js';
19
+ /**
20
+ * Extract repeated shapes to <defs> and replace with <use>
21
+ */
22
+ export declare function extractRepeatedShapes(svgContent: string, config: OptConfig): {
23
+ result: string;
24
+ shapesExtracted: number;
25
+ bytesReduced: number;
26
+ };
27
+ /**
28
+ * Merge adjacent paths with identical styling
29
+ */
30
+ export declare function mergeAdjacentPaths(svgContent: string): {
31
+ result: string;
32
+ pathsMerged: number;
33
+ };
34
+ /**
35
+ * Combined path merging and <use> extraction stage
36
+ */
37
+ export declare function pathDeduplicationStage(svg: string, config: OptConfig): Promise<string>;