svger-cli 3.1.1 → 4.0.1

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 (728) hide show
  1. package/CHANGELOG.md +369 -0
  2. package/README.md +432 -25
  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/core/template-manager.js +2 -2
  627. package/dist/index.d.ts +4 -0
  628. package/dist/index.js +4 -0
  629. package/dist/integrations/babel.d.ts +1 -1
  630. package/dist/integrations/babel.js +1 -1
  631. package/dist/integrations/jest-preset.js +1 -1
  632. package/dist/optimizers/advanced-stages.d.ts +40 -0
  633. package/dist/optimizers/advanced-stages.js +297 -0
  634. package/dist/optimizers/basic-cleaner.d.ts +72 -0
  635. package/dist/optimizers/basic-cleaner.js +240 -0
  636. package/dist/optimizers/collapse-useless-groups.d.ts +26 -0
  637. package/dist/optimizers/collapse-useless-groups.js +104 -0
  638. package/dist/optimizers/command-optimizer.d.ts +48 -0
  639. package/dist/optimizers/command-optimizer.js +299 -0
  640. package/dist/optimizers/index.d.ts +14 -0
  641. package/dist/optimizers/index.js +15 -0
  642. package/dist/optimizers/move-attrs-to-parent.d.ts +31 -0
  643. package/dist/optimizers/move-attrs-to-parent.js +115 -0
  644. package/dist/optimizers/numeric-optimizer.d.ts +43 -0
  645. package/dist/optimizers/numeric-optimizer.js +383 -0
  646. package/dist/optimizers/optimizer-pipeline.d.ts +39 -0
  647. package/dist/optimizers/optimizer-pipeline.js +81 -0
  648. package/dist/optimizers/path-deduplicator.d.ts +37 -0
  649. package/dist/optimizers/path-deduplicator.js +406 -0
  650. package/dist/optimizers/path-parser.d.ts +60 -0
  651. package/dist/optimizers/path-parser.js +428 -0
  652. package/dist/optimizers/path-shortener.d.ts +41 -0
  653. package/dist/optimizers/path-shortener.js +274 -0
  654. package/dist/optimizers/path-simplifier.d.ts +30 -0
  655. package/dist/optimizers/path-simplifier.js +326 -0
  656. package/dist/optimizers/remove-hidden-empty.d.ts +29 -0
  657. package/dist/optimizers/remove-hidden-empty.js +130 -0
  658. package/dist/optimizers/remove-unused-defs.d.ts +24 -0
  659. package/dist/optimizers/remove-unused-defs.js +132 -0
  660. package/dist/optimizers/shape-conversion.d.ts +74 -0
  661. package/dist/optimizers/shape-conversion.js +277 -0
  662. package/dist/optimizers/style-optimizer.d.ts +30 -0
  663. package/dist/optimizers/style-optimizer.js +324 -0
  664. package/dist/optimizers/svg-tree-parser.d.ts +55 -0
  665. package/dist/optimizers/svg-tree-parser.js +352 -0
  666. package/dist/optimizers/transform-collapsing.d.ts +38 -0
  667. package/dist/optimizers/transform-collapsing.js +444 -0
  668. package/dist/optimizers/transform-optimizer.d.ts +65 -0
  669. package/dist/optimizers/transform-optimizer.js +320 -0
  670. package/dist/optimizers/tree-serializer.d.ts +46 -0
  671. package/dist/optimizers/tree-serializer.js +190 -0
  672. package/dist/optimizers/tree-stages.d.ts +27 -0
  673. package/dist/optimizers/tree-stages.js +141 -0
  674. package/dist/optimizers/types.d.ts +207 -0
  675. package/dist/optimizers/types.js +122 -0
  676. package/dist/plugins/color-replacer.d.ts +39 -0
  677. package/dist/plugins/color-replacer.js +126 -0
  678. package/dist/plugins/gradient-optimizer.d.ts +33 -0
  679. package/dist/plugins/gradient-optimizer.js +197 -0
  680. package/dist/plugins/stroke-normalizer.d.ts +33 -0
  681. package/dist/plugins/stroke-normalizer.js +166 -0
  682. package/dist/plugins/watermark-remover.d.ts +32 -0
  683. package/dist/plugins/watermark-remover.js +133 -0
  684. package/dist/processors/svg-processor.d.ts +22 -2
  685. package/dist/processors/svg-processor.js +145 -35
  686. package/dist/services/config.d.ts +4 -0
  687. package/dist/services/config.js +62 -1
  688. package/dist/services/file-watcher.d.ts +1 -1
  689. package/dist/services/file-watcher.js +1 -1
  690. package/dist/services/svg-service.d.ts +4 -0
  691. package/dist/services/svg-service.js +41 -7
  692. package/dist/types/index.d.ts +1 -0
  693. package/dist/types/plugin-system.d.ts +153 -0
  694. package/dist/types/plugin-system.js +5 -0
  695. package/dist/utils/visual-diff.d.ts +154 -0
  696. package/dist/utils/visual-diff.js +278 -0
  697. package/dist/watch.js +0 -2
  698. package/docs/BUG-FIX-REACT-JSX.md +210 -0
  699. package/docs/COMPLETE-ACHIEVEMENT-SUMMARY.md +401 -0
  700. package/docs/MIGRATION-4.0.0.md +271 -0
  701. package/docs/OPTIONAL-DEPENDENCIES.md +161 -0
  702. package/docs/OPTIONAL-DEPS-FIX-V4.0.1.md +309 -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 +18 -6
@@ -0,0 +1,807 @@
1
+ # Plugin Development Guide
2
+
3
+ **Version:** v3.2.0+
4
+ **Status:** Phase 6.2 - Plugin System Foundation
5
+ **Last Updated:** January 2, 2026
6
+
7
+ ---
8
+
9
+ ## Table of Contents
10
+
11
+ 1. [Introduction](#introduction)
12
+ 2. [Plugin Architecture](#plugin-architecture)
13
+ 3. [Quick Start](#quick-start)
14
+ 4. [Plugin API Reference](#plugin-api-reference)
15
+ 5. [Hook Types](#hook-types)
16
+ 6. [Visual Validation](#visual-validation)
17
+ 7. [Example Plugins](#example-plugins)
18
+ 8. [Best Practices](#best-practices)
19
+ 9. [Testing Your Plugin](#testing-your-plugin)
20
+ 10. [Publishing Your Plugin](#publishing-your-plugin)
21
+
22
+ ---
23
+
24
+ ## Introduction
25
+
26
+ The svger-cli plugin system allows you to extend the SVG optimization pipeline with custom transformations. Plugins can:
27
+
28
+ - ✅ Hook into 6 pipeline stages (before/after parse, stage, serialize)
29
+ - ✅ Modify SVG content at any point in the optimization process
30
+ - ✅ Validate changes with pixel-perfect visual diff testing
31
+ - ✅ Track execution metrics and performance
32
+ - ✅ Access optimization configuration
33
+ - ✅ Pass metadata between hooks
34
+
35
+ **Use Cases:**
36
+ - Color palette replacement
37
+ - Watermark removal
38
+ - Custom attribute cleanup
39
+ - Gradient optimization
40
+ - Shape merging
41
+ - Text path conversion
42
+
43
+ ---
44
+
45
+ ## Plugin Architecture
46
+
47
+ ### Pipeline Flow
48
+
49
+ ```
50
+ Input SVG
51
+
52
+ ┌───────────────┐
53
+ │ before-parse │ ← Hook: Pre-processing (remove watermarks, etc.)
54
+ └───────────────┘
55
+
56
+ ┌───────────────┐
57
+ │ SVG Parser │
58
+ └───────────────┘
59
+
60
+ ┌───────────────┐
61
+ │ after-parse │ ← Hook: Post-parse modifications (color replacement)
62
+ └───────────────┘
63
+
64
+ ┌───────────────┐
65
+ │ before-stage │ ← Hook: Before each optimization stage
66
+ └───────────────┘
67
+
68
+ ┌───────────────┐
69
+ │ Optimization │ (basic-cleaning, numeric, style, transform, etc.)
70
+ │ Stages │
71
+ └───────────────┘
72
+
73
+ ┌───────────────┐
74
+ │ after-stage │ ← Hook: After each optimization stage
75
+ └───────────────┘
76
+
77
+ ┌─────────────────┐
78
+ │ before-serialize│ ← Hook: Final cleanup (comment removal, attribute sorting)
79
+ └─────────────────┘
80
+
81
+ ┌───────────────┐
82
+ │ Serializer │
83
+ └───────────────┘
84
+
85
+ ┌─────────────────┐
86
+ │ after-serialize │ ← Hook: Post-serialization validation
87
+ └─────────────────┘
88
+
89
+ Output SVG
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Quick Start
95
+
96
+ ### 1. Create Your First Plugin
97
+
98
+ ```typescript
99
+ import type { EnhancedPlugin } from 'svger-cli/types/plugin-system';
100
+
101
+ const myFirstPlugin: EnhancedPlugin = {
102
+ // Required: Unique identifier
103
+ name: 'my-first-plugin',
104
+
105
+ // Required: Semantic versioning
106
+ version: '1.0.0',
107
+
108
+ // Optional: Description
109
+ description: 'Replaces all red colors with green',
110
+
111
+ // Optional: Author information
112
+ author: 'Your Name <your@email.com>',
113
+
114
+ // Required: At least one hook
115
+ hooks: {
116
+ 'after-parse': async (context) => {
117
+ // Modify SVG content
118
+ const modifiedContent = context.content
119
+ .replace(/fill="red"/g, 'fill="green"')
120
+ .replace(/stroke="red"/g, 'stroke="green"');
121
+
122
+ return {
123
+ content: modifiedContent,
124
+ metadata: {
125
+ colorsReplaced: (context.content.match(/red/g) || []).length,
126
+ },
127
+ };
128
+ },
129
+ },
130
+
131
+ // Optional: Visual validation (highly recommended)
132
+ validation: {
133
+ enabled: true,
134
+ maxDiffPercent: 100, // 100% = color changes expected
135
+ options: {
136
+ diff: { threshold: 0.1 },
137
+ },
138
+ },
139
+ };
140
+ ```
141
+
142
+ ### 2. Register Your Plugin
143
+
144
+ ```typescript
145
+ import { getPluginManager } from 'svger-cli/core/enhanced-plugin-manager';
146
+
147
+ const pluginManager = getPluginManager();
148
+ pluginManager.registerPlugin(myFirstPlugin);
149
+ ```
150
+
151
+ ### 3. Use Plugin with Optimizer
152
+
153
+ ```typescript
154
+ import { optimizeWithPlugins } from 'svger-cli/examples/plugin-integration-example';
155
+ import { OptLevel } from 'svger-cli/optimizers/types';
156
+
157
+ const result = await optimizeWithPlugins(svgContent, OptLevel.BALANCED);
158
+
159
+ console.log(`Optimized: ${result.reductionPercent.toFixed(2)}% smaller`);
160
+ console.log(`Plugins executed: ${result.pluginMetrics.totalExecutions} times`);
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Plugin API Reference
166
+
167
+ ### EnhancedPlugin Interface
168
+
169
+ ```typescript
170
+ interface EnhancedPlugin {
171
+ /** Unique plugin identifier (required) */
172
+ name: string;
173
+
174
+ /** Semantic version (required) */
175
+ version: string;
176
+
177
+ /** Human-readable description (optional) */
178
+ description?: string;
179
+
180
+ /** Author information (optional) */
181
+ author?: string;
182
+
183
+ /** Pipeline hooks (at least one required) */
184
+ hooks: {
185
+ 'before-parse'?: PluginHookFunction;
186
+ 'after-parse'?: PluginHookFunction;
187
+ 'before-stage'?: PluginHookFunction;
188
+ 'after-stage'?: PluginHookFunction;
189
+ 'before-serialize'?: PluginHookFunction;
190
+ 'after-serialize'?: PluginHookFunction;
191
+ };
192
+
193
+ /** Visual validation configuration (optional but recommended) */
194
+ validation?: {
195
+ enabled: boolean;
196
+ maxDiffPercent?: number; // Default: 5%
197
+ options?: Partial<CompareOptions>;
198
+ };
199
+
200
+ /** Custom config schema (optional) */
201
+ configSchema?: Record<string, any>;
202
+
203
+ /** Initialization function (optional) */
204
+ init?: () => Promise<void>;
205
+
206
+ /** Cleanup function (optional) */
207
+ cleanup?: () => Promise<void>;
208
+
209
+ /** Custom validation function (optional) */
210
+ validate?: () => boolean;
211
+ }
212
+ ```
213
+
214
+ ### PluginHookContext
215
+
216
+ ```typescript
217
+ interface PluginHookContext {
218
+ /** Current SVG content */
219
+ content: string;
220
+
221
+ /** Optimization configuration */
222
+ config: OptConfig;
223
+
224
+ /** Current stage name (for before/after-stage hooks) */
225
+ stageName?: string;
226
+
227
+ /** Original SVG content (for comparison) */
228
+ originalContent?: string;
229
+
230
+ /** Metadata passed between hooks */
231
+ metadata: Map<string, any>;
232
+
233
+ /** Skip remaining hooks for this stage */
234
+ skipRemaining?: boolean;
235
+ }
236
+ ```
237
+
238
+ ### PluginHookResult
239
+
240
+ ```typescript
241
+ interface PluginHookResult {
242
+ /** Modified content (if changed) */
243
+ content?: string;
244
+
245
+ /** Skip remaining hooks */
246
+ skipRemaining?: boolean;
247
+
248
+ /** Additional metadata */
249
+ metadata?: Record<string, any>;
250
+
251
+ /** Validation result (if validation was performed) */
252
+ validation?: VisualDiffResult;
253
+ }
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Hook Types
259
+
260
+ ### 1. `before-parse`
261
+
262
+ **When:** Before SVG parsing
263
+ **Use Cases:**
264
+ - Remove watermarks or unwanted elements
265
+ - Pre-process malformed SVG
266
+ - Add missing namespaces
267
+
268
+ **Example:**
269
+ ```typescript
270
+ hooks: {
271
+ 'before-parse': async (context) => {
272
+ // Remove watermark element
273
+ const cleaned = context.content.replace(
274
+ /<g id="watermark">[\s\S]*?<\/g>/g,
275
+ ''
276
+ );
277
+
278
+ return { content: cleaned };
279
+ },
280
+ }
281
+ ```
282
+
283
+ ---
284
+
285
+ ### 2. `after-parse`
286
+
287
+ **When:** After SVG parsing, before optimization
288
+ **Use Cases:**
289
+ - Color palette replacement
290
+ - Attribute modification
291
+ - Element filtering
292
+
293
+ **Example:**
294
+ ```typescript
295
+ hooks: {
296
+ 'after-parse': async (context) => {
297
+ // Replace color palette
298
+ const colors = { '#ff0000': '#00ff00', '#0000ff': '#ffff00' };
299
+ let content = context.content;
300
+
301
+ Object.entries(colors).forEach(([old, new]) => {
302
+ content = content.replace(new RegExp(old, 'g'), new);
303
+ });
304
+
305
+ return { content };
306
+ },
307
+ }
308
+ ```
309
+
310
+ ---
311
+
312
+ ### 3. `before-stage`
313
+
314
+ **When:** Before each optimization stage
315
+ **Use Cases:**
316
+ - Stage-specific preprocessing
317
+ - Conditional modifications based on stage name
318
+ - Performance monitoring
319
+
320
+ **Example:**
321
+ ```typescript
322
+ hooks: {
323
+ 'before-stage': async (context) => {
324
+ console.log(`Starting stage: ${context.stageName}`);
325
+
326
+ // Only modify for specific stages
327
+ if (context.stageName === 'path-optimization') {
328
+ // Pre-process paths
329
+ }
330
+
331
+ return { content: context.content };
332
+ },
333
+ }
334
+ ```
335
+
336
+ ---
337
+
338
+ ### 4. `after-stage`
339
+
340
+ **When:** After each optimization stage
341
+ **Use Cases:**
342
+ - Validation of stage output
343
+ - Correction of over-optimization
344
+ - Metric collection
345
+
346
+ **Example:**
347
+ ```typescript
348
+ hooks: {
349
+ 'after-stage': async (context) => {
350
+ // Validate output
351
+ if (!context.content.includes('<svg')) {
352
+ throw new Error('Invalid SVG after stage');
353
+ }
354
+
355
+ return { content: context.content };
356
+ },
357
+ }
358
+ ```
359
+
360
+ ---
361
+
362
+ ### 5. `before-serialize`
363
+
364
+ **When:** Before final serialization
365
+ **Use Cases:**
366
+ - Comment removal
367
+ - Attribute sorting
368
+ - Final cleanup
369
+
370
+ **Example:**
371
+ ```typescript
372
+ hooks: {
373
+ 'before-serialize': async (context) => {
374
+ // Remove all comments
375
+ const cleaned = context.content.replace(/<!--[\s\S]*?-->/g, '');
376
+
377
+ return { content: cleaned };
378
+ },
379
+ }
380
+ ```
381
+
382
+ ---
383
+
384
+ ### 6. `after-serialize`
385
+
386
+ **When:** After final serialization
387
+ **Use Cases:**
388
+ - Post-serialization validation
389
+ - Output formatting
390
+ - Final transformations
391
+
392
+ **Example:**
393
+ ```typescript
394
+ hooks: {
395
+ 'after-serialize': async (context) => {
396
+ // Add XML declaration if missing
397
+ if (!context.content.startsWith('<?xml')) {
398
+ return {
399
+ content: '<?xml version="1.0" encoding="UTF-8"?>\n' + context.content,
400
+ };
401
+ }
402
+
403
+ return { content: context.content };
404
+ },
405
+ }
406
+ ```
407
+
408
+ ---
409
+
410
+ ## Visual Validation
411
+
412
+ ### Why Visual Validation?
413
+
414
+ Visual validation ensures your plugin doesn't accidentally break the visual output. It's highly recommended for all plugins.
415
+
416
+ ### Configuration
417
+
418
+ ```typescript
419
+ validation: {
420
+ // Enable visual diff testing
421
+ enabled: true,
422
+
423
+ // Maximum allowed difference (0-100%)
424
+ // 0% = pixel-perfect
425
+ // 5% = minor differences acceptable
426
+ // 100% = any change acceptable (for color replacement, etc.)
427
+ maxDiffPercent: 5,
428
+
429
+ // Comparison options
430
+ options: {
431
+ // Render configuration
432
+ render: {
433
+ width: 800,
434
+ height: 600,
435
+ density: 144, // 2x retina
436
+ background: 'transparent',
437
+ },
438
+
439
+ // Diff configuration
440
+ diff: {
441
+ threshold: 0.1, // Pixel color difference (0-1)
442
+ includeAA: false, // Include anti-aliasing
443
+ maxDiffPercent: 5, // Max acceptable diff
444
+ },
445
+ },
446
+ }
447
+ ```
448
+
449
+ ### Content-Aware Thresholds
450
+
451
+ ```typescript
452
+ // Geometric shapes: 0.5% (pixel-perfect)
453
+ validation: {
454
+ enabled: true,
455
+ maxDiffPercent: 0.5,
456
+ }
457
+
458
+ // Circles (anti-aliasing): 2-3%
459
+ validation: {
460
+ enabled: true,
461
+ maxDiffPercent: 3,
462
+ }
463
+
464
+ // Complex paths (lossy): 5-15%
465
+ validation: {
466
+ enabled: true,
467
+ maxDiffPercent: 15,
468
+ }
469
+
470
+ // Color changes: 100%
471
+ validation: {
472
+ enabled: true,
473
+ maxDiffPercent: 100,
474
+ }
475
+ ```
476
+
477
+ ---
478
+
479
+ ## Example Plugins
480
+
481
+ ### Example 1: Color Replacer
482
+
483
+ ```typescript
484
+ const colorReplacerPlugin: EnhancedPlugin = {
485
+ name: 'color-replacer',
486
+ version: '1.0.0',
487
+ description: 'Replace colors in SVG files',
488
+ hooks: {
489
+ 'after-parse': async (context) => {
490
+ const config = context.metadata.get('colorReplacerConfig') || {
491
+ colors: { black: 'blue', white: 'yellow' },
492
+ };
493
+
494
+ let content = context.content;
495
+ Object.entries(config.colors).forEach(([oldColor, newColor]) => {
496
+ const regex = new RegExp(`(fill|stroke)="${oldColor}"`, 'g');
497
+ content = content.replace(regex, `$1="${newColor}"`);
498
+ });
499
+
500
+ return { content };
501
+ },
502
+ },
503
+ validation: {
504
+ enabled: true,
505
+ maxDiffPercent: 100, // Color changes expected
506
+ },
507
+ };
508
+ ```
509
+
510
+ ### Example 2: Watermark Remover
511
+
512
+ ```typescript
513
+ const watermarkRemoverPlugin: EnhancedPlugin = {
514
+ name: 'watermark-remover',
515
+ version: '1.0.0',
516
+ description: 'Remove watermarks and hidden elements',
517
+ hooks: {
518
+ 'after-parse': async (context) => {
519
+ let content = context.content;
520
+
521
+ // Remove by ID
522
+ const watermarkIds = ['watermark', 'logo', 'branding'];
523
+ watermarkIds.forEach((id) => {
524
+ const regex = new RegExp(`<[^>]+id="${id}"[^>]*>[\s\S]*?</[^>]+>`, 'g');
525
+ content = content.replace(regex, '');
526
+ });
527
+
528
+ // Remove hidden elements
529
+ content = content.replace(
530
+ /<[^>]+(display="none"|visibility="hidden"|opacity="0")[^>]*>[\s\S]*?</[^>]+>/g,
531
+ ''
532
+ );
533
+
534
+ return { content };
535
+ },
536
+ },
537
+ validation: {
538
+ enabled: true,
539
+ maxDiffPercent: 5, // Minor visual changes acceptable
540
+ },
541
+ };
542
+ ```
543
+
544
+ ### Example 3: Gradient Optimizer
545
+
546
+ ```typescript
547
+ const gradientOptimizerPlugin: EnhancedPlugin = {
548
+ name: 'gradient-optimizer',
549
+ version: '1.0.0',
550
+ description: 'Optimize gradients by removing redundant stops',
551
+ hooks: {
552
+ 'after-parse': async (context) => {
553
+ // Find gradients with redundant stops
554
+ const gradientRegex = /<linearGradient[\s\S]*?<\/linearGradient>/g;
555
+ let content = context.content;
556
+
557
+ const gradients = content.match(gradientRegex) || [];
558
+ gradients.forEach((gradient) => {
559
+ // Remove duplicate stops
560
+ const stops = gradient.match(/<stop[^>]*>/g) || [];
561
+ const uniqueStops = [...new Set(stops)];
562
+
563
+ if (stops.length > uniqueStops.length) {
564
+ const optimized = gradient.replace(
565
+ /<stop[^>]*>/g,
566
+ () => uniqueStops.shift() || ''
567
+ );
568
+ content = content.replace(gradient, optimized);
569
+ }
570
+ });
571
+
572
+ return { content };
573
+ },
574
+ },
575
+ validation: {
576
+ enabled: true,
577
+ maxDiffPercent: 2, // Gradients should look identical
578
+ },
579
+ };
580
+ ```
581
+
582
+ ---
583
+
584
+ ## Best Practices
585
+
586
+ ### 1. **Always Use Visual Validation**
587
+
588
+ ```typescript
589
+ ✅ GOOD
590
+ validation: {
591
+ enabled: true,
592
+ maxDiffPercent: 5,
593
+ }
594
+
595
+ ❌ BAD
596
+ validation: {
597
+ enabled: false, // No validation!
598
+ }
599
+ ```
600
+
601
+ ### 2. **Handle Errors Gracefully**
602
+
603
+ ```typescript
604
+ ✅ GOOD
605
+ hooks: {
606
+ 'after-parse': async (context) => {
607
+ try {
608
+ // Your transformation
609
+ return { content: modifiedContent };
610
+ } catch (error) {
611
+ console.error('Plugin error:', error);
612
+ return { content: context.content }; // Return original
613
+ }
614
+ },
615
+ }
616
+
617
+ ❌ BAD
618
+ hooks: {
619
+ 'after-parse': async (context) => {
620
+ // No error handling - will crash pipeline
621
+ return { content: modifiedContent };
622
+ },
623
+ }
624
+ ```
625
+
626
+ ### 3. **Use Metadata for Configuration**
627
+
628
+ ```typescript
629
+ ✅ GOOD
630
+ hooks: {
631
+ 'after-parse': async (context) => {
632
+ const config = context.metadata.get('myPluginConfig') || defaultConfig;
633
+ // Use config
634
+ },
635
+ }
636
+
637
+ ❌ BAD
638
+ // Global variables - not thread-safe
639
+ let globalConfig = {};
640
+ ```
641
+
642
+ ### 4. **Clean Up Resources**
643
+
644
+ ```typescript
645
+ ✅ GOOD
646
+ {
647
+ init: async () => {
648
+ // Initialize resources
649
+ },
650
+ cleanup: async () => {
651
+ // Clean up resources
652
+ },
653
+ }
654
+
655
+ ❌ BAD
656
+ // No cleanup - memory leaks!
657
+ ```
658
+
659
+ ### 5. **Use Specific Hook Types**
660
+
661
+ ```typescript
662
+ ✅ GOOD
663
+ hooks: {
664
+ 'after-parse': async (context) => {
665
+ // Parse-time modifications
666
+ },
667
+ 'before-serialize': async (context) => {
668
+ // Serialization-time modifications
669
+ },
670
+ }
671
+
672
+ ❌ BAD
673
+ hooks: {
674
+ 'after-parse': async (context) => {
675
+ // Doing everything in one hook
676
+ },
677
+ }
678
+ ```
679
+
680
+ ---
681
+
682
+ ## Testing Your Plugin
683
+
684
+ ### Unit Testing
685
+
686
+ ```typescript
687
+ import { describe, it, expect } from '@jest/globals';
688
+ import { getPluginManager, resetPluginManager } from 'svger-cli';
689
+
690
+ describe('My Plugin', () => {
691
+ beforeEach(() => {
692
+ resetPluginManager();
693
+ });
694
+
695
+ it('should register successfully', () => {
696
+ const manager = getPluginManager();
697
+ manager.registerPlugin(myPlugin);
698
+
699
+ expect(manager.hasPlugin('my-plugin')).toBe(true);
700
+ });
701
+
702
+ it('should modify SVG content', async () => {
703
+ const manager = getPluginManager();
704
+ manager.registerPlugin(myPlugin);
705
+
706
+ const context = {
707
+ content: '<svg><rect fill="red"/></svg>',
708
+ config: {},
709
+ metadata: new Map(),
710
+ };
711
+
712
+ const result = await manager.executeHook('after-parse', context);
713
+ expect(result.content).toContain('fill="green"');
714
+ });
715
+ });
716
+ ```
717
+
718
+ ### Integration Testing
719
+
720
+ ```typescript
721
+ import { optimizeWithPlugins } from 'svger-cli/examples/plugin-integration-example';
722
+
723
+ describe('Plugin Integration', () => {
724
+ it('should work with optimizer pipeline', async () => {
725
+ const svg = '<svg><rect fill="red"/></svg>';
726
+ const result = await optimizeWithPlugins(svg);
727
+
728
+ expect(result.optimizedSvg).toBeDefined();
729
+ expect(result.reductionPercent).toBeGreaterThan(0);
730
+ });
731
+ });
732
+ ```
733
+
734
+ ---
735
+
736
+ ## Publishing Your Plugin
737
+
738
+ ### 1. Package Structure
739
+
740
+ ```
741
+ my-svger-plugin/
742
+ ├── package.json
743
+ ├── README.md
744
+ ├── src/
745
+ │ └── index.ts
746
+ ├── dist/
747
+ │ └── index.js
748
+ └── tests/
749
+ └── index.test.ts
750
+ ```
751
+
752
+ ### 2. package.json
753
+
754
+ ```json
755
+ {
756
+ "name": "svger-plugin-my-plugin",
757
+ "version": "1.0.0",
758
+ "description": "My awesome svger-cli plugin",
759
+ "main": "dist/index.js",
760
+ "types": "dist/index.d.ts",
761
+ "keywords": ["svger-cli", "svg", "plugin"],
762
+ "peerDependencies": {
763
+ "svger-cli": "^3.2.0"
764
+ }
765
+ }
766
+ ```
767
+
768
+ ### 3. Publish to npm
769
+
770
+ ```bash
771
+ npm run build
772
+ npm test
773
+ npm publish
774
+ ```
775
+
776
+ ### 4. Documentation
777
+
778
+ Include in README.md:
779
+ - Installation instructions
780
+ - Configuration options
781
+ - Usage examples
782
+ - Visual validation thresholds
783
+ - Performance characteristics
784
+
785
+ ---
786
+
787
+ ## Resources
788
+
789
+ - **Plugin System Types:** `src/types/plugin-system.ts`
790
+ - **Enhanced Plugin Manager:** `src/core/enhanced-plugin-manager.ts`
791
+ - **Example Plugins:**
792
+ - `src/plugins/color-replacer.ts`
793
+ - `src/plugins/watermark-remover.ts`
794
+ - **Integration Example:** `examples/plugin-integration-example.ts`
795
+ - **Visual Diff API:** `src/utils/visual-diff.ts`
796
+
797
+ ---
798
+
799
+ ## Support
800
+
801
+ - **GitHub Issues:** https://github.com/faezemohades/svger-cli/issues
802
+ - **Documentation:** https://github.com/faezemohades/svger-cli#readme
803
+ - **Examples:** `examples/` directory
804
+
805
+ ---
806
+
807
+ **Happy Plugin Development!** 🚀✨