fabric 5.3.0 → 6.0.0-beta3

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 (604) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +43 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +532 -189
  13. package/CONTRIBUTING.md +224 -59
  14. package/README.md +200 -235
  15. package/bower.json +1 -3
  16. package/dist/fabric.d.ts +42 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +27582 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.min.js +1 -0
  21. package/dist/index.mjs +27519 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/index.node.cjs +27663 -0
  24. package/dist/index.node.cjs.map +1 -0
  25. package/dist/index.node.d.ts +14 -0
  26. package/dist/index.node.mjs +27606 -0
  27. package/dist/index.node.mjs.map +1 -0
  28. package/dist/src/ClassRegistry.d.ts +13 -0
  29. package/dist/src/Collection.d.ts +136 -0
  30. package/dist/src/CommonMethods.d.ts +32 -0
  31. package/dist/src/EventTypeDefs.d.ts +227 -0
  32. package/dist/src/Intersection.d.ts +112 -0
  33. package/dist/src/Observable.d.ts +60 -0
  34. package/dist/src/Pattern.d.ts +113 -0
  35. package/dist/src/Point.d.ts +232 -0
  36. package/dist/src/Shadow.d.ts +97 -0
  37. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  38. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  39. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  40. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  41. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  42. package/dist/src/cache.d.ts +47 -0
  43. package/dist/src/canvas/Canvas.d.ts +548 -0
  44. package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
  45. package/dist/src/canvas/StaticCanvas.d.ts +778 -0
  46. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  47. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  48. package/dist/src/color/Color.d.ts +174 -0
  49. package/dist/src/color/color_map.d.ts +155 -0
  50. package/dist/src/color/constants.d.ts +22 -0
  51. package/dist/src/color/util.d.ts +12 -0
  52. package/dist/src/config.d.ts +115 -0
  53. package/dist/src/constants.d.ts +14 -0
  54. package/dist/src/controls/Control.d.ts +228 -0
  55. package/dist/src/controls/changeWidth.d.ts +13 -0
  56. package/dist/src/controls/commonControls.d.ts +28 -0
  57. package/dist/src/controls/controlRendering.d.ts +29 -0
  58. package/dist/src/controls/drag.d.ts +12 -0
  59. package/dist/src/controls/index.d.ts +13 -0
  60. package/dist/src/controls/polyControl.d.ts +5 -0
  61. package/dist/src/controls/rotate.d.ts +12 -0
  62. package/dist/src/controls/scale.d.ts +47 -0
  63. package/dist/src/controls/scaleSkew.d.ts +39 -0
  64. package/dist/src/controls/skew.d.ts +33 -0
  65. package/dist/src/controls/util.d.ts +41 -0
  66. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  67. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  68. package/dist/src/env/browser.d.ts +3 -0
  69. package/dist/src/env/index.d.ts +15 -0
  70. package/dist/src/env/node.d.ts +5 -0
  71. package/dist/src/env/types.d.ts +15 -0
  72. package/dist/src/filters/BaseFilter.d.ts +153 -0
  73. package/dist/src/filters/BlendColor.d.ts +80 -0
  74. package/dist/src/filters/BlendImage.d.ts +92 -0
  75. package/dist/src/filters/Blur.d.ts +51 -0
  76. package/dist/src/filters/Boilerplate.d.ts +48 -0
  77. package/dist/src/filters/Brightness.d.ts +47 -0
  78. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  79. package/dist/src/filters/ColorMatrix.d.ts +63 -0
  80. package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
  81. package/dist/src/filters/Composed.d.ts +45 -0
  82. package/dist/src/filters/Contrast.d.ts +45 -0
  83. package/dist/src/filters/Convolute.d.ts +82 -0
  84. package/dist/src/filters/FilterBackend.d.ts +14 -0
  85. package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
  86. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  87. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  88. package/dist/src/filters/Gamma.d.ts +54 -0
  89. package/dist/src/filters/Grayscale.d.ts +46 -0
  90. package/dist/src/filters/HueRotation.d.ts +24 -0
  91. package/dist/src/filters/Invert.d.ts +55 -0
  92. package/dist/src/filters/Noise.d.ts +54 -0
  93. package/dist/src/filters/Pixelate.d.ts +44 -0
  94. package/dist/src/filters/RemoveColor.d.ts +63 -0
  95. package/dist/src/filters/Resize.d.ts +136 -0
  96. package/dist/src/filters/Saturation.d.ts +48 -0
  97. package/dist/src/filters/Vibrance.d.ts +48 -0
  98. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  99. package/dist/src/filters/filters.d.ts +21 -0
  100. package/dist/src/filters/index.d.ts +5 -0
  101. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  102. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  103. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  104. package/dist/src/filters/shaders/blur.d.ts +2 -0
  105. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  106. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  107. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  108. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  109. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  110. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  111. package/dist/src/filters/shaders/invert.d.ts +2 -0
  112. package/dist/src/filters/shaders/noise.d.ts +2 -0
  113. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  114. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  115. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  116. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  117. package/dist/src/filters/typedefs.d.ts +49 -0
  118. package/dist/src/gradient/Gradient.d.ts +149 -0
  119. package/dist/src/gradient/constants.d.ts +15 -0
  120. package/dist/src/gradient/parser/index.d.ts +4 -0
  121. package/dist/src/gradient/parser/misc.d.ts +4 -0
  122. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  123. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  124. package/dist/src/gradient/typedefs.d.ts +93 -0
  125. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  126. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  127. package/dist/src/parkinglot/straighten.d.ts +2 -0
  128. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  129. package/dist/src/parser/attributes.d.ts +6 -0
  130. package/dist/src/parser/constants.d.ts +53 -0
  131. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  132. package/dist/src/parser/elementById.d.ts +6 -0
  133. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  134. package/dist/src/parser/elements_parser.d.ts +3 -0
  135. package/dist/src/parser/getCSSRules.d.ts +7 -0
  136. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  137. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  138. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  139. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  140. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  141. package/dist/src/parser/index.d.ts +10 -0
  142. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  143. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  144. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  145. package/dist/src/parser/normalizeValue.d.ts +2 -0
  146. package/dist/src/parser/parseAttributes.d.ts +9 -0
  147. package/dist/src/parser/parseElements.d.ts +11 -0
  148. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  149. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  150. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  151. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  152. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  153. package/dist/src/parser/parseStyleString.d.ts +2 -0
  154. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  155. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  156. package/dist/src/parser/percent.d.ts +9 -0
  157. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  158. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  159. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  160. package/dist/src/parser/selectorMatches.d.ts +2 -0
  161. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  162. package/dist/src/parser/skewMatrix.d.ts +2 -0
  163. package/dist/src/parser/translateMatrix.d.ts +2 -0
  164. package/dist/src/shapes/ActiveSelection.d.ts +82 -0
  165. package/dist/src/shapes/Circle.d.ts +99 -0
  166. package/dist/src/shapes/Ellipse.d.ts +84 -0
  167. package/dist/src/shapes/Group.d.ts +408 -0
  168. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  169. package/dist/src/shapes/IText/IText.d.ts +335 -0
  170. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  171. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
  172. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  173. package/dist/src/shapes/IText/constants.d.ts +13 -0
  174. package/dist/src/shapes/Image.d.ts +311 -0
  175. package/dist/src/shapes/Line.d.ts +126 -0
  176. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  177. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  178. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  179. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  180. package/dist/src/shapes/Object/Object.d.ts +594 -0
  181. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  182. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  183. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  184. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  185. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  186. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  187. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  188. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  189. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  190. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  191. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  192. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  193. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  194. package/dist/src/shapes/Path.d.ts +130 -0
  195. package/dist/src/shapes/Polygon.d.ts +9 -0
  196. package/dist/src/shapes/Polyline.d.ts +140 -0
  197. package/dist/src/shapes/Rect.d.ts +76 -0
  198. package/dist/src/shapes/Text/StyledText.d.ts +119 -0
  199. package/dist/src/shapes/Text/Text.d.ts +673 -0
  200. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  201. package/dist/src/shapes/Text/constants.d.ts +7 -0
  202. package/dist/src/shapes/Textbox.d.ts +185 -0
  203. package/dist/src/shapes/Triangle.d.ts +25 -0
  204. package/dist/src/typedefs.d.ts +90 -0
  205. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  206. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  207. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  208. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  209. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  210. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  211. package/dist/src/util/animation/animate.d.ts +37 -0
  212. package/dist/src/util/animation/easing.d.ts +130 -0
  213. package/dist/src/util/animation/types.d.ts +87 -0
  214. package/dist/src/util/applyMixins.d.ts +8 -0
  215. package/dist/src/util/dom_event.d.ts +5 -0
  216. package/dist/src/util/dom_misc.d.ts +39 -0
  217. package/dist/src/util/dom_request.d.ts +14 -0
  218. package/dist/src/util/dom_style.d.ts +7 -0
  219. package/dist/src/util/fireEvent.d.ts +3 -0
  220. package/dist/src/util/index.d.ts +35 -0
  221. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  222. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  223. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  224. package/dist/src/util/internals/index.d.ts +4 -0
  225. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  226. package/dist/src/util/internals/uid.d.ts +2 -0
  227. package/dist/src/util/lang_string.d.ts +22 -0
  228. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  229. package/dist/src/util/misc/capValue.d.ts +2 -0
  230. package/dist/src/util/misc/cos.d.ts +10 -0
  231. package/dist/src/util/misc/dom.d.ts +28 -0
  232. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  233. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  234. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  235. package/dist/src/util/misc/matrix.d.ts +92 -0
  236. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  237. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  238. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  239. package/dist/src/util/misc/pick.d.ts +9 -0
  240. package/dist/src/util/misc/planeChange.d.ts +84 -0
  241. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  242. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  243. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  244. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  245. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  246. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  247. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  248. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  249. package/dist/src/util/misc/sin.d.ts +10 -0
  250. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  251. package/dist/src/util/misc/textStyles.d.ts +32 -0
  252. package/dist/src/util/misc/toFixed.d.ts +8 -0
  253. package/dist/src/util/misc/vectors.d.ts +57 -0
  254. package/dist/src/util/path/index.d.ts +96 -0
  255. package/dist/src/util/path/regex.d.ts +3 -0
  256. package/dist/src/util/path/typechecks.d.ts +24 -0
  257. package/dist/src/util/path/typedefs.d.ts +220 -0
  258. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  259. package/dist/src/util/types.d.ts +19 -0
  260. package/fabric.ts +51 -0
  261. package/index.node.ts +37 -0
  262. package/index.ts +1 -0
  263. package/package.json +100 -40
  264. package/publish.js +0 -26
  265. package/rollup.config.mjs +91 -0
  266. package/rollup.test.config.js +24 -0
  267. package/scripts/build.mjs +50 -0
  268. package/scripts/buildLock.mjs +115 -0
  269. package/scripts/buildReporter.mjs +15 -0
  270. package/scripts/buildStats.mjs +139 -0
  271. package/scripts/dirname.mjs +14 -0
  272. package/scripts/git.mjs +36 -0
  273. package/scripts/index.mjs +564 -0
  274. package/scripts/sandbox.mjs +149 -0
  275. package/src/ClassRegistry.ts +56 -0
  276. package/src/Collection.ts +346 -0
  277. package/src/CommonMethods.ts +63 -0
  278. package/src/EventTypeDefs.ts +296 -0
  279. package/src/Intersection.ts +302 -0
  280. package/src/Observable.ts +181 -0
  281. package/src/Pattern.ts +227 -0
  282. package/src/Point.ts +388 -0
  283. package/src/Shadow.ts +214 -0
  284. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  285. package/src/brushes/CircleBrush.ts +145 -0
  286. package/src/brushes/PatternBrush.ts +70 -0
  287. package/src/brushes/PencilBrush.ts +300 -0
  288. package/src/brushes/SprayBrush.ts +219 -0
  289. package/src/cache.ts +90 -0
  290. package/src/canvas/Canvas.ts +1607 -0
  291. package/src/canvas/SelectableCanvas.ts +1608 -0
  292. package/src/canvas/StaticCanvas.ts +1734 -0
  293. package/src/canvas/TextEditingManager.ts +48 -0
  294. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  295. package/src/color/Color.ts +404 -0
  296. package/src/color/color_map.ts +154 -0
  297. package/src/color/constants.ts +26 -0
  298. package/src/color/util.ts +32 -0
  299. package/src/config.ts +159 -0
  300. package/src/constants.ts +20 -0
  301. package/src/controls/Control.ts +380 -0
  302. package/src/controls/changeWidth.ts +52 -0
  303. package/src/controls/commonControls.ts +105 -0
  304. package/src/controls/controlRendering.ts +138 -0
  305. package/src/controls/drag.ts +31 -0
  306. package/src/controls/index.ts +22 -0
  307. package/src/controls/polyControl.ts +135 -0
  308. package/src/controls/rotate.ts +87 -0
  309. package/src/controls/scale.ts +277 -0
  310. package/src/controls/scaleSkew.ts +92 -0
  311. package/src/controls/skew.ts +242 -0
  312. package/src/controls/util.ts +154 -0
  313. package/src/controls/wrapWithFireEvent.ts +25 -0
  314. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  315. package/src/env/browser.ts +32 -0
  316. package/src/env/index.ts +24 -0
  317. package/src/env/node.ts +56 -0
  318. package/src/env/types.ts +15 -0
  319. package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
  320. package/src/filters/BlendColor.ts +217 -0
  321. package/src/filters/BlendImage.ts +228 -0
  322. package/src/filters/Blur.ts +179 -0
  323. package/src/filters/Boilerplate.ts +94 -0
  324. package/src/filters/Brightness.ts +83 -0
  325. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  326. package/src/filters/ColorMatrix.ts +145 -0
  327. package/src/filters/ColorMatrixFilters.ts +77 -0
  328. package/src/filters/Composed.ts +76 -0
  329. package/src/filters/Contrast.ts +82 -0
  330. package/src/filters/Convolute.ts +184 -0
  331. package/src/filters/FilterBackend.ts +34 -0
  332. package/src/filters/GLProbes/GLProbe.ts +11 -0
  333. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  334. package/src/filters/GLProbes/WebGLProbe.ts +46 -0
  335. package/src/filters/Gamma.ts +110 -0
  336. package/src/filters/Grayscale.ts +102 -0
  337. package/src/filters/HueRotation.ts +62 -0
  338. package/src/filters/Invert.ts +99 -0
  339. package/src/filters/Noise.ts +94 -0
  340. package/src/filters/Pixelate.ts +96 -0
  341. package/src/filters/RemoveColor.ts +135 -0
  342. package/src/filters/Resize.ts +538 -0
  343. package/src/filters/Saturation.ts +87 -0
  344. package/src/filters/Vibrance.ts +88 -0
  345. package/src/filters/WebGLFilterBackend.ts +430 -0
  346. package/src/filters/filters.ts +28 -0
  347. package/src/filters/index.ts +5 -0
  348. package/src/filters/shaders/baseFilter.ts +19 -0
  349. package/src/filters/shaders/blendColor.ts +33 -0
  350. package/src/filters/shaders/blendImage.ts +32 -0
  351. package/src/filters/shaders/blur.ts +24 -0
  352. package/src/filters/shaders/brightness.ts +11 -0
  353. package/src/filters/shaders/colorMatrix.ts +12 -0
  354. package/src/filters/shaders/constrast.ts +11 -0
  355. package/src/filters/shaders/convolute.ts +154 -0
  356. package/src/filters/shaders/gamma.ts +15 -0
  357. package/src/filters/shaders/grayscale.ts +36 -0
  358. package/src/filters/shaders/invert.ts +19 -0
  359. package/src/filters/shaders/noise.ts +16 -0
  360. package/src/filters/shaders/pixelate.ts +19 -0
  361. package/src/filters/shaders/removeColor.ts +13 -0
  362. package/src/filters/shaders/saturation.ts +15 -0
  363. package/src/filters/shaders/vibrance.ts +16 -0
  364. package/src/filters/typedefs.ts +65 -0
  365. package/src/gradient/Gradient.ts +406 -0
  366. package/src/gradient/constants.ts +12 -0
  367. package/src/gradient/parser/index.ts +3 -0
  368. package/src/gradient/parser/misc.ts +13 -0
  369. package/src/gradient/parser/parseColorStops.ts +56 -0
  370. package/src/gradient/parser/parseCoords.ts +73 -0
  371. package/src/gradient/typedefs.ts +104 -0
  372. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  373. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  374. package/src/parkinglot/straighten.ts +58 -0
  375. package/src/parser/applyViewboxTransform.ts +157 -0
  376. package/src/parser/attributes.ts +25 -0
  377. package/src/parser/constants.ts +115 -0
  378. package/src/parser/doesSomeParentMatch.ts +19 -0
  379. package/src/parser/elementById.ts +21 -0
  380. package/src/parser/elementMatchesRule.ts +16 -0
  381. package/src/parser/elements_parser.ts +191 -0
  382. package/src/parser/getCSSRules.ts +62 -0
  383. package/src/parser/getGlobalStylesForElement.ts +19 -0
  384. package/src/parser/getGradientDefs.ts +31 -0
  385. package/src/parser/getMultipleNodes.ts +15 -0
  386. package/src/parser/getSvgRegex.ts +5 -0
  387. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  388. package/src/parser/index.ts +9 -0
  389. package/src/parser/loadSVGFromString.ts +26 -0
  390. package/src/parser/loadSVGFromURL.ts +40 -0
  391. package/src/parser/normalizeAttr.ts +10 -0
  392. package/src/parser/normalizeValue.ts +63 -0
  393. package/src/parser/parseAttributes.ts +90 -0
  394. package/src/parser/parseElements.ts +28 -0
  395. package/src/parser/parseFontDeclaration.ts +44 -0
  396. package/src/parser/parsePointsAttribute.ts +34 -0
  397. package/src/parser/parseSVGDocument.ts +93 -0
  398. package/src/parser/parseStyleAttribute.ts +27 -0
  399. package/src/parser/parseStyleObject.ts +15 -0
  400. package/src/parser/parseStyleString.ts +16 -0
  401. package/src/parser/parseTransformAttribute.ts +155 -0
  402. package/src/parser/parseUseDirectives.ts +78 -0
  403. package/src/parser/percent.ts +27 -0
  404. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  405. package/src/parser/rotateMatrix.ts +21 -0
  406. package/src/parser/scaleMatrix.ts +9 -0
  407. package/src/parser/selectorMatches.ts +25 -0
  408. package/src/parser/setStrokeFillOpacity.ts +40 -0
  409. package/src/parser/skewMatrix.ts +6 -0
  410. package/src/parser/translateMatrix.ts +8 -0
  411. package/src/shapes/ActiveSelection.ts +189 -0
  412. package/src/shapes/Circle.ts +242 -0
  413. package/src/shapes/Ellipse.ts +179 -0
  414. package/src/shapes/Group.ts +1100 -0
  415. package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
  416. package/src/shapes/IText/IText.ts +693 -0
  417. package/src/shapes/IText/ITextBehavior.ts +1064 -0
  418. package/src/shapes/IText/ITextClickBehavior.ts +325 -0
  419. package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
  420. package/src/shapes/IText/constants.ts +47 -0
  421. package/src/shapes/Image.ts +841 -0
  422. package/src/shapes/Line.ts +346 -0
  423. package/src/shapes/Object/AnimatableObject.ts +106 -0
  424. package/src/shapes/Object/FabricObject.ts +29 -0
  425. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  426. package/src/shapes/Object/InteractiveObject.ts +672 -0
  427. package/src/shapes/Object/Object.ts +1561 -0
  428. package/src/shapes/Object/ObjectGeometry.ts +813 -0
  429. package/src/shapes/Object/ObjectOrigin.ts +276 -0
  430. package/src/shapes/Object/StackedObject.ts +206 -0
  431. package/src/shapes/Object/defaultValues.ts +108 -0
  432. package/src/shapes/Object/types/BaseProps.ts +96 -0
  433. package/src/shapes/Object/types/BorderProps.ts +40 -0
  434. package/src/shapes/Object/types/ControlProps.ts +69 -0
  435. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  436. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  437. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  438. package/src/shapes/Object/types/ObjectProps.ts +46 -0
  439. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  440. package/src/shapes/Object/types/index.ts +8 -0
  441. package/src/shapes/Path.ts +416 -0
  442. package/src/shapes/Polygon.ts +20 -0
  443. package/src/shapes/Polyline.ts +359 -0
  444. package/src/shapes/Rect.ts +233 -0
  445. package/src/shapes/Text/StyledText.ts +329 -0
  446. package/src/shapes/Text/Text.ts +1884 -0
  447. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  448. package/src/shapes/Text/constants.ts +91 -0
  449. package/src/shapes/Textbox.ts +477 -0
  450. package/src/shapes/Triangle.ts +60 -0
  451. package/src/typedefs.ts +115 -0
  452. package/src/util/animation/AnimationBase.ts +166 -0
  453. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  454. package/src/util/animation/AnimationRegistry.ts +58 -0
  455. package/src/util/animation/ArrayAnimation.ts +27 -0
  456. package/src/util/animation/ColorAnimation.ts +74 -0
  457. package/src/util/animation/ValueAnimation.ts +29 -0
  458. package/src/util/animation/animate.ts +74 -0
  459. package/src/util/animation/easing.ts +327 -0
  460. package/src/util/animation/types.ts +136 -0
  461. package/src/util/applyMixins.ts +22 -0
  462. package/src/util/dom_event.ts +28 -0
  463. package/src/util/dom_misc.ts +121 -0
  464. package/src/util/dom_request.ts +64 -0
  465. package/src/util/dom_style.ts +20 -0
  466. package/src/util/fireEvent.ts +15 -0
  467. package/src/util/index.ts +102 -0
  468. package/src/util/internals/cloneDeep.ts +2 -0
  469. package/src/util/internals/getRandomInt.ts +8 -0
  470. package/src/util/internals/ifNaN.ts +9 -0
  471. package/src/util/internals/index.ts +3 -0
  472. package/src/util/internals/removeFromArray.ts +14 -0
  473. package/src/util/internals/uid.ts +3 -0
  474. package/src/util/lang_string.ts +79 -0
  475. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  476. package/src/util/misc/capValue.ts +2 -0
  477. package/src/util/misc/cos.ts +24 -0
  478. package/src/util/misc/dom.ts +50 -0
  479. package/src/util/misc/findScaleTo.ts +44 -0
  480. package/src/util/misc/groupSVGElements.ts +15 -0
  481. package/src/util/misc/isTransparent.ts +28 -0
  482. package/src/util/misc/matrix.ts +207 -0
  483. package/src/util/misc/mergeClipPaths.ts +40 -0
  484. package/src/util/misc/objectEnlive.ts +189 -0
  485. package/src/util/misc/objectTransforms.ts +129 -0
  486. package/src/util/misc/pick.ts +29 -0
  487. package/src/util/misc/planeChange.ts +136 -0
  488. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  489. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +226 -0
  490. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  491. package/src/util/misc/projectStroke/index.ts +53 -0
  492. package/src/util/misc/projectStroke/types.ts +24 -0
  493. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  494. package/src/util/misc/resolveOrigin.ts +22 -0
  495. package/src/util/misc/rotatePoint.ts +15 -0
  496. package/src/util/misc/sin.ts +26 -0
  497. package/src/util/misc/svgParsing.ts +181 -0
  498. package/src/util/misc/textStyles.ts +134 -0
  499. package/src/util/misc/toFixed.ts +8 -0
  500. package/src/util/misc/vectors.ts +82 -0
  501. package/src/util/path/index.ts +1038 -0
  502. package/src/util/path/regex.ts +41 -0
  503. package/src/util/path/typechecks.ts +145 -0
  504. package/src/util/path/typedefs.ts +305 -0
  505. package/src/util/transform_matrix_removal.ts +60 -0
  506. package/src/util/types.ts +78 -0
  507. package/tsconfig.json +106 -0
  508. package/HEADER.js +0 -203
  509. package/build.js +0 -287
  510. package/dist/fabric.js +0 -31187
  511. package/dist/fabric.min.js +0 -1
  512. package/old-travis-reference.yml +0 -97
  513. package/src/brushes/circle_brush.class.js +0 -144
  514. package/src/brushes/pattern_brush.class.js +0 -61
  515. package/src/brushes/pencil_brush.class.js +0 -310
  516. package/src/brushes/spray_brush.class.js +0 -219
  517. package/src/canvas.class.js +0 -1312
  518. package/src/color.class.js +0 -636
  519. package/src/control.class.js +0 -339
  520. package/src/controls.actions.js +0 -740
  521. package/src/controls.render.js +0 -99
  522. package/src/elements_parser.js +0 -152
  523. package/src/filters/2d_backend.class.js +0 -65
  524. package/src/filters/blendcolor_filter.class.js +0 -251
  525. package/src/filters/blendimage_filter.class.js +0 -247
  526. package/src/filters/blur_filter.class.js +0 -217
  527. package/src/filters/brightness_filter.class.js +0 -113
  528. package/src/filters/colormatrix_filter.class.js +0 -159
  529. package/src/filters/composed_filter.class.js +0 -72
  530. package/src/filters/contrast_filter.class.js +0 -113
  531. package/src/filters/convolute_filter.class.js +0 -352
  532. package/src/filters/filter_boilerplate.js +0 -111
  533. package/src/filters/filter_generator.js +0 -85
  534. package/src/filters/gamma_filter.class.js +0 -136
  535. package/src/filters/grayscale_filter.class.js +0 -154
  536. package/src/filters/hue_rotation.class.js +0 -107
  537. package/src/filters/invert_filter.class.js +0 -111
  538. package/src/filters/noise_filter.class.js +0 -134
  539. package/src/filters/pixelate_filter.class.js +0 -137
  540. package/src/filters/removecolor_filter.class.js +0 -173
  541. package/src/filters/resize_filter.class.js +0 -490
  542. package/src/filters/saturate_filter.class.js +0 -119
  543. package/src/filters/vibrance_filter.class.js +0 -122
  544. package/src/filters/webgl_backend.class.js +0 -396
  545. package/src/globalFabric.js +0 -4
  546. package/src/gradient.class.js +0 -490
  547. package/src/intersection.class.js +0 -172
  548. package/src/log.js +0 -11
  549. package/src/mixins/animation.mixin.js +0 -231
  550. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  551. package/src/mixins/canvas_events.mixin.js +0 -974
  552. package/src/mixins/canvas_gestures.mixin.js +0 -149
  553. package/src/mixins/canvas_grouping.mixin.js +0 -177
  554. package/src/mixins/canvas_serialization.mixin.js +0 -228
  555. package/src/mixins/collection.mixin.js +0 -170
  556. package/src/mixins/default_controls.js +0 -114
  557. package/src/mixins/itext.svg_export.js +0 -241
  558. package/src/mixins/itext_behavior.mixin.js +0 -940
  559. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  560. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  561. package/src/mixins/object.svg_export.js +0 -258
  562. package/src/mixins/object_geometry.mixin.js +0 -683
  563. package/src/mixins/object_interactivity.mixin.js +0 -314
  564. package/src/mixins/object_origin.mixin.js +0 -255
  565. package/src/mixins/object_stacking.mixin.js +0 -80
  566. package/src/mixins/object_straightening.mixin.js +0 -80
  567. package/src/mixins/observable.mixin.js +0 -141
  568. package/src/mixins/shared_methods.mixin.js +0 -94
  569. package/src/mixins/stateful.mixin.js +0 -107
  570. package/src/mixins/text_style.mixin.js +0 -324
  571. package/src/parser.js +0 -1090
  572. package/src/pattern.class.js +0 -189
  573. package/src/point.class.js +0 -337
  574. package/src/shadow.class.js +0 -195
  575. package/src/shapes/active_selection.class.js +0 -155
  576. package/src/shapes/circle.class.js +0 -210
  577. package/src/shapes/ellipse.class.js +0 -181
  578. package/src/shapes/group.class.js +0 -593
  579. package/src/shapes/image.class.js +0 -764
  580. package/src/shapes/itext.class.js +0 -526
  581. package/src/shapes/line.class.js +0 -324
  582. package/src/shapes/object.class.js +0 -2008
  583. package/src/shapes/path.class.js +0 -384
  584. package/src/shapes/polygon.class.js +0 -81
  585. package/src/shapes/polyline.class.js +0 -268
  586. package/src/shapes/rect.class.js +0 -187
  587. package/src/shapes/text.class.js +0 -1696
  588. package/src/shapes/textbox.class.js +0 -461
  589. package/src/shapes/triangle.class.js +0 -93
  590. package/src/static_canvas.class.js +0 -1881
  591. package/src/util/anim_ease.js +0 -398
  592. package/src/util/animate.js +0 -254
  593. package/src/util/animate_color.js +0 -74
  594. package/src/util/dom_event.js +0 -50
  595. package/src/util/dom_misc.js +0 -300
  596. package/src/util/dom_request.js +0 -54
  597. package/src/util/dom_style.js +0 -70
  598. package/src/util/lang_array.js +0 -94
  599. package/src/util/lang_class.js +0 -115
  600. package/src/util/lang_object.js +0 -75
  601. package/src/util/lang_string.js +0 -110
  602. package/src/util/misc.js +0 -1330
  603. package/src/util/named_accessors.mixin.js +0 -428
  604. package/src/util/path.js +0 -829
@@ -0,0 +1,564 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Dearest fabric maintainer 💗,
5
+ * This file contains the cli logic, which governs most of the available commands fabric has to offer.
6
+ *
7
+ * 📢 **IMPORTANT**
8
+ * CI uses these commands.
9
+ * In order for CI to correctly report the result of the command, the process must receive a correct exit code
10
+ * meaning that if you `spawn` a process, make sure to listen to the `exit` event and terminate the main process with the relevant code.
11
+ * Failing to do so will make CI report a false positive 📉.
12
+ */
13
+
14
+ import chalk from 'chalk';
15
+ import cp from 'child_process';
16
+ import * as commander from 'commander';
17
+ import fs from 'fs-extra';
18
+ import fuzzy from 'fuzzy';
19
+ import inquirer from 'inquirer';
20
+ import Checkbox from 'inquirer-checkbox-plus-prompt';
21
+ import killPort from 'kill-port';
22
+ import _ from 'lodash';
23
+ import moment from 'moment';
24
+ import path from 'node:path';
25
+ import process from 'node:process';
26
+ import os from 'os';
27
+ import { build } from './build.mjs';
28
+ import { awaitBuild } from './buildLock.mjs';
29
+ import { CLI_CACHE, wd } from './dirname.mjs';
30
+
31
+ const program = new commander.Command()
32
+ .showHelpAfterError()
33
+ .allowUnknownOption(false)
34
+ .allowExcessArguments(false);
35
+
36
+ const websiteDir = path.resolve(wd, '../fabricjs.com');
37
+
38
+ class ICheckbox extends Checkbox {
39
+ constructor(questions, rl, answers) {
40
+ super(questions, rl, answers);
41
+ this.opt.source = this.opt.source.bind(this);
42
+ }
43
+ getCurrentValue() {
44
+ const current = super.getCurrentValue();
45
+ return current.concat(this.firstSourceLoading ? this.default : []);
46
+ }
47
+ onSpaceKey() {
48
+ const choice = this.choices.getChoice(this.pointer);
49
+ if (!choice) {
50
+ return;
51
+ }
52
+
53
+ this.toggleChoice(choice);
54
+ if (choice.value && !choice.value.file) {
55
+ delete this.lastQuery;
56
+ // Remove the choices from the checked values with the same type
57
+ _.remove(this.value, (v) => v.type === choice.value.type && v.file);
58
+ _.remove(this.checkedChoices, (checkedChoice) => {
59
+ if (!checkedChoice.value.file) {
60
+ return false;
61
+ }
62
+ checkedChoice.checked = false;
63
+ return checkedChoice.value.type === choice.value.type;
64
+ });
65
+
66
+ this.executeSource();
67
+ }
68
+
69
+ this.render();
70
+ }
71
+ }
72
+ inquirer.registerPrompt('test-selection', ICheckbox);
73
+
74
+ function startWebsite() {
75
+ if (
76
+ JSON.parse(fs.readFileSync(path.resolve(websiteDir, 'package.json')))
77
+ .name !== 'fabricjs.com'
78
+ ) {
79
+ console.log(chalk.red('Could not locate fabricjs.com directory'));
80
+ }
81
+ const args = ['run', 'start:dev'];
82
+
83
+ // WSL ubuntu
84
+ // https://github.com/microsoft/WSL/issues/216
85
+ // os.platform() === 'win32' && args.push('--', '--force_polling', '--livereload');
86
+ if (os.platform() === 'win32') {
87
+ console.log(
88
+ chalk.green(
89
+ 'Consider using ubuntu on WSL to run jekyll with the following options:'
90
+ )
91
+ );
92
+ console.log(chalk.yellow('-- force_polling --livereload'));
93
+ console.log(chalk.gray('https://github.com/microsoft/WSL/issues/216'));
94
+ }
95
+
96
+ cp.spawn('npm', args, {
97
+ stdio: 'inherit',
98
+ cwd: websiteDir,
99
+ shell: true,
100
+ });
101
+ }
102
+
103
+ function watch(path, callback, debounce = 500) {
104
+ fs.watch(
105
+ path,
106
+ { recursive: true },
107
+ _.debounce(
108
+ (type, location) => {
109
+ try {
110
+ callback(type, location);
111
+ } catch (error) {
112
+ console.error(error);
113
+ }
114
+ },
115
+ debounce,
116
+ { trailing: true }
117
+ )
118
+ );
119
+ }
120
+
121
+ function copy(from, to) {
122
+ try {
123
+ fs.copySync(from, to);
124
+ const containingFolder = path.resolve(wd, '..');
125
+ console.log(
126
+ `copied ${path.relative(containingFolder, from)} to ${path.relative(
127
+ containingFolder,
128
+ to
129
+ )}`
130
+ );
131
+ } catch (error) {
132
+ console.error(error);
133
+ }
134
+ }
135
+
136
+ const BUILD_SOURCE = ['src', 'lib'];
137
+
138
+ function exportBuildToWebsite(options = {}) {
139
+ _.defaultsDeep(options, { gestures: true });
140
+ build({
141
+ output: path.resolve(websiteDir, './lib/fabric.js'),
142
+ fast: true,
143
+ watch: options.watch,
144
+ });
145
+ if (options.gestures) {
146
+ build({
147
+ exclude: ['accessors'],
148
+ output: path.resolve(websiteDir, './lib/fabric_with_gestures.js'),
149
+ fast: true,
150
+ watch: options.watch,
151
+ });
152
+ }
153
+ }
154
+
155
+ function exportAssetsToWebsite(options) {
156
+ copy(
157
+ path.resolve(wd, './package.json'),
158
+ path.resolve(websiteDir, './lib/package.json')
159
+ );
160
+ BUILD_SOURCE.forEach((p) =>
161
+ copy(path.resolve(wd, p), path.resolve(websiteDir, './build/files', p))
162
+ );
163
+ console.log(
164
+ chalk.bold(`[${moment().format('HH:mm')}] exported assets to fabricjs.com`)
165
+ );
166
+ options.watch &&
167
+ BUILD_SOURCE.forEach((p) => {
168
+ watch(path.resolve(wd, p), () => {
169
+ copy(path.resolve(wd, p), path.resolve(websiteDir, './build/files', p));
170
+ console.log(
171
+ chalk.bold(
172
+ `[${moment().format('HH:mm')}] exported ${p} to fabricjs.com`
173
+ )
174
+ );
175
+ });
176
+ });
177
+ }
178
+
179
+ function exportTestsToWebsite(options) {
180
+ const exportTests = () => {
181
+ const paths = [
182
+ './test/unit',
183
+ './test/visual',
184
+ './test/fixtures',
185
+ './test/lib',
186
+ ];
187
+ paths.forEach((location) =>
188
+ copy(path.resolve(wd, location), path.resolve(websiteDir, location))
189
+ );
190
+ console.log(
191
+ chalk.bold(`[${moment().format('HH:mm')}] exported tests to fabricjs.com`)
192
+ );
193
+ };
194
+ exportTests();
195
+ options.watch && watch(path.resolve(wd, './test'), exportTests);
196
+ }
197
+
198
+ function exportToWebsite(options) {
199
+ if (!options.include || options.include.length === 0) {
200
+ options.include = ['build', 'tests'];
201
+ }
202
+ options.include.forEach((x) => {
203
+ if (x === 'build') {
204
+ exportBuildToWebsite(options);
205
+ exportAssetsToWebsite(options);
206
+ } else if (x === 'tests') {
207
+ exportTestsToWebsite(options);
208
+ }
209
+ });
210
+ }
211
+
212
+ /**
213
+ *
214
+ * @returns {Promise<boolean | undefined>} true if some tests failed
215
+ */
216
+ async function runTestem({
217
+ suite,
218
+ port,
219
+ launch,
220
+ dev,
221
+ processOptions,
222
+ context,
223
+ } = {}) {
224
+ port = port || suite === 'visual' ? 8081 : 8080;
225
+ try {
226
+ await killPort(port);
227
+ } catch (error) {}
228
+
229
+ if (launch) {
230
+ // open localhost
231
+ // consider using open instead https://github.com/sindresorhus/open
232
+ const url = `http://localhost:${port}/`;
233
+ const start =
234
+ os.platform() === 'darwin'
235
+ ? 'open'
236
+ : os.platform() === 'win32'
237
+ ? 'start'
238
+ : 'xdg-open';
239
+ cp.exec([start, url].join(' '));
240
+ }
241
+
242
+ const processCmdOptions = [
243
+ '-p',
244
+ port,
245
+ '-f',
246
+ `test/testem.${suite}.js`,
247
+ '-l',
248
+ context.map(_.upperFirst).join(','),
249
+ ];
250
+
251
+ if (dev) {
252
+ cp.spawn(['testem', ...processCmdOptions].join(' '), {
253
+ ...processOptions,
254
+ detached: true,
255
+ });
256
+ } else {
257
+ try {
258
+ cp.execSync(
259
+ ['testem', 'ci', ...processCmdOptions].join(' '),
260
+ processOptions
261
+ );
262
+ } catch (error) {
263
+ return true;
264
+ }
265
+ }
266
+ }
267
+
268
+ /**
269
+ *
270
+ * @param {'unit' | 'visual'} suite
271
+ * @param {string[] | null} tests file paths
272
+ * @param {{debug?:boolean,recreate?:boolean,verbose?:boolean,filter?:string}} [options]
273
+ * @returns {Promise<boolean | undefined>} true if some tests failed
274
+ */
275
+ async function test(suite, tests, options = {}) {
276
+ let failed = false;
277
+ await awaitBuild();
278
+ const qunitEnv = {
279
+ QUNIT_DEBUG_VISUAL_TESTS: Number(options.debug),
280
+ QUNIT_RECREATE_VISUAL_REFS: Number(options.recreate),
281
+ QUNIT_FILTER: options.filter,
282
+ };
283
+ const env = {
284
+ ...process.env,
285
+ TEST_FILES: (tests || []).join(','),
286
+ NODE_CMD: ['qunit', 'test/node_test_setup.js', 'test/lib']
287
+ .concat(tests || `test/${suite}`)
288
+ .join(' '),
289
+ VERBOSE: Number(options.verbose),
290
+ REPORT_FILE: options.out,
291
+ };
292
+ const browserContexts = options.context.filter((c) => c !== 'node');
293
+
294
+ // temporary revert
295
+ // run node tests directly with qunit
296
+ if (options.context.includes('node')) {
297
+ try {
298
+ cp.execSync(env.NODE_CMD, {
299
+ cwd: wd,
300
+ env: {
301
+ ...env,
302
+ // browser takes precendence in golden ref generation
303
+ ...(browserContexts.length === 0 ? qunitEnv : {}),
304
+ },
305
+ shell: true,
306
+ stdio: 'inherit',
307
+ });
308
+ } catch (error) {
309
+ failed = true;
310
+ }
311
+ }
312
+
313
+ if (browserContexts.length > 0) {
314
+ failed =
315
+ (await runTestem({
316
+ ...options,
317
+ suite,
318
+ processOptions: {
319
+ cwd: wd,
320
+ env: {
321
+ ...env,
322
+ ...qunitEnv,
323
+ },
324
+ shell: true,
325
+ stdio: 'inherit',
326
+ },
327
+ context: browserContexts,
328
+ })) || failed;
329
+ }
330
+
331
+ return failed;
332
+ }
333
+
334
+ /**
335
+ *
336
+ * @param {'unit'|'visual'} type corresponds to the test directories
337
+ * @returns
338
+ */
339
+ function listTestFiles(type) {
340
+ return fs.readdirSync(path.resolve(wd, './test', type)).filter((p) => {
341
+ const ext = path.parse(p).ext.slice(1);
342
+ return ext === 'js' || ext === 'ts';
343
+ });
344
+ }
345
+
346
+ function writeCLIFile(tests) {
347
+ fs.writeFileSync(CLI_CACHE, JSON.stringify(tests, null, '\t'));
348
+ }
349
+
350
+ function readCLIFile() {
351
+ return fs.existsSync(CLI_CACHE) ? JSON.parse(fs.readFileSync(CLI_CACHE)) : [];
352
+ }
353
+
354
+ function createChoiceData(type, file) {
355
+ return {
356
+ name: `${type}/${file}`,
357
+ short: `${type}/${file}`,
358
+ value: {
359
+ type,
360
+ file,
361
+ },
362
+ };
363
+ }
364
+
365
+ async function selectTestFile() {
366
+ const selected = readCLIFile();
367
+ const unitTests = listTestFiles('unit').map((file) =>
368
+ createChoiceData('unit', file)
369
+ );
370
+ const visualTests = listTestFiles('visual').map((file) =>
371
+ createChoiceData('visual', file)
372
+ );
373
+ const { tests: filteredTests } = await inquirer.prompt([
374
+ {
375
+ type: 'test-selection',
376
+ name: 'tests',
377
+ message: 'Select test files',
378
+ highlight: true,
379
+ searchable: true,
380
+ default: selected,
381
+ pageSize: Math.max(10, selected.length),
382
+ source(answersSoFar, input = '') {
383
+ return new Promise((resolve) => {
384
+ const tests = _.concat(unitTests, visualTests);
385
+ const value = _.map(this.getCurrentValue(), (value) =>
386
+ createChoiceData(value.type, value.file)
387
+ );
388
+ if (value.length > 0) {
389
+ if (
390
+ value.find(
391
+ (v) => v.value && v.value.type === 'unit' && !v.value.file
392
+ )
393
+ ) {
394
+ _.pullAll(tests, unitTests);
395
+ }
396
+ if (
397
+ value.find(
398
+ (v) => v.value && v.value.type === 'visual' && !v.value.file
399
+ )
400
+ ) {
401
+ _.pullAll(tests, visualTests);
402
+ }
403
+ }
404
+ const unitChoice = createChoiceData('unit', '');
405
+ const visualChoice = createChoiceData('visual', '');
406
+ !value.find((v) => _.isEqual(v, unitChoice)) &&
407
+ value.push(unitChoice);
408
+ !value.find((v) => _.isEqual(v, visualChoice)) &&
409
+ value.push(visualChoice);
410
+ if (value.length > 0) {
411
+ value.unshift(new inquirer.Separator());
412
+ value.push(new inquirer.Separator());
413
+ }
414
+ const res = fuzzy
415
+ .filter(input, tests, {
416
+ extract: (item) => item.name,
417
+ })
418
+ .map((element) => element.original);
419
+ resolve(value.concat(_.differenceBy(res, value, 'name')));
420
+ });
421
+ },
422
+ },
423
+ ]);
424
+ writeCLIFile(filteredTests);
425
+ return filteredTests;
426
+ }
427
+
428
+ async function runInteractiveTestSuite(options) {
429
+ // some tests fail because of some pollution when run from the same context
430
+ // test(_.map(await selectTestFile(), curr => `test/${curr.type}/${curr.file}`))
431
+ const tests = _.reduce(
432
+ await selectTestFile(),
433
+ (acc, curr) => {
434
+ if (!curr.file) {
435
+ acc[curr.type] = true;
436
+ } else if (Array.isArray(acc[curr.type])) {
437
+ acc[curr.type].push(`test/${curr.type}/${curr.file}`);
438
+ }
439
+ return acc;
440
+ },
441
+ { unit: [], visual: [] }
442
+ );
443
+ return Promise.all(
444
+ _.map(tests, (files, suite) => {
445
+ if (files === true) {
446
+ return test(suite, null, options);
447
+ } else if (Array.isArray(files) && files.length > 0) {
448
+ return test(suite, files, options);
449
+ }
450
+ })
451
+ );
452
+ }
453
+
454
+ program
455
+ .name('fabric.js')
456
+ .description('fabric.js DEV CLI tools')
457
+ .version(process.env.npm_package_version)
458
+ .showSuggestionAfterError();
459
+
460
+ program
461
+ .command('dev')
462
+ .description('watch for changes in `src` and `test` directories')
463
+ .action(() => {
464
+ cp.spawn('npm run build -- -f -w', { stdio: 'inherit', shell: true });
465
+ cp.spawn('npm run build-tests -- -w', { stdio: 'inherit', shell: true });
466
+ });
467
+
468
+ program
469
+ .command('build')
470
+ .description('build dist')
471
+ .option('-f, --fast', 'skip minifying')
472
+ .option('-w, --watch')
473
+ .option('-i, --input <...path>', 'specify the build input paths')
474
+ .option('-o, --output <path>', 'specify the build output path')
475
+ .option('-x, --exclude <exclude...>')
476
+ .option('-m, --modules <modules...>')
477
+ .option('-s, --stats', 'inspect build statistics', false)
478
+ .action((options) => {
479
+ build(options);
480
+ });
481
+
482
+ program
483
+ .command('test')
484
+ .description('run test suite')
485
+ .addOption(
486
+ new commander.Option('-s, --suite <suite...>', 'test suite to run').choices(
487
+ ['unit', 'visual']
488
+ )
489
+ )
490
+ .option('-f, --file <file>', 'run a specific test file')
491
+ .option('--filter <filter>', 'filter tests by name')
492
+ .option('-a, --all', 'run all tests', false)
493
+ .option(
494
+ '-d, --debug',
495
+ 'debug visual tests by overriding refs (golden images) in case of visual changes',
496
+ false
497
+ )
498
+ .option('-r, --recreate', 'recreate visual refs (golden images)', false)
499
+ .option('-v, --verbose', 'log passing tests', true)
500
+ .option('--no-verbose', 'disable verbose logging')
501
+ .option('-l, --launch', 'launch tests in the browser', false)
502
+ .option('--dev', 'runs testem in `dev` mode, without a `ci` flag', false)
503
+ .addOption(
504
+ new commander.Option('-c, --context <context...>', 'context to test in')
505
+ .choices(['node', 'chrome', 'firefox'])
506
+ .default(['node'])
507
+ )
508
+ .option('-p, --port')
509
+ .option('-o, --out <out>', 'path to report test results to')
510
+ .option('--clear-cache', 'clear CLI test cache', false)
511
+ .action(async (options) => {
512
+ if (options.clearCache) {
513
+ fs.removeSync(CLI_CACHE);
514
+ }
515
+ if (options.all) {
516
+ options.suite = ['unit', 'visual'];
517
+ }
518
+ const results = [];
519
+ if (options.suite) {
520
+ results.push(
521
+ ...(await Promise.all(
522
+ _.map(options.suite, (suite) => {
523
+ return test(suite, null, options);
524
+ })
525
+ ))
526
+ );
527
+ } else if (options.file) {
528
+ results.push(
529
+ await test(
530
+ options.file.startsWith('visual') ? 'visual' : 'unit',
531
+ [`test/${options.file}`],
532
+ options
533
+ )
534
+ );
535
+ } else {
536
+ results.push(...(await runInteractiveTestSuite(options)));
537
+ }
538
+ if (_.some(results)) {
539
+ // inform ci that tests have failed
540
+ process.exit(1);
541
+ }
542
+ });
543
+
544
+ const website = program.command('website').description('fabricjs.com commands');
545
+
546
+ website
547
+ .command('start')
548
+ .description('start fabricjs.com dev server')
549
+ .allowExcessArguments()
550
+ .allowUnknownOption()
551
+ .action(startWebsite);
552
+
553
+ website
554
+ .command('export')
555
+ .description('export files to fabricjs.com directory')
556
+ .addOption(
557
+ new commander.Option('-i, --include <what...>')
558
+ .choices(['build', 'tests'])
559
+ .default(['build', 'tests'], 'export all')
560
+ )
561
+ .option('-w, --watch')
562
+ .action(exportToWebsite);
563
+
564
+ program.parse(process.argv);
@@ -0,0 +1,149 @@
1
+ import chalk from 'chalk';
2
+ import * as commander from 'commander';
3
+ import fs from 'fs-extra';
4
+ import inquirer from 'inquirer';
5
+ import path from 'node:path';
6
+ import process from 'node:process';
7
+ import { createCodeSandbox, ignore } from '../.codesandbox/deploy.mjs';
8
+ import { startSandbox } from '../.codesandbox/start.mjs';
9
+ import { wd } from './dirname.mjs';
10
+
11
+ const program = new commander.Command()
12
+ .showHelpAfterError()
13
+ .allowUnknownOption(false)
14
+ .allowExcessArguments(false);
15
+
16
+ const codesandboxTemplatesDir = path.resolve(wd, '.codesandbox', 'templates');
17
+
18
+ const sandbox = program.command('sandbox').description('sandbox commands');
19
+
20
+ const templates = fs.readdirSync(codesandboxTemplatesDir);
21
+
22
+ program
23
+ .command('start')
24
+ .description('start a sandbox app')
25
+ .addArgument(
26
+ new commander.Argument('<template>', 'template to use').choices(templates)
27
+ )
28
+ .option('-w, --watch', 'build and watch fabric', true)
29
+ .option(
30
+ '--no-watch',
31
+ 'use this option if you have another process watching fabric'
32
+ )
33
+ .action(async (template, { watch }) => {
34
+ const pathToSandbox = path.resolve(codesandboxTemplatesDir, template);
35
+ startSandbox(pathToSandbox, watch);
36
+ });
37
+
38
+ sandbox
39
+ .command('deploy')
40
+ .argument('[path]', 'directory to upload')
41
+ .description('deploy a sandbox to codesandbox')
42
+ .addOption(
43
+ new commander.Option(
44
+ '-t, --template <template>',
45
+ 'template to use instead of a "path"'
46
+ ).choices(templates)
47
+ )
48
+ .action(async (deploy, { template }, context) => {
49
+ if (!deploy && !template) {
50
+ console.log(chalk.red(`Provide "path" or "--template"`));
51
+ context.help({ error: true });
52
+ return;
53
+ } else if (
54
+ !template &&
55
+ !fs.existsSync(deploy) &&
56
+ templates.includes(deploy)
57
+ ) {
58
+ template = deploy;
59
+ deploy = undefined;
60
+ const { confirm } = await inquirer.prompt([
61
+ {
62
+ type: 'confirm',
63
+ name: 'confirm',
64
+ message: `Did you mean to run ${chalk.blue(
65
+ `npm run sandbox deploy -- -t ${template}\n`
66
+ )}?`,
67
+ default: true,
68
+ },
69
+ ]);
70
+ if (!confirm) {
71
+ context.help({ error: true });
72
+ return;
73
+ }
74
+ }
75
+ const uri = await createCodeSandbox(
76
+ deploy || path.resolve(codesandboxTemplatesDir, template)
77
+ );
78
+ console.log(chalk.yellow(`> created codesandbox ${uri}`));
79
+ });
80
+
81
+ sandbox
82
+ .command('build')
83
+ .description('build and start a sandbox')
84
+ .addArgument(
85
+ new commander.Argument('<template>', 'template to use').choices(templates)
86
+ )
87
+ .argument('<destination>', 'build destination')
88
+ .option('-w, --watch', 'build and watch fabric', true)
89
+ .option(
90
+ '--no-watch',
91
+ 'use this option if you have another process watching fabric'
92
+ )
93
+ .action((template, destination, { watch }) => {
94
+ const templateDir = path.resolve(codesandboxTemplatesDir, template);
95
+ fs.copySync(templateDir, destination, {
96
+ filter: (src) => !ignore(templateDir, path.relative(templateDir, src)),
97
+ });
98
+ console.log(
99
+ `${chalk.blue(
100
+ `> building ${chalk.bold(template)} sandbox`
101
+ )} at ${chalk.cyanBright(destination)}`
102
+ );
103
+ startSandbox(destination, watch, true);
104
+ });
105
+
106
+ sandbox
107
+ .command('start [path]')
108
+ .description('start a sandbox')
109
+ .addOption(
110
+ new commander.Option(
111
+ '-t, --template <template>',
112
+ 'template to use instead of a "path"'
113
+ ).choices(templates)
114
+ )
115
+ .option('-w, --watch', 'build and watch fabric', true)
116
+ .option(
117
+ '--no-watch',
118
+ 'use this option if you have another process watching fabric'
119
+ )
120
+ .action(async (pathToSandbox, { template, watch }, context) => {
121
+ if (!fs.existsSync(pathToSandbox) && templates.includes(pathToSandbox)) {
122
+ const { confirm } = await inquirer.prompt([
123
+ {
124
+ type: 'confirm',
125
+ name: 'confirm',
126
+ message: `Did you mean to run ${chalk.blue(
127
+ `npm run sandbox start -- -t ${pathToSandbox}\n`
128
+ )}?`,
129
+ default: true,
130
+ },
131
+ ]);
132
+ if (!confirm) {
133
+ context.help({ error: true });
134
+ return;
135
+ }
136
+ template = pathToSandbox;
137
+ pathToSandbox = undefined;
138
+ } else if (!fs.existsSync(pathToSandbox)) {
139
+ console.log(chalk.blue('Did you mean to use the build command?'));
140
+ context.help({ error: true });
141
+ return;
142
+ }
143
+ startSandbox(
144
+ pathToSandbox || path.resolve(codesandboxTemplatesDir, template),
145
+ watch
146
+ );
147
+ });
148
+
149
+ program.parse(process.argv);