fabric 5.3.0 → 6.0.0-beta10
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.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +51 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.gitpod.yml +17 -1
- package/.prettierignore +19 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +615 -189
- package/CONTRIBUTING.md +233 -59
- package/README.md +200 -235
- package/babel-jest.config.js +6 -0
- package/bower.json +1 -3
- package/dist/fabric.d.ts +54 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +28452 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +28385 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +28538 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +20 -0
- package/dist/index.node.mjs +28477 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/ClassRegistry.d.ts +13 -0
- package/dist/src/Collection.d.ts +136 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +227 -0
- package/dist/src/Intersection.d.ts +112 -0
- package/dist/src/Observable.d.ts +60 -0
- package/dist/src/Pattern/Pattern.d.ts +99 -0
- package/dist/src/Pattern/index.d.ts +3 -0
- package/dist/src/Pattern/types.d.ts +9 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +96 -0
- package/dist/src/brushes/BaseBrush.d.ts +101 -0
- package/dist/src/brushes/CircleBrush.d.ts +44 -0
- package/dist/src/brushes/CircleBrush.test.d.ts +2 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +74 -0
- package/dist/src/brushes/typedefs.d.ts +18 -0
- package/dist/src/cache.d.ts +47 -0
- package/dist/src/canvas/Canvas.d.ts +364 -0
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
- package/dist/src/canvas/DOMManagers/util.d.ts +24 -0
- package/dist/src/canvas/DOMManagers/util.spec.d.ts +2 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
- package/dist/src/canvas/StaticCanvas.d.ts +747 -0
- package/dist/src/canvas/TextEditingManager.d.ts +21 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +152 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +104 -0
- package/dist/src/color/typedefs.d.ts +16 -0
- package/dist/src/color/util.d.ts +27 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +21 -0
- package/dist/src/controls/Control.d.ts +229 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/commonControls.d.ts +28 -0
- package/dist/src/controls/controlRendering.d.ts +29 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/fireEvent.d.ts +3 -0
- package/dist/src/controls/index.d.ts +13 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +28 -0
- package/dist/src/env/node.d.ts +6 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +160 -0
- package/dist/src/filters/BlendColor.d.ts +81 -0
- package/dist/src/filters/BlendImage.d.ts +93 -0
- package/dist/src/filters/Blur.d.ts +52 -0
- package/dist/src/filters/Boilerplate.d.ts +48 -0
- package/dist/src/filters/Brightness.d.ts +48 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +64 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +537 -0
- package/dist/src/filters/Composed.d.ts +46 -0
- package/dist/src/filters/Contrast.d.ts +46 -0
- package/dist/src/filters/Convolute.d.ts +83 -0
- package/dist/src/filters/FilterBackend.d.ts +15 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts +7 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist/src/filters/Gamma.d.ts +55 -0
- package/dist/src/filters/Grayscale.d.ts +47 -0
- package/dist/src/filters/HueRotation.d.ts +25 -0
- package/dist/src/filters/Invert.d.ts +56 -0
- package/dist/src/filters/Noise.d.ts +55 -0
- package/dist/src/filters/Pixelate.d.ts +45 -0
- package/dist/src/filters/RemoveColor.d.ts +64 -0
- package/dist/src/filters/Resize.d.ts +137 -0
- package/dist/src/filters/Saturation.d.ts +49 -0
- package/dist/src/filters/Vibrance.d.ts +49 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +128 -0
- package/dist/src/filters/filters.d.ts +21 -0
- package/dist/src/filters/index.d.ts +7 -0
- package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist/src/filters/shaders/blendImage.d.ts +3 -0
- package/dist/src/filters/shaders/blur.d.ts +2 -0
- package/dist/src/filters/shaders/brightness.d.ts +2 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist/src/filters/shaders/constrast.d.ts +2 -0
- package/dist/src/filters/shaders/convolute.d.ts +11 -0
- package/dist/src/filters/shaders/gamma.d.ts +2 -0
- package/dist/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist/src/filters/shaders/invert.d.ts +2 -0
- package/dist/src/filters/shaders/noise.d.ts +2 -0
- package/dist/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist/src/filters/shaders/saturation.d.ts +2 -0
- package/dist/src/filters/shaders/vibrance.d.ts +2 -0
- package/dist/src/filters/typedefs.d.ts +48 -0
- package/dist/src/filters/utils.d.ts +3 -0
- package/dist/src/gradient/Gradient.d.ts +150 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/index.d.ts +3 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +53 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/index.d.ts +9 -0
- package/dist/src/parser/loadSVGFromString.d.ts +18 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +19 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +23 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +11 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/typedefs.d.ts +9 -0
- package/dist/src/shapes/ActiveSelection.d.ts +83 -0
- package/dist/src/shapes/Circle.d.ts +99 -0
- package/dist/src/shapes/Ellipse.d.ts +84 -0
- package/dist/src/shapes/Group.d.ts +407 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +336 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +73 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +309 -0
- package/dist/src/shapes/Line.d.ts +121 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
- package/dist/src/shapes/Object/Object.d.ts +599 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist/src/shapes/Object/types/index.d.ts +6 -0
- package/dist/src/shapes/Path.d.ts +214 -0
- package/dist/src/shapes/Polygon.d.ts +10 -0
- package/dist/src/shapes/Polyline.d.ts +147 -0
- package/dist/src/shapes/Rect.d.ts +82 -0
- package/dist/src/shapes/Text/StyledText.d.ts +123 -0
- package/dist/src/shapes/Text/Text.d.ts +688 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Text/constants.d.ts +13 -0
- package/dist/src/shapes/Textbox.d.ts +204 -0
- package/dist/src/shapes/Triangle.d.ts +26 -0
- package/dist/src/typedefs.d.ts +96 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/index.d.ts +3 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +12 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/index.d.ts +36 -0
- package/dist/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
- package/dist/src/util/internals/cleanupSvgAttribute.test.d.ts +2 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/cloneDeep.test.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/getRandomInt.test.d.ts +2 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +20 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +168 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +41 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +9 -0
- package/dist/src/util/misc/planeChange.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +82 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +26 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +12 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +45 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +58 -0
- package/dist/src/util/path/index.d.ts +96 -0
- package/dist/src/util/path/regex.d.ts +2 -0
- package/dist/src/util/path/typechecks.d.ts +24 -0
- package/dist/src/util/path/typedefs.d.ts +220 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/typeAssertions.d.ts +19 -0
- package/e2e/site/index.html +25 -0
- package/e2e/utils/objects.ts +36 -0
- package/fabric.ts +72 -0
- package/index.node.ts +43 -0
- package/index.ts +1 -0
- package/jest.config.js +194 -0
- package/lib/aligning_guidelines.js +2 -2
- package/package.json +110 -40
- package/playwright.config.ts +64 -0
- package/publish.js +0 -26
- package/rollup.config.mjs +99 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/git.mjs +36 -0
- package/scripts/index.mjs +564 -0
- package/scripts/sandbox.mjs +149 -0
- package/src/ClassRegistry.ts +56 -0
- package/src/Collection.ts +346 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +298 -0
- package/src/Intersection.ts +302 -0
- package/src/Observable.ts +181 -0
- package/src/Pattern/Pattern.ts +207 -0
- package/src/Pattern/index.ts +2 -0
- package/src/Pattern/types.ts +17 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +214 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +63 -42
- package/src/brushes/CircleBrush.test.ts +11 -0
- package/src/brushes/CircleBrush.ts +140 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +214 -0
- package/src/brushes/typedefs.ts +18 -0
- package/src/cache.ts +90 -0
- package/src/canvas/Canvas.ts +1598 -0
- package/src/canvas/DOMManagers/CanvasDOMManager.ts +124 -0
- package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +80 -0
- package/src/canvas/DOMManagers/util.spec.ts +26 -0
- package/src/canvas/DOMManagers/util.ts +98 -0
- package/src/canvas/SelectableCanvas.ts +1506 -0
- package/src/canvas/StaticCanvas.ts +1634 -0
- package/src/canvas/TextEditingManager.ts +70 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +320 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +107 -0
- package/src/color/typedefs.ts +18 -0
- package/src/color/util.ts +93 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +29 -0
- package/src/controls/Control.ts +385 -0
- package/src/controls/changeWidth.ts +53 -0
- package/src/controls/commonControls.ts +105 -0
- package/src/controls/controlRendering.ts +138 -0
- package/src/controls/drag.ts +32 -0
- package/src/controls/fireEvent.ts +18 -0
- package/src/controls/index.ts +22 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +243 -0
- package/src/controls/util.ts +155 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +32 -0
- package/src/env/index.ts +38 -0
- package/src/env/node.ts +58 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +203 -151
- package/src/filters/BlendColor.ts +219 -0
- package/src/filters/BlendImage.ts +230 -0
- package/src/filters/Blur.ts +181 -0
- package/src/filters/Boilerplate.ts +94 -0
- package/src/filters/Brightness.ts +85 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +147 -0
- package/src/filters/ColorMatrixFilters.ts +79 -0
- package/src/filters/Composed.ts +78 -0
- package/src/filters/Contrast.ts +84 -0
- package/src/filters/Convolute.ts +186 -0
- package/src/filters/FilterBackend.ts +38 -0
- package/src/filters/GLProbes/GLProbe.ts +7 -0
- package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
- package/src/filters/GLProbes/WebGLProbe.ts +47 -0
- package/src/filters/Gamma.ts +112 -0
- package/src/filters/Grayscale.ts +104 -0
- package/src/filters/HueRotation.ts +64 -0
- package/src/filters/Invert.ts +101 -0
- package/src/filters/Noise.ts +96 -0
- package/src/filters/Pixelate.ts +98 -0
- package/src/filters/RemoveColor.ts +137 -0
- package/src/filters/Resize.ts +540 -0
- package/src/filters/Saturation.ts +89 -0
- package/src/filters/Vibrance.ts +90 -0
- package/src/filters/WebGLFilterBackend.ts +456 -0
- package/src/filters/filters.ts +28 -0
- package/src/filters/index.ts +12 -0
- package/src/filters/shaders/baseFilter.ts +17 -0
- package/src/filters/shaders/blendColor.ts +33 -0
- package/src/filters/shaders/blendImage.ts +32 -0
- package/src/filters/shaders/blur.ts +24 -0
- package/src/filters/shaders/brightness.ts +11 -0
- package/src/filters/shaders/colorMatrix.ts +12 -0
- package/src/filters/shaders/constrast.ts +11 -0
- package/src/filters/shaders/convolute.ts +154 -0
- package/src/filters/shaders/gamma.ts +15 -0
- package/src/filters/shaders/grayscale.ts +36 -0
- package/src/filters/shaders/invert.ts +19 -0
- package/src/filters/shaders/noise.ts +16 -0
- package/src/filters/shaders/pixelate.ts +19 -0
- package/src/filters/shaders/removeColor.ts +13 -0
- package/src/filters/shaders/saturation.ts +15 -0
- package/src/filters/shaders/vibrance.ts +16 -0
- package/src/filters/typedefs.ts +59 -0
- package/src/filters/utils.ts +7 -0
- package/src/gradient/Gradient.ts +409 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/index.ts +2 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +56 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +158 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +116 -0
- package/src/parser/doesSomeParentMatch.ts +18 -0
- package/src/parser/elementById.ts +21 -0
- package/src/parser/elementMatchesRule.ts +16 -0
- package/src/parser/elements_parser.ts +158 -0
- package/src/parser/getCSSRules.ts +61 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +31 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +3 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/index.ts +8 -0
- package/src/parser/loadSVGFromString.ts +29 -0
- package/src/parser/loadSVGFromURL.ts +47 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +64 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +34 -0
- package/src/parser/parseSVGDocument.ts +118 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +94 -0
- package/src/parser/parseUseDirectives.ts +78 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/typedefs.ts +13 -0
- package/src/shapes/ActiveSelection.ts +192 -0
- package/src/shapes/Circle.ts +236 -0
- package/src/shapes/Ellipse.ts +177 -0
- package/src/shapes/Group.ts +1103 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +385 -0
- package/src/shapes/IText/IText.ts +696 -0
- package/src/shapes/IText/ITextBehavior.ts +1073 -0
- package/src/shapes/IText/ITextClickBehavior.ts +292 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +675 -0
- package/src/shapes/IText/constants.ts +53 -0
- package/src/shapes/Image.ts +848 -0
- package/src/shapes/Line.ts +285 -0
- package/src/shapes/Object/AnimatableObject.ts +103 -0
- package/src/shapes/Object/FabricObject.ts +29 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +278 -0
- package/src/shapes/Object/InteractiveObject.ts +669 -0
- package/src/shapes/Object/Object.ts +1589 -0
- package/src/shapes/Object/ObjectGeometry.ts +814 -0
- package/src/shapes/Object/ObjectOrigin.ts +277 -0
- package/src/shapes/Object/StackedObject.ts +206 -0
- package/src/shapes/Object/defaultValues.ts +110 -0
- package/src/shapes/Object/types/BaseProps.ts +96 -0
- package/src/shapes/Object/types/BorderProps.ts +40 -0
- package/src/shapes/Object/types/ControlProps.ts +69 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
- package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
- package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
- package/src/shapes/Object/types/ObjectProps.ts +49 -0
- package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
- package/src/shapes/Object/types/index.ts +8 -0
- package/src/shapes/Path.ts +434 -0
- package/src/shapes/Polygon.ts +22 -0
- package/src/shapes/Polyline.ts +364 -0
- package/src/shapes/Rect.ts +230 -0
- package/src/shapes/Text/StyledText.ts +323 -0
- package/src/shapes/Text/Text.ts +1891 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +289 -0
- package/src/shapes/Text/constants.ts +111 -0
- package/src/shapes/Textbox.ts +526 -0
- package/src/shapes/Triangle.ts +62 -0
- package/src/typedefs.ts +121 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +9 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/index.ts +2 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +44 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/index.ts +106 -0
- package/src/util/internals/cleanupSvgAttribute.test.ts +16 -0
- package/src/util/internals/cleanupSvgAttribute.ts +8 -0
- package/src/util/internals/cloneDeep.test.ts +16 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.test.ts +33 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +38 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +55 -0
- package/src/util/misc/findScaleTo.ts +29 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +28 -0
- package/src/util/misc/matrix.ts +313 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +174 -0
- package/src/util/misc/objectTransforms.ts +130 -0
- package/src/util/misc/pick.ts +29 -0
- package/src/util/misc/planeChange.ts +127 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +113 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +227 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +76 -0
- package/src/util/misc/projectStroke/index.ts +55 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +171 -0
- package/src/util/misc/textStyles.ts +132 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +83 -0
- package/src/util/path/index.ts +1039 -0
- package/src/util/path/regex.ts +39 -0
- package/src/util/path/typechecks.ts +145 -0
- package/src/util/path/typedefs.ts +305 -0
- package/src/util/transform_matrix_removal.ts +61 -0
- package/src/util/typeAssertions.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { iMatrix } from '../../constants';
|
|
2
|
+
import type { XY } from '../../Point';
|
|
3
|
+
import { Point } from '../../Point';
|
|
4
|
+
import type { TDegree, TRadian, TMat2D } from '../../typedefs';
|
|
5
|
+
import { cos } from './cos';
|
|
6
|
+
import { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';
|
|
7
|
+
import { sin } from './sin';
|
|
8
|
+
|
|
9
|
+
type TRotateMatrixArgs = {
|
|
10
|
+
angle?: TDegree;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type TTranslateMatrixArgs = {
|
|
14
|
+
translateX?: number;
|
|
15
|
+
translateY?: number;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type TScaleMatrixArgs = {
|
|
19
|
+
scaleX?: number;
|
|
20
|
+
scaleY?: number;
|
|
21
|
+
flipX?: boolean;
|
|
22
|
+
flipY?: boolean;
|
|
23
|
+
skewX?: TDegree;
|
|
24
|
+
skewY?: TDegree;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type TComposeMatrixArgs = TTranslateMatrixArgs &
|
|
28
|
+
TRotateMatrixArgs &
|
|
29
|
+
TScaleMatrixArgs;
|
|
30
|
+
|
|
31
|
+
export type TQrDecomposeOut = Required<
|
|
32
|
+
Omit<TComposeMatrixArgs, 'flipX' | 'flipY'>
|
|
33
|
+
>;
|
|
34
|
+
|
|
35
|
+
export const isIdentityMatrix = (mat: TMat2D) =>
|
|
36
|
+
mat.every((value, index) => value === iMatrix[index]);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Apply transform t to point p
|
|
40
|
+
* @param {Point | XY} p The point to transform
|
|
41
|
+
* @param {Array} t The transform
|
|
42
|
+
* @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied
|
|
43
|
+
* @return {Point} The transformed point
|
|
44
|
+
*/
|
|
45
|
+
export const transformPoint = (
|
|
46
|
+
p: XY,
|
|
47
|
+
t: TMat2D,
|
|
48
|
+
ignoreOffset?: boolean
|
|
49
|
+
): Point => new Point(p).transform(t, ignoreOffset);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Invert transformation t
|
|
53
|
+
* @param {Array} t The transform
|
|
54
|
+
* @return {Array} The inverted transform
|
|
55
|
+
*/
|
|
56
|
+
export const invertTransform = (t: TMat2D): TMat2D => {
|
|
57
|
+
const a = 1 / (t[0] * t[3] - t[1] * t[2]),
|
|
58
|
+
r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,
|
|
59
|
+
{ x, y } = new Point(t[4], t[5]).transform(r, true);
|
|
60
|
+
r[4] = -x;
|
|
61
|
+
r[5] = -y;
|
|
62
|
+
return r;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Multiply matrix A by matrix B to nest transformations
|
|
67
|
+
* @param {TMat2D} a First transformMatrix
|
|
68
|
+
* @param {TMat2D} b Second transformMatrix
|
|
69
|
+
* @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices
|
|
70
|
+
* @return {TMat2D} The product of the two transform matrices
|
|
71
|
+
*/
|
|
72
|
+
export const multiplyTransformMatrices = (
|
|
73
|
+
a: TMat2D,
|
|
74
|
+
b: TMat2D,
|
|
75
|
+
is2x2?: boolean
|
|
76
|
+
): TMat2D =>
|
|
77
|
+
[
|
|
78
|
+
a[0] * b[0] + a[2] * b[1],
|
|
79
|
+
a[1] * b[0] + a[3] * b[1],
|
|
80
|
+
a[0] * b[2] + a[2] * b[3],
|
|
81
|
+
a[1] * b[2] + a[3] * b[3],
|
|
82
|
+
is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],
|
|
83
|
+
is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],
|
|
84
|
+
] as TMat2D;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Multiplies {@link matrices} such that a matrix defines the plane for the rest of the matrices **after** it
|
|
88
|
+
*
|
|
89
|
+
* `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`
|
|
90
|
+
*
|
|
91
|
+
* @param matrices an array of matrices
|
|
92
|
+
* @param [is2x2] flag to multiply matrices as 2x2 matrices
|
|
93
|
+
* @returns the multiplication product
|
|
94
|
+
*/
|
|
95
|
+
export const multiplyTransformMatrixArray = (
|
|
96
|
+
matrices: (TMat2D | undefined | null | false)[],
|
|
97
|
+
is2x2?: boolean
|
|
98
|
+
) =>
|
|
99
|
+
matrices.reduceRight(
|
|
100
|
+
(product: TMat2D, curr) =>
|
|
101
|
+
curr ? multiplyTransformMatrices(curr, product, is2x2) : product,
|
|
102
|
+
iMatrix
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Decomposes standard 2x3 matrix into transform components
|
|
107
|
+
* @param {TMat2D} a transformMatrix
|
|
108
|
+
* @return {Object} Components of transform
|
|
109
|
+
*/
|
|
110
|
+
export const qrDecompose = (a: TMat2D): TQrDecomposeOut => {
|
|
111
|
+
const angle = Math.atan2(a[1], a[0]),
|
|
112
|
+
denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),
|
|
113
|
+
scaleX = Math.sqrt(denom),
|
|
114
|
+
scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,
|
|
115
|
+
skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);
|
|
116
|
+
return {
|
|
117
|
+
angle: radiansToDegrees(angle),
|
|
118
|
+
scaleX,
|
|
119
|
+
scaleY,
|
|
120
|
+
skewX: radiansToDegrees(skewX),
|
|
121
|
+
skewY: 0 as TDegree,
|
|
122
|
+
translateX: a[4] || 0,
|
|
123
|
+
translateY: a[5] || 0,
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Generate a translation matrix
|
|
129
|
+
*
|
|
130
|
+
* A translation matrix in the form of
|
|
131
|
+
* [ 1 0 x ]
|
|
132
|
+
* [ 0 1 y ]
|
|
133
|
+
* [ 0 0 1 ]
|
|
134
|
+
*
|
|
135
|
+
* See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details
|
|
136
|
+
*
|
|
137
|
+
* @param {number} x translation on X axis
|
|
138
|
+
* @param {number} [y] translation on Y axis
|
|
139
|
+
* @returns {TMat2D} matrix
|
|
140
|
+
*/
|
|
141
|
+
export const createTranslateMatrix = (x: number, y = 0): TMat2D => [
|
|
142
|
+
1,
|
|
143
|
+
0,
|
|
144
|
+
0,
|
|
145
|
+
1,
|
|
146
|
+
x,
|
|
147
|
+
y,
|
|
148
|
+
];
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Generate a rotation matrix around around a point (x,y), defaulting to (0,0)
|
|
152
|
+
*
|
|
153
|
+
* A matrix in the form of
|
|
154
|
+
* [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]
|
|
155
|
+
* [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]
|
|
156
|
+
* [0 0 1 ]
|
|
157
|
+
*
|
|
158
|
+
*
|
|
159
|
+
* @param {TDegree} angle rotation in degrees
|
|
160
|
+
* @param {XY} [pivotPoint] pivot point to rotate around
|
|
161
|
+
* @returns {TMat2D} matrix
|
|
162
|
+
*/
|
|
163
|
+
export function createRotateMatrix(
|
|
164
|
+
{ angle = 0 }: TRotateMatrixArgs = {},
|
|
165
|
+
{ x = 0, y = 0 }: Partial<XY> = {}
|
|
166
|
+
): TMat2D {
|
|
167
|
+
const angleRadiant = degreesToRadians(angle),
|
|
168
|
+
cosValue = cos(angleRadiant),
|
|
169
|
+
sinValue = sin(angleRadiant);
|
|
170
|
+
return [
|
|
171
|
+
cosValue,
|
|
172
|
+
sinValue,
|
|
173
|
+
-sinValue,
|
|
174
|
+
cosValue,
|
|
175
|
+
x ? x - (cosValue * x - sinValue * y) : 0,
|
|
176
|
+
y ? y - (sinValue * x + cosValue * y) : 0,
|
|
177
|
+
];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Generate a scale matrix around the point (0,0)
|
|
182
|
+
*
|
|
183
|
+
* A matrix in the form of
|
|
184
|
+
* [x 0 0]
|
|
185
|
+
* [0 y 0]
|
|
186
|
+
* [0 0 1]
|
|
187
|
+
*
|
|
188
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale
|
|
189
|
+
*
|
|
190
|
+
* @param {number} x scale on X axis
|
|
191
|
+
* @param {number} [y] scale on Y axis
|
|
192
|
+
* @returns {TMat2D} matrix
|
|
193
|
+
*/
|
|
194
|
+
export const createScaleMatrix = (x: number, y: number = x): TMat2D => [
|
|
195
|
+
x,
|
|
196
|
+
0,
|
|
197
|
+
0,
|
|
198
|
+
y,
|
|
199
|
+
0,
|
|
200
|
+
0,
|
|
201
|
+
];
|
|
202
|
+
|
|
203
|
+
export const angleToSkew = (angle: TDegree) =>
|
|
204
|
+
Math.tan(degreesToRadians(angle));
|
|
205
|
+
|
|
206
|
+
export const skewToAngle = (value: TRadian) =>
|
|
207
|
+
radiansToDegrees(Math.atan(value));
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Generate a skew matrix for the X axis
|
|
211
|
+
*
|
|
212
|
+
* A matrix in the form of
|
|
213
|
+
* [1 x 0]
|
|
214
|
+
* [0 1 0]
|
|
215
|
+
* [0 0 1]
|
|
216
|
+
*
|
|
217
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx
|
|
218
|
+
*
|
|
219
|
+
* @param {TDegree} skewValue translation on X axis
|
|
220
|
+
* @returns {TMat2D} matrix
|
|
221
|
+
*/
|
|
222
|
+
export const createSkewXMatrix = (skewValue: TDegree): TMat2D => [
|
|
223
|
+
1,
|
|
224
|
+
0,
|
|
225
|
+
angleToSkew(skewValue),
|
|
226
|
+
1,
|
|
227
|
+
0,
|
|
228
|
+
0,
|
|
229
|
+
];
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Generate a skew matrix for the Y axis
|
|
233
|
+
*
|
|
234
|
+
* A matrix in the form of
|
|
235
|
+
* [1 0 0]
|
|
236
|
+
* [y 1 0]
|
|
237
|
+
* [0 0 1]
|
|
238
|
+
*
|
|
239
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy
|
|
240
|
+
*
|
|
241
|
+
* @param {TDegree} skewValue translation on Y axis
|
|
242
|
+
* @returns {TMat2D} matrix
|
|
243
|
+
*/
|
|
244
|
+
export const createSkewYMatrix = (skewValue: TDegree): TMat2D => [
|
|
245
|
+
1,
|
|
246
|
+
angleToSkew(skewValue),
|
|
247
|
+
0,
|
|
248
|
+
1,
|
|
249
|
+
0,
|
|
250
|
+
0,
|
|
251
|
+
];
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Returns a transform matrix starting from an object of the same kind of
|
|
255
|
+
* the one returned from qrDecompose, useful also if you want to calculate some
|
|
256
|
+
* transformations from an object that is not enlived yet.
|
|
257
|
+
* is called DimensionsTransformMatrix because those properties are the one that influence
|
|
258
|
+
* the size of the resulting box of the object.
|
|
259
|
+
* @param {Object} options
|
|
260
|
+
* @param {Number} [options.scaleX]
|
|
261
|
+
* @param {Number} [options.scaleY]
|
|
262
|
+
* @param {Boolean} [options.flipX]
|
|
263
|
+
* @param {Boolean} [options.flipY]
|
|
264
|
+
* @param {Number} [options.skewX]
|
|
265
|
+
* @param {Number} [options.skewY]
|
|
266
|
+
* @return {Number[]} transform matrix
|
|
267
|
+
*/
|
|
268
|
+
export const calcDimensionsMatrix = ({
|
|
269
|
+
scaleX = 1,
|
|
270
|
+
scaleY = 1,
|
|
271
|
+
flipX = false,
|
|
272
|
+
flipY = false,
|
|
273
|
+
skewX = 0 as TDegree,
|
|
274
|
+
skewY = 0 as TDegree,
|
|
275
|
+
}: TScaleMatrixArgs) => {
|
|
276
|
+
return multiplyTransformMatrixArray(
|
|
277
|
+
[
|
|
278
|
+
createScaleMatrix(flipX ? -scaleX : scaleX, flipY ? -scaleY : scaleY),
|
|
279
|
+
skewX && createSkewXMatrix(skewX),
|
|
280
|
+
skewY && createSkewYMatrix(skewY),
|
|
281
|
+
],
|
|
282
|
+
true
|
|
283
|
+
);
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Returns a transform matrix starting from an object of the same kind of
|
|
288
|
+
* the one returned from qrDecompose, useful also if you want to calculate some
|
|
289
|
+
* transformations from an object that is not enlived yet
|
|
290
|
+
* @param {Object} options
|
|
291
|
+
* @param {Number} [options.angle]
|
|
292
|
+
* @param {Number} [options.scaleX]
|
|
293
|
+
* @param {Number} [options.scaleY]
|
|
294
|
+
* @param {Boolean} [options.flipX]
|
|
295
|
+
* @param {Boolean} [options.flipY]
|
|
296
|
+
* @param {Number} [options.skewX]
|
|
297
|
+
* @param {Number} [options.skewY]
|
|
298
|
+
* @param {Number} [options.translateX]
|
|
299
|
+
* @param {Number} [options.translateY]
|
|
300
|
+
* @return {Number[]} transform matrix
|
|
301
|
+
*/
|
|
302
|
+
export const composeMatrix = ({
|
|
303
|
+
translateX = 0,
|
|
304
|
+
translateY = 0,
|
|
305
|
+
angle = 0 as TDegree,
|
|
306
|
+
...otherOptions
|
|
307
|
+
}: TComposeMatrixArgs): TMat2D => {
|
|
308
|
+
return multiplyTransformMatrixArray([
|
|
309
|
+
createTranslateMatrix(translateX, translateY),
|
|
310
|
+
angle && createRotateMatrix({ angle }),
|
|
311
|
+
calcDimensionsMatrix(otherOptions),
|
|
312
|
+
]);
|
|
313
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
2
|
+
import { sendObjectToPlane } from './planeChange';
|
|
3
|
+
import { Group } from '../../shapes/Group';
|
|
4
|
+
/**
|
|
5
|
+
* Merges 2 clip paths into one visually equal clip path
|
|
6
|
+
*
|
|
7
|
+
* **IMPORTANT**:\
|
|
8
|
+
* Does **NOT** clone the arguments, clone them proir if necessary.
|
|
9
|
+
*
|
|
10
|
+
* Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.
|
|
11
|
+
* Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.
|
|
12
|
+
*
|
|
13
|
+
* In order to handle the `inverted` property we follow logic described in the following cases:\
|
|
14
|
+
* **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\
|
|
15
|
+
* **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\
|
|
16
|
+
* **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.
|
|
17
|
+
*
|
|
18
|
+
* @memberOf fabric.util
|
|
19
|
+
* @param {fabric.Object} c1
|
|
20
|
+
* @param {fabric.Object} c2
|
|
21
|
+
* @returns {fabric.Object} merged clip path
|
|
22
|
+
*/
|
|
23
|
+
export const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {
|
|
24
|
+
let a = c1,
|
|
25
|
+
b = c2;
|
|
26
|
+
if (a.inverted && !b.inverted) {
|
|
27
|
+
// case (2)
|
|
28
|
+
a = c2;
|
|
29
|
+
b = c1;
|
|
30
|
+
}
|
|
31
|
+
// `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane
|
|
32
|
+
sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());
|
|
33
|
+
// assign the `inverted` prop to the wrapping group
|
|
34
|
+
const inverted = a.inverted && b.inverted;
|
|
35
|
+
if (inverted) {
|
|
36
|
+
// case (1)
|
|
37
|
+
a.inverted = b.inverted = false;
|
|
38
|
+
}
|
|
39
|
+
return new Group([a], { clipPath: b, inverted });
|
|
40
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { noop } from '../../constants';
|
|
2
|
+
import type { Pattern } from '../../Pattern';
|
|
3
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
4
|
+
import type { Abortable, TCrossOrigin, TFiller } from '../../typedefs';
|
|
5
|
+
import { createImage } from './dom';
|
|
6
|
+
import { classRegistry } from '../../ClassRegistry';
|
|
7
|
+
|
|
8
|
+
export type LoadImageOptions = Abortable & {
|
|
9
|
+
/**
|
|
10
|
+
* cors value for the image loading, default to anonymous
|
|
11
|
+
*/
|
|
12
|
+
crossOrigin?: TCrossOrigin;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Loads image element from given url and resolve it, or catch.
|
|
17
|
+
* @param {String} url URL representing an image
|
|
18
|
+
* @param {LoadImageOptions} [options] image loading options
|
|
19
|
+
* @returns {Promise<HTMLImageElement>} the loaded image.
|
|
20
|
+
*/
|
|
21
|
+
export const loadImage = (
|
|
22
|
+
url: string,
|
|
23
|
+
{ signal, crossOrigin = null }: LoadImageOptions = {}
|
|
24
|
+
) =>
|
|
25
|
+
new Promise<HTMLImageElement>(function (resolve, reject) {
|
|
26
|
+
if (signal && signal.aborted) {
|
|
27
|
+
return reject(new Error('`options.signal` is in `aborted` state'));
|
|
28
|
+
}
|
|
29
|
+
const img = createImage();
|
|
30
|
+
let abort: EventListenerOrEventListenerObject;
|
|
31
|
+
if (signal) {
|
|
32
|
+
abort = function (err: Event) {
|
|
33
|
+
img.src = '';
|
|
34
|
+
reject(err);
|
|
35
|
+
};
|
|
36
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
37
|
+
}
|
|
38
|
+
const done = function () {
|
|
39
|
+
img.onload = img.onerror = null;
|
|
40
|
+
abort && signal?.removeEventListener('abort', abort);
|
|
41
|
+
resolve(img);
|
|
42
|
+
};
|
|
43
|
+
if (!url) {
|
|
44
|
+
done();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
img.onload = done;
|
|
48
|
+
img.onerror = function () {
|
|
49
|
+
abort && signal?.removeEventListener('abort', abort);
|
|
50
|
+
reject(new Error('Error loading ' + img.src));
|
|
51
|
+
};
|
|
52
|
+
crossOrigin && (img.crossOrigin = crossOrigin);
|
|
53
|
+
img.src = url;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export type EnlivenObjectOptions = Abortable & {
|
|
57
|
+
/**
|
|
58
|
+
* Method for further parsing of object elements,
|
|
59
|
+
* called after each fabric object created.
|
|
60
|
+
*/
|
|
61
|
+
reviver?: (
|
|
62
|
+
serializedObj: Record<string, any>,
|
|
63
|
+
instance: FabricObject
|
|
64
|
+
) => void;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Creates corresponding fabric instances from their object representations
|
|
69
|
+
* @param {Object[]} objects Objects to enliven
|
|
70
|
+
* @param {EnlivenObjectOptions} [options]
|
|
71
|
+
* @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,
|
|
72
|
+
* called after each fabric object created.
|
|
73
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
74
|
+
* @returns {Promise<FabricObject[]>}
|
|
75
|
+
*/
|
|
76
|
+
export const enlivenObjects = (
|
|
77
|
+
objects: any[],
|
|
78
|
+
{ signal, reviver = noop }: EnlivenObjectOptions = {}
|
|
79
|
+
) =>
|
|
80
|
+
new Promise<FabricObject[]>((resolve, reject) => {
|
|
81
|
+
const instances: FabricObject[] = [];
|
|
82
|
+
signal && signal.addEventListener('abort', reject, { once: true });
|
|
83
|
+
Promise.all(
|
|
84
|
+
objects.map((obj) =>
|
|
85
|
+
classRegistry
|
|
86
|
+
.getClass(obj.type)
|
|
87
|
+
.fromObject(obj, {
|
|
88
|
+
signal,
|
|
89
|
+
reviver,
|
|
90
|
+
})
|
|
91
|
+
.then((fabricInstance: FabricObject) => {
|
|
92
|
+
reviver(obj, fabricInstance);
|
|
93
|
+
instances.push(fabricInstance);
|
|
94
|
+
return fabricInstance;
|
|
95
|
+
})
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
.then(resolve)
|
|
99
|
+
.catch((error) => {
|
|
100
|
+
// cleanup
|
|
101
|
+
instances.forEach(function (instance) {
|
|
102
|
+
instance.dispose && instance.dispose();
|
|
103
|
+
});
|
|
104
|
+
reject(error);
|
|
105
|
+
})
|
|
106
|
+
.finally(() => {
|
|
107
|
+
signal && signal.removeEventListener('abort', reject);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Creates corresponding fabric instances residing in an object, e.g. `clipPath`
|
|
113
|
+
* @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
|
|
114
|
+
* @param {object} [options]
|
|
115
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
116
|
+
* @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values
|
|
117
|
+
*/
|
|
118
|
+
export const enlivenObjectEnlivables = <
|
|
119
|
+
R = Record<string, FabricObject | TFiller | null>
|
|
120
|
+
>(
|
|
121
|
+
serializedObject: any,
|
|
122
|
+
{ signal }: Abortable = {}
|
|
123
|
+
) =>
|
|
124
|
+
new Promise<R>((resolve, reject) => {
|
|
125
|
+
const instances: (FabricObject | TFiller)[] = [];
|
|
126
|
+
signal && signal.addEventListener('abort', reject, { once: true });
|
|
127
|
+
// enlive every possible property
|
|
128
|
+
const promises = Object.values(serializedObject).map((value: any) => {
|
|
129
|
+
if (!value) {
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
// gradient
|
|
133
|
+
if (value.colorStops) {
|
|
134
|
+
return new (classRegistry.getClass('gradient'))(value);
|
|
135
|
+
}
|
|
136
|
+
// clipPath
|
|
137
|
+
if (value.type) {
|
|
138
|
+
return enlivenObjects([value], { signal }).then(([enlived]) => {
|
|
139
|
+
instances.push(enlived);
|
|
140
|
+
return enlived;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// pattern
|
|
144
|
+
if (value.source) {
|
|
145
|
+
return classRegistry
|
|
146
|
+
.getClass('pattern')
|
|
147
|
+
.fromObject(value, { signal })
|
|
148
|
+
.then((pattern: Pattern) => {
|
|
149
|
+
instances.push(pattern);
|
|
150
|
+
return pattern;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
});
|
|
155
|
+
const keys = Object.keys(serializedObject);
|
|
156
|
+
Promise.all(promises)
|
|
157
|
+
.then((enlived) => {
|
|
158
|
+
return enlived.reduce((acc, instance, index) => {
|
|
159
|
+
acc[keys[index]] = instance;
|
|
160
|
+
return acc;
|
|
161
|
+
}, {});
|
|
162
|
+
})
|
|
163
|
+
.then(resolve)
|
|
164
|
+
.catch((error) => {
|
|
165
|
+
// cleanup
|
|
166
|
+
instances.forEach((instance: any) => {
|
|
167
|
+
instance.dispose && instance.dispose();
|
|
168
|
+
});
|
|
169
|
+
reject(error);
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
172
|
+
signal && signal.removeEventListener('abort', reject);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Point } from '../../Point';
|
|
2
|
+
import { CENTER } from '../../constants';
|
|
3
|
+
import type { FabricObject } from '../../shapes/Object/Object';
|
|
4
|
+
import type { TMat2D } from '../../typedefs';
|
|
5
|
+
import { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';
|
|
6
|
+
import type { TScaleMatrixArgs } from './matrix';
|
|
7
|
+
import {
|
|
8
|
+
calcDimensionsMatrix,
|
|
9
|
+
invertTransform,
|
|
10
|
+
multiplyTransformMatrices,
|
|
11
|
+
qrDecompose,
|
|
12
|
+
} from './matrix';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* given an object and a transform, apply the inverse transform to the object,
|
|
16
|
+
* this is equivalent to remove from that object that transformation, so that
|
|
17
|
+
* added in a space with the removed transform, the object will be the same as before.
|
|
18
|
+
* Removing from an object a transform that scale by 2 is like scaling it by 1/2.
|
|
19
|
+
* Removing from an object a transform that rotate by 30deg is like rotating by 30deg
|
|
20
|
+
* in the opposite direction.
|
|
21
|
+
* This util is used to add objects inside transformed groups or nested groups.
|
|
22
|
+
* @param {FabricObject} object the object you want to transform
|
|
23
|
+
* @param {TMat2D} transform the destination transform
|
|
24
|
+
*/
|
|
25
|
+
export const removeTransformFromObject = (
|
|
26
|
+
object: FabricObject,
|
|
27
|
+
transform: TMat2D
|
|
28
|
+
) => {
|
|
29
|
+
const inverted = invertTransform(transform),
|
|
30
|
+
finalTransform = multiplyTransformMatrices(
|
|
31
|
+
inverted,
|
|
32
|
+
object.calcOwnMatrix()
|
|
33
|
+
);
|
|
34
|
+
applyTransformToObject(object, finalTransform);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* given an object and a transform, apply the transform to the object.
|
|
39
|
+
* this is equivalent to change the space where the object is drawn.
|
|
40
|
+
* Adding to an object a transform that scale by 2 is like scaling it by 2.
|
|
41
|
+
* This is used when removing an object from an active selection for example.
|
|
42
|
+
* @param {FabricObject} object the object you want to transform
|
|
43
|
+
* @param {Array} transform the destination transform
|
|
44
|
+
*/
|
|
45
|
+
export const addTransformToObject = (object: FabricObject, transform: TMat2D) =>
|
|
46
|
+
applyTransformToObject(
|
|
47
|
+
object,
|
|
48
|
+
multiplyTransformMatrices(transform, object.calcOwnMatrix())
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* discard an object transform state and apply the one from the matrix.
|
|
53
|
+
* @param {FabricObject} object the object you want to transform
|
|
54
|
+
* @param {Array} transform the destination transform
|
|
55
|
+
*/
|
|
56
|
+
export const applyTransformToObject = (
|
|
57
|
+
object: FabricObject,
|
|
58
|
+
transform: TMat2D
|
|
59
|
+
) => {
|
|
60
|
+
const { translateX, translateY, scaleX, scaleY, ...otherOptions } =
|
|
61
|
+
qrDecompose(transform),
|
|
62
|
+
center = new Point(translateX, translateY);
|
|
63
|
+
object.flipX = false;
|
|
64
|
+
object.flipY = false;
|
|
65
|
+
Object.assign(object, otherOptions);
|
|
66
|
+
object.set({ scaleX, scaleY });
|
|
67
|
+
object.setPositionByOrigin(center, CENTER, CENTER);
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* reset an object transform state to neutral. Top and left are not accounted for
|
|
71
|
+
* @param {FabricObject} target object to transform
|
|
72
|
+
*/
|
|
73
|
+
export const resetObjectTransform = (target: FabricObject) => {
|
|
74
|
+
target.scaleX = 1;
|
|
75
|
+
target.scaleY = 1;
|
|
76
|
+
target.skewX = 0;
|
|
77
|
+
target.skewY = 0;
|
|
78
|
+
target.flipX = false;
|
|
79
|
+
target.flipY = false;
|
|
80
|
+
target.rotate(0);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Extract Object transform values
|
|
85
|
+
* @param {FabricObject} target object to read from
|
|
86
|
+
* @return {Object} Components of transform
|
|
87
|
+
*/
|
|
88
|
+
export const saveObjectTransform = (target: FabricObject) => ({
|
|
89
|
+
scaleX: target.scaleX,
|
|
90
|
+
scaleY: target.scaleY,
|
|
91
|
+
skewX: target.skewX,
|
|
92
|
+
skewY: target.skewY,
|
|
93
|
+
angle: target.angle,
|
|
94
|
+
left: target.left,
|
|
95
|
+
flipX: target.flipX,
|
|
96
|
+
flipY: target.flipY,
|
|
97
|
+
top: target.top,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* given a width and height, return the size of the bounding box
|
|
102
|
+
* that can contains the box with width/height with applied transform
|
|
103
|
+
* described in options.
|
|
104
|
+
* Use to calculate the boxes around objects for controls.
|
|
105
|
+
* @param {Number} width
|
|
106
|
+
* @param {Number} height
|
|
107
|
+
* @param {Object} options
|
|
108
|
+
* @param {Number} options.scaleX
|
|
109
|
+
* @param {Number} options.scaleY
|
|
110
|
+
* @param {Number} options.skewX
|
|
111
|
+
* @param {Number} options.skewY
|
|
112
|
+
* @returns {Point} size
|
|
113
|
+
*/
|
|
114
|
+
export const sizeAfterTransform = (
|
|
115
|
+
width: number,
|
|
116
|
+
height: number,
|
|
117
|
+
options: TScaleMatrixArgs
|
|
118
|
+
) => {
|
|
119
|
+
const dimX = width / 2,
|
|
120
|
+
dimY = height / 2,
|
|
121
|
+
transformMatrix = calcDimensionsMatrix(options),
|
|
122
|
+
points = [
|
|
123
|
+
new Point(-dimX, -dimY),
|
|
124
|
+
new Point(dimX, -dimY),
|
|
125
|
+
new Point(-dimX, dimY),
|
|
126
|
+
new Point(dimX, dimY),
|
|
127
|
+
].map((p) => p.transform(transformMatrix)),
|
|
128
|
+
bbox = makeBoundingBoxFromPoints(points);
|
|
129
|
+
return new Point(bbox.width, bbox.height);
|
|
130
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Populates an object with properties of another object
|
|
3
|
+
* @param {Object} source Source object
|
|
4
|
+
* @param {string[]} properties Properties names to include
|
|
5
|
+
* @returns object populated with the picked keys
|
|
6
|
+
*/
|
|
7
|
+
export const pick = <T extends Record<string, any>>(
|
|
8
|
+
source: T,
|
|
9
|
+
keys: (keyof T)[] = []
|
|
10
|
+
) => {
|
|
11
|
+
return keys.reduce((o, key) => {
|
|
12
|
+
if (key in source) {
|
|
13
|
+
o[key] = source[key];
|
|
14
|
+
}
|
|
15
|
+
return o;
|
|
16
|
+
}, {} as Partial<T>);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const pickBy = <T extends Record<string, any>>(
|
|
20
|
+
source: T,
|
|
21
|
+
predicate: <K extends keyof T>(value: T[K], key: K, collection: T) => boolean
|
|
22
|
+
) => {
|
|
23
|
+
return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {
|
|
24
|
+
if (predicate(source[key], key, source)) {
|
|
25
|
+
o[key] = source[key];
|
|
26
|
+
}
|
|
27
|
+
return o;
|
|
28
|
+
}, {} as Partial<T>);
|
|
29
|
+
};
|