fabric 6.0.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/index.js +250 -101
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/dist/index.min.mjs +1 -1
  7. package/dist/index.min.mjs.map +1 -1
  8. package/dist/index.mjs +250 -101
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/index.node.cjs +250 -101
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.mjs +250 -101
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/ClassRegistry.d.ts +1 -0
  17. package/dist/src/ClassRegistry.d.ts.map +1 -1
  18. package/dist/src/ClassRegistry.min.mjs +1 -1
  19. package/dist/src/ClassRegistry.min.mjs.map +1 -1
  20. package/dist/src/ClassRegistry.mjs +3 -0
  21. package/dist/src/ClassRegistry.mjs.map +1 -1
  22. package/dist/src/Collection.d.ts +3 -3
  23. package/dist/src/Collection.d.ts.map +1 -1
  24. package/dist/src/EventTypeDefs.d.ts +19 -11
  25. package/dist/src/EventTypeDefs.d.ts.map +1 -1
  26. package/dist/src/LayoutManager/LayoutManager.d.ts.map +1 -1
  27. package/dist/src/LayoutManager/LayoutManager.min.mjs +1 -1
  28. package/dist/src/LayoutManager/LayoutManager.min.mjs.map +1 -1
  29. package/dist/src/LayoutManager/LayoutManager.mjs +2 -2
  30. package/dist/src/LayoutManager/LayoutManager.mjs.map +1 -1
  31. package/dist/src/Shadow.d.ts.map +1 -1
  32. package/dist/src/Shadow.min.mjs +1 -1
  33. package/dist/src/Shadow.min.mjs.map +1 -1
  34. package/dist/src/Shadow.mjs +1 -5
  35. package/dist/src/Shadow.mjs.map +1 -1
  36. package/dist/src/canvas/DOMManagers/util.d.ts.map +1 -1
  37. package/dist/src/canvas/DOMManagers/util.min.mjs +1 -1
  38. package/dist/src/canvas/DOMManagers/util.min.mjs.map +1 -1
  39. package/dist/src/canvas/DOMManagers/util.mjs +9 -15
  40. package/dist/src/canvas/DOMManagers/util.mjs.map +1 -1
  41. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  42. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  43. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  44. package/dist/src/canvas/SelectableCanvas.mjs +3 -0
  45. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  46. package/dist/src/canvas/StaticCanvas.d.ts +20 -24
  47. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  48. package/dist/src/color/util.d.ts.map +1 -1
  49. package/dist/src/constants.d.ts +1 -0
  50. package/dist/src/constants.d.ts.map +1 -1
  51. package/dist/src/constants.min.mjs +1 -1
  52. package/dist/src/constants.min.mjs.map +1 -1
  53. package/dist/src/constants.mjs +2 -1
  54. package/dist/src/constants.mjs.map +1 -1
  55. package/dist/src/controls/controlRendering.d.ts +1 -1
  56. package/dist/src/controls/controlRendering.d.ts.map +1 -1
  57. package/dist/src/controls/controlRendering.min.mjs.map +1 -1
  58. package/dist/src/controls/controlRendering.mjs.map +1 -1
  59. package/dist/src/controls/fireEvent.d.ts +2 -2
  60. package/dist/src/controls/fireEvent.d.ts.map +1 -1
  61. package/dist/src/controls/fireEvent.min.mjs.map +1 -1
  62. package/dist/src/controls/fireEvent.mjs.map +1 -1
  63. package/dist/src/controls/index.d.ts +1 -0
  64. package/dist/src/controls/index.d.ts.map +1 -1
  65. package/dist/src/controls/index.min.mjs +1 -1
  66. package/dist/src/controls/index.mjs +1 -0
  67. package/dist/src/controls/index.mjs.map +1 -1
  68. package/dist/src/controls/pathControl.d.ts +12 -0
  69. package/dist/src/controls/pathControl.d.ts.map +1 -0
  70. package/dist/src/controls/pathControl.min.mjs +2 -0
  71. package/dist/src/controls/pathControl.min.mjs.map +1 -0
  72. package/dist/src/controls/pathControl.mjs +156 -0
  73. package/dist/src/controls/pathControl.mjs.map +1 -0
  74. package/dist/src/controls/polyControl.d.ts.map +1 -1
  75. package/dist/src/controls/polyControl.min.mjs +1 -1
  76. package/dist/src/controls/polyControl.min.mjs.map +1 -1
  77. package/dist/src/controls/polyControl.mjs +1 -9
  78. package/dist/src/controls/polyControl.mjs.map +1 -1
  79. package/dist/src/controls/util.d.ts +1 -1
  80. package/dist/src/controls/wrapWithFireEvent.d.ts +5 -3
  81. package/dist/src/controls/wrapWithFireEvent.d.ts.map +1 -1
  82. package/dist/src/controls/wrapWithFireEvent.min.mjs +1 -1
  83. package/dist/src/controls/wrapWithFireEvent.min.mjs.map +1 -1
  84. package/dist/src/controls/wrapWithFireEvent.mjs +7 -4
  85. package/dist/src/controls/wrapWithFireEvent.mjs.map +1 -1
  86. package/dist/src/controls/wrapWithFixedAnchor.d.ts.map +1 -1
  87. package/dist/src/env/index.d.ts.map +1 -1
  88. package/dist/src/env/node.d.ts.map +1 -1
  89. package/dist/src/filters/BaseFilter.d.ts.map +1 -1
  90. package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
  91. package/dist/src/filters/BaseFilter.mjs +0 -1
  92. package/dist/src/filters/BaseFilter.mjs.map +1 -1
  93. package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
  94. package/dist/src/filters/ColorMatrixFilters.d.ts +8 -96
  95. package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
  96. package/dist/src/filters/Convolute.d.ts +2 -1
  97. package/dist/src/filters/Convolute.d.ts.map +1 -1
  98. package/dist/src/filters/shaders/baseFilter.d.ts +1 -1
  99. package/dist/src/filters/shaders/baseFilter.d.ts.map +1 -1
  100. package/dist/src/filters/utils.d.ts.map +1 -1
  101. package/dist/src/parser/normalizeAttr.d.ts.map +1 -1
  102. package/dist/src/parser/parseStyleString.d.ts.map +1 -1
  103. package/dist/src/parser/parseStyleString.min.mjs +1 -1
  104. package/dist/src/parser/parseStyleString.min.mjs.map +1 -1
  105. package/dist/src/parser/parseStyleString.mjs +1 -0
  106. package/dist/src/parser/parseStyleString.mjs.map +1 -1
  107. package/dist/src/parser/parseUseDirectives.d.ts.map +1 -1
  108. package/dist/src/parser/parseUseDirectives.min.mjs +1 -1
  109. package/dist/src/parser/parseUseDirectives.min.mjs.map +1 -1
  110. package/dist/src/parser/parseUseDirectives.mjs +61 -43
  111. package/dist/src/parser/parseUseDirectives.mjs.map +1 -1
  112. package/dist/src/shapes/Group.d.ts +20 -20
  113. package/dist/src/shapes/Group.d.ts.map +1 -1
  114. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -1
  115. package/dist/src/shapes/IText/ITextBehavior.d.ts.map +1 -1
  116. package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
  117. package/dist/src/shapes/IText/ITextBehavior.mjs +0 -1
  118. package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
  119. package/dist/src/shapes/Image.d.ts.map +1 -1
  120. package/dist/src/shapes/Image.min.mjs.map +1 -1
  121. package/dist/src/shapes/Image.mjs +0 -2
  122. package/dist/src/shapes/Image.mjs.map +1 -1
  123. package/dist/src/shapes/Path.d.ts +9 -9
  124. package/dist/src/shapes/Path.d.ts.map +1 -1
  125. package/dist/src/shapes/Polyline.d.ts +1 -1
  126. package/dist/src/shapes/Rect.d.ts +1 -1
  127. package/dist/src/shapes/Text/Text.d.ts +1 -1
  128. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  129. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  130. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  131. package/dist/src/shapes/Text/TextSVGExportMixin.mjs +0 -2
  132. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  133. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  134. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  135. package/dist/src/shapes/Textbox.mjs +0 -2
  136. package/dist/src/shapes/Textbox.mjs.map +1 -1
  137. package/dist/src/util/applyMixins.d.ts.map +1 -1
  138. package/dist/src/util/dom_misc.d.ts.map +1 -1
  139. package/dist/src/util/dom_misc.min.mjs +1 -1
  140. package/dist/src/util/dom_misc.min.mjs.map +1 -1
  141. package/dist/src/util/dom_misc.mjs +7 -9
  142. package/dist/src/util/dom_misc.mjs.map +1 -1
  143. package/dist/src/util/internals/cloneDeep.d.ts.map +1 -1
  144. package/dist/src/util/internals/console.d.ts +1 -1
  145. package/dist/src/util/internals/findRight.d.ts.map +1 -1
  146. package/dist/src/util/internals/removeFromArray.d.ts.map +1 -1
  147. package/dist/src/util/misc/dom.d.ts.map +1 -1
  148. package/dist/src/util/misc/groupSVGElements.d.ts.map +1 -1
  149. package/dist/src/util/misc/matrix.d.ts.map +1 -1
  150. package/dist/src/util/misc/objectEnlive.d.ts +1 -1
  151. package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
  152. package/dist/src/util/misc/objectEnlive.min.mjs +1 -1
  153. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  154. package/dist/src/util/misc/objectEnlive.mjs +7 -11
  155. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  156. package/dist/src/util/misc/objectTransforms.d.ts.map +1 -1
  157. package/dist/src/util/misc/pick.d.ts.map +1 -1
  158. package/dist/src/util/misc/planeChange.d.ts.map +1 -1
  159. package/dist/src/util/misc/svgParsing.d.ts.map +1 -1
  160. package/dist/src/util/misc/textStyles.d.ts.map +1 -1
  161. package/dist/src/util/path/index.d.ts +0 -1
  162. package/dist/src/util/path/index.d.ts.map +1 -1
  163. package/dist/src/util/path/index.min.mjs +1 -1
  164. package/dist/src/util/path/index.min.mjs.map +1 -1
  165. package/dist/src/util/path/index.mjs +1 -2
  166. package/dist/src/util/path/index.mjs.map +1 -1
  167. package/dist/src/util/path/typedefs.d.ts +1 -0
  168. package/dist/src/util/path/typedefs.d.ts.map +1 -1
  169. package/dist/src/util/typeAssertions.d.ts +2 -2
  170. package/dist/src/util/typeAssertions.d.ts.map +1 -1
  171. package/lib/aligning_guidelines.js +76 -1
  172. package/lib/centering_guidelines.js +3 -1
  173. package/package.json +3 -3
  174. package/src/ClassRegistry.spec.ts +39 -0
  175. package/src/ClassRegistry.ts +4 -0
  176. package/src/EventTypeDefs.ts +22 -10
  177. package/src/LayoutManager/ActiveSelectionLayoutManager.spec.ts +1 -0
  178. package/src/LayoutManager/LayoutManager.spec.ts +1 -0
  179. package/src/LayoutManager/LayoutManager.ts +2 -0
  180. package/src/Shadow.ts +1 -6
  181. package/src/canvas/DOMManagers/util.ts +11 -15
  182. package/src/canvas/SelectableCanvas.spec.ts +18 -0
  183. package/src/canvas/SelectableCanvas.ts +3 -0
  184. package/src/constants.ts +1 -0
  185. package/src/controls/controlRendering.ts +4 -2
  186. package/src/controls/fireEvent.ts +2 -2
  187. package/src/controls/index.ts +1 -0
  188. package/src/controls/pathControl.spec.ts +75 -0
  189. package/src/controls/pathControl.ts +293 -0
  190. package/src/controls/polyControl.ts +1 -1
  191. package/src/controls/wrapWithFireEvent.ts +14 -5
  192. package/src/filters/BaseFilter.ts +1 -2
  193. package/src/parser/parseStyleString.ts +1 -0
  194. package/src/parser/parseUseDirectives.test.ts +113 -0
  195. package/src/parser/parseUseDirectives.ts +64 -58
  196. package/src/shapes/IText/ITextBehavior.ts +4 -2
  197. package/src/shapes/Image.ts +0 -2
  198. package/src/shapes/Text/TextSVGExportMixin.ts +0 -2
  199. package/src/shapes/Textbox.ts +0 -2
  200. package/src/util/dom_misc.ts +17 -10
  201. package/src/util/misc/objectEnlive.spec.ts +68 -0
  202. package/src/util/misc/objectEnlive.ts +7 -13
  203. package/src/util/path/__snapshots__/index.spec.ts.snap +327 -0
  204. package/src/util/path/index.spec.ts +13 -2
  205. package/src/util/path/index.ts +2 -4
  206. package/src/util/path/typedefs.ts +2 -0
  207. package/.gitmodules +0 -3
@@ -10,7 +10,7 @@ export function getScrollLeftTop(element: HTMLElement | null) {
10
10
  if (!element || !doc) {
11
11
  return { left, top };
12
12
  }
13
-
13
+ let elementLoop: HTMLElement | Document | ShadowRoot = element;
14
14
  const docElement = doc.documentElement,
15
15
  body = doc.body || {
16
16
  scrollLeft: 0,
@@ -20,20 +20,27 @@ export function getScrollLeftTop(element: HTMLElement | null) {
20
20
  // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,
21
21
  // but the .parentNode of a root ShadowDOM node will always be null, instead
22
22
  // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938
23
- // @ts-expect-error Set element to element parent, or 'host' in case of ShadowDOM
24
- while (element && (element.parentNode || element.host)) {
25
- // @ts-expect-error Set element to element parent, or 'host' in case of ShadowDOM
26
- element = element.parentNode || element.host;
27
- // @ts-expect-error because element is typed as HTMLElement but it can go up to document
28
- if (element === doc) {
23
+ while (
24
+ elementLoop &&
25
+ (elementLoop.parentNode || (elementLoop as unknown as ShadowRoot).host)
26
+ ) {
27
+ elementLoop = (elementLoop.parentNode ||
28
+ (elementLoop as unknown as ShadowRoot).host) as
29
+ | HTMLElement
30
+ | Document
31
+ | ShadowRoot;
32
+ if (elementLoop === doc) {
29
33
  left = body.scrollLeft || docElement.scrollLeft || 0;
30
34
  top = body.scrollTop || docElement.scrollTop || 0;
31
35
  } else {
32
- left += element!.scrollLeft || 0;
33
- top += element!.scrollTop || 0;
36
+ left += (elementLoop as HTMLElement).scrollLeft || 0;
37
+ top += (elementLoop as HTMLElement).scrollTop || 0;
34
38
  }
35
39
 
36
- if (element!.nodeType === 1 && element!.style.position === 'fixed') {
40
+ if (
41
+ elementLoop.nodeType === 1 &&
42
+ (elementLoop as HTMLElement).style.position === 'fixed'
43
+ ) {
37
44
  break;
38
45
  }
39
46
  }
@@ -0,0 +1,68 @@
1
+ import { enlivenObjects } from './objectEnlive';
2
+ import { Rect, type RectProps } from '../../shapes/Rect';
3
+ import { Shadow } from '../../Shadow';
4
+ import { classRegistry } from '../../ClassRegistry';
5
+
6
+ const mockedRectWithCustomProperty = {
7
+ type: 'rect',
8
+ width: 100,
9
+ // will become a shadow
10
+ shadow: {
11
+ type: 'shadow',
12
+ blur: 5,
13
+ },
14
+ // will become a rect
15
+ custom1: {
16
+ type: 'rect',
17
+ width: 50,
18
+ },
19
+ custom2: {
20
+ type: 'nothing',
21
+ value: 3,
22
+ },
23
+ // will become a set
24
+ custom3: {
25
+ type: 'registered',
26
+ },
27
+ };
28
+
29
+ describe('enlivenObjects', () => {
30
+ it('will enlive correctly', async () => {
31
+ const [rect] = await enlivenObjects<Rect<RectProps>>([
32
+ mockedRectWithCustomProperty,
33
+ ]);
34
+ expect(rect).toBeInstanceOf(Rect);
35
+ expect(rect.shadow).toBeInstanceOf(Shadow);
36
+ expect(rect.custom1).toBeInstanceOf(Rect);
37
+ expect(rect.custom2).toEqual({
38
+ type: 'nothing',
39
+ value: 3,
40
+ });
41
+ expect(rect.custom3).toEqual({
42
+ type: 'registered',
43
+ });
44
+ });
45
+ it('will enlive correctly newly registered props', async () => {
46
+ class Test {
47
+ declare opts: any;
48
+ constructor(opts: any) {
49
+ this.opts = opts;
50
+ }
51
+ static async fromObject(opts: any) {
52
+ return new this(opts);
53
+ }
54
+ }
55
+ classRegistry.setClass(Test, 'registered');
56
+ const [rect] = await enlivenObjects<Rect<RectProps>>([
57
+ mockedRectWithCustomProperty,
58
+ ]);
59
+ expect(rect).toBeInstanceOf(Rect);
60
+ expect(rect.shadow).toBeInstanceOf(Shadow);
61
+ expect(rect.custom1).toBeInstanceOf(Rect);
62
+ expect(rect.custom2).toEqual({
63
+ type: 'nothing',
64
+ value: 3,
65
+ });
66
+ expect(rect.custom3).toBeInstanceOf(Test);
67
+ });
68
+ });
@@ -1,5 +1,4 @@
1
1
  import { noop } from '../../constants';
2
- import type { Pattern } from '../../Pattern';
3
2
  import type { FabricObject } from '../../shapes/Object/FabricObject';
4
3
  import type {
5
4
  Abortable,
@@ -155,8 +154,13 @@ export const enlivenObjectEnlivables = <
155
154
  if (!value) {
156
155
  return value;
157
156
  }
158
- // clipPath or shadow or gradient
159
- if (value.type) {
157
+ /**
158
+ * clipPath or shadow or gradient or text on a path or a pattern,
159
+ * or the backgroundImage or overlayImage of canvas
160
+ * If we have a type and there is a classe registered for it, we enlive it.
161
+ * If there is no class registered for it we return the value as is
162
+ * */
163
+ if (value.type && classRegistry.has(value.type)) {
160
164
  return enlivenObjects<FabricObject | Shadow | TFiller>([value], {
161
165
  signal,
162
166
  }).then(([enlived]) => {
@@ -164,16 +168,6 @@ export const enlivenObjectEnlivables = <
164
168
  return enlived;
165
169
  });
166
170
  }
167
- // pattern
168
- if (value.source) {
169
- return classRegistry
170
- .getClass<typeof Pattern>('pattern')
171
- .fromObject(value, { signal })
172
- .then((pattern: Pattern) => {
173
- instances.push(pattern);
174
- return pattern;
175
- });
176
- }
177
171
  return value;
178
172
  });
179
173
  const keys = Object.keys(serializedObject);
@@ -53,3 +53,330 @@ exports[`Path Utils getPathSegmentsInfo operates as expected 1`] = `
53
53
  },
54
54
  ]
55
55
  `;
56
+
57
+ exports[`Path Utils makePathSimpler can parse paths that return NaN segments 1`] = `
58
+ [
59
+ [
60
+ "M",
61
+ 22,
62
+ 6.58,
63
+ ],
64
+ [
65
+ "C",
66
+ 21.86757184091244,
67
+ 6.561276219544052,
68
+ 21.739164165358723,
69
+ 6.520726427263932,
70
+ 21.62,
71
+ 6.46,
72
+ ],
73
+ [
74
+ "C",
75
+ 21.62,
76
+ 6.26,
77
+ 21.740000000000002,
78
+ 6.26,
79
+ 21.71,
80
+ 5.96,
81
+ ],
82
+ [
83
+ "L",
84
+ 21.71,
85
+ 5.9,
86
+ ],
87
+ [
88
+ "C",
89
+ 21.71,
90
+ 5.99,
91
+ 21.71,
92
+ 6,
93
+ 21.650000000000002,
94
+ 5.9,
95
+ ],
96
+ [
97
+ "C",
98
+ 21.590000000000003,
99
+ 5.800000000000001,
100
+ 21.55,
101
+ 5.61,
102
+ 21.580000000000002,
103
+ 5.46,
104
+ ],
105
+ [
106
+ "C",
107
+ 21.610000000000003,
108
+ 5.31,
109
+ 21.76,
110
+ 5.65,
111
+ 21.720000000000002,
112
+ 5.28,
113
+ ],
114
+ [
115
+ "C",
116
+ 21.650000000000002,
117
+ 5.28,
118
+ 21.51,
119
+ 5.08,
120
+ 21.51,
121
+ 5.28,
122
+ ],
123
+ [
124
+ "L",
125
+ 21.560000000000002,
126
+ 5.28,
127
+ ],
128
+ [
129
+ "L",
130
+ 21.560000000000002,
131
+ 5.73,
132
+ ],
133
+ [
134
+ "C",
135
+ 21.560000000000002,
136
+ 5.57,
137
+ 21.490000000000002,
138
+ 5.840000000000001,
139
+ 21.44,
140
+ 5.58,
141
+ ],
142
+ [
143
+ "C",
144
+ 21.44,
145
+ 5.53,
146
+ 21.5,
147
+ 5.53,
148
+ 21.52,
149
+ 5.49,
150
+ ],
151
+ [
152
+ "C",
153
+ 21.54,
154
+ 5.45,
155
+ 21.41,
156
+ 5.49,
157
+ 21.37,
158
+ 5.42,
159
+ ],
160
+ [
161
+ "L",
162
+ 21.43,
163
+ 5.51,
164
+ ],
165
+ [
166
+ "C",
167
+ 21.41364349396296,
168
+ 5.60927934079435,
169
+ 21.355351504565153,
170
+ 5.69671732489106,
171
+ 21.27,
172
+ 5.75,
173
+ ],
174
+ [
175
+ "L",
176
+ 21.21,
177
+ 5.75,
178
+ ],
179
+ [
180
+ "C",
181
+ 21.21,
182
+ 5.65,
183
+ 21.1,
184
+ 5.64,
185
+ 21.11,
186
+ 5.46,
187
+ ],
188
+ [
189
+ "C",
190
+ 21.119999999999997,
191
+ 5.28,
192
+ 21.18,
193
+ 5.53,
194
+ 21.16,
195
+ 5.46,
196
+ ],
197
+ [
198
+ "C",
199
+ 21.16,
200
+ 5.22,
201
+ 21.1,
202
+ 5.46,
203
+ 21.05,
204
+ 5.25,
205
+ ],
206
+ [
207
+ "C",
208
+ 21.05,
209
+ 5.4,
210
+ 21,
211
+ 5.49,
212
+ 21.05,
213
+ 5.66,
214
+ ],
215
+ [
216
+ "C",
217
+ 21,
218
+ 5.5600000000000005,
219
+ 20.98,
220
+ 5.8100000000000005,
221
+ 20.91,
222
+ 5.66,
223
+ ],
224
+ [
225
+ "C",
226
+ 20.91756710278662,
227
+ 5.699642118471354,
228
+ 20.91756710278662,
229
+ 5.740357881528646,
230
+ 20.91,
231
+ 5.78,
232
+ ],
233
+ [
234
+ "C",
235
+ 20.91,
236
+ 5.78,
237
+ 20.86,
238
+ 5.78,
239
+ 20.84,
240
+ 5.84,
241
+ ],
242
+ [
243
+ "L",
244
+ 20.84,
245
+ 5.84,
246
+ ],
247
+ [
248
+ "C",
249
+ 20.84,
250
+ 5.84,
251
+ 20.84,
252
+ 5.84,
253
+ 20.84,
254
+ 5.84,
255
+ ],
256
+ [
257
+ "C",
258
+ 20.84,
259
+ 5.84,
260
+ 20.84,
261
+ 5.63,
262
+ 20.9,
263
+ 5.49,
264
+ ],
265
+ [
266
+ "L",
267
+ 20.9,
268
+ 5.49,
269
+ ],
270
+ [
271
+ "C",
272
+ 20.9,
273
+ 5.49,
274
+ 20.959999999999997,
275
+ 5.49,
276
+ 20.9,
277
+ 5.49,
278
+ ],
279
+ [
280
+ "L",
281
+ 20.9,
282
+ 5.390000000000001,
283
+ ],
284
+ [
285
+ "C",
286
+ 20.9,
287
+ 5.120000000000001,
288
+ 20.97,
289
+ 4.8500000000000005,
290
+ 20.99,
291
+ 4.73,
292
+ ],
293
+ [
294
+ "L",
295
+ 20.99,
296
+ 4.87,
297
+ ],
298
+ [
299
+ "C",
300
+ 20.99,
301
+ 4.53,
302
+ 21.119999999999997,
303
+ 4.87,
304
+ 21.13,
305
+ 4.6,
306
+ ],
307
+ [
308
+ "C",
309
+ 21.13,
310
+ 4.6,
311
+ 21.13,
312
+ 4.67,
313
+ 21.13,
314
+ 4.68,
315
+ ],
316
+ [
317
+ "C",
318
+ 21.13,
319
+ 4.6899999999999995,
320
+ 21.13,
321
+ 4.239999999999999,
322
+ 21.27,
323
+ 4.449999999999999,
324
+ ],
325
+ [
326
+ "L",
327
+ 21.27,
328
+ 4.609999999999999,
329
+ ],
330
+ [
331
+ "C",
332
+ 21.284655737743563,
333
+ 4.503836748916477,
334
+ 21.284655737743563,
335
+ 4.396163251083522,
336
+ 21.27,
337
+ 4.289999999999999,
338
+ ],
339
+ [
340
+ "C",
341
+ 21.27,
342
+ 4.349999999999999,
343
+ 21.27,
344
+ 4.419999999999999,
345
+ 21.169999999999998,
346
+ 4.389999999999999,
347
+ ],
348
+ [
349
+ "C",
350
+ 21.16217733233167,
351
+ 4.313532879407623,
352
+ 21.16217733233167,
353
+ 4.2364671205923745,
354
+ 21.169999999999998,
355
+ 4.159999999999998,
356
+ ],
357
+ [
358
+ "L",
359
+ 21.169999999999998,
360
+ 4.159999999999998,
361
+ ],
362
+ [
363
+ "L",
364
+ 21.169999999999998,
365
+ 4.159999999999998,
366
+ ],
367
+ [
368
+ "L",
369
+ 21.169999999999998,
370
+ 4.159999999999998,
371
+ ],
372
+ [
373
+ "C",
374
+ 21.164440069923444,
375
+ 4.1403864102807,
376
+ 21.164440069923444,
377
+ 4.119613589719297,
378
+ 21.169999999999998,
379
+ 4.099999999999999,
380
+ ],
381
+ ]
382
+ `;
@@ -1,8 +1,19 @@
1
- import { getPathSegmentsInfo } from '.';
1
+ import { getPathSegmentsInfo, parsePath, makePathSimpler } from '.';
2
2
 
3
3
  describe('Path Utils', () => {
4
+ describe('makePathSimpler', () => {
5
+ test('can parse paths that return NaN segments', () => {
6
+ expect(
7
+ makePathSimpler(
8
+ parsePath(
9
+ 'M22,6.58a1.21,1.21,0,0,1-.38-.12c0-.2.12-.2.09-.5l0-.06c0,.09,0,.1-.06,0s-.1-.29-.07-.44.18.19.14-.18c-.07,0-.21-.2-.21,0h.05v.45c0-.16-.07.11-.12-.15,0-.05.06-.05.08-.09s-.11,0-.15-.07l.06.09a.35.35,0,0,1-.16.24h-.06c0-.1-.11-.11-.1-.29s.07.07.05,0c0-.24-.06,0-.11-.21,0,.15-.05.24,0,.41-.05-.1-.07.15-.14,0a.32.32,0,0,1,0,.12s-.05,0-.07.06l0,0s0,0,0,0,0-.21.06-.35h0s.06,0,0,0l0-.1c0-.27.07-.54.09-.66v.14c0-.34.13,0,.14-.27,0,0,0,.07,0,.08s0-.44.14-.23l0,.16a1.17,1.17,0,0,0,0-.32c0,.06,0,.13-.1.1a1.13,1.13,0,0,1,0-.23l0,0v0l0,0a.11.11,0,0,0,0,0,.11.11,0,0,1,0-.06'
10
+ )
11
+ )
12
+ ).toMatchSnapshot();
13
+ });
14
+ });
4
15
  describe('getPathSegmentsInfo', () => {
5
- it('operates as expected', () => {
16
+ test('operates as expected', () => {
6
17
  const data = getPathSegmentsInfo([
7
18
  ['M', 50, 50],
8
19
  ['Q', 50, 50, 75, 75],
@@ -10,7 +10,6 @@ import type {
10
10
  TCurveInfo,
11
11
  TComplexPathData,
12
12
  TParsedAbsoluteCubicCurveCommand,
13
- TParsedCubicCurveCommand,
14
13
  TPathSegmentInfo,
15
14
  TPointAngle,
16
15
  TSimpleParsedCommand,
@@ -60,7 +59,7 @@ const segmentToBezier = (
60
59
  mT: number,
61
60
  fromX: number,
62
61
  fromY: number
63
- ): TParsedCubicCurveCommand => {
62
+ ): TParsedAbsoluteCubicCurveCommand => {
64
63
  const costh1 = cos(theta1),
65
64
  sinth1 = sin(theta1),
66
65
  costh2 = cos(theta2),
@@ -145,7 +144,7 @@ const arcToSegments = (
145
144
 
146
145
  // Convert into cubic bezier segments <= 90deg
147
146
  const segments = Math.ceil(Math.abs((dtheta / PI) * 2)),
148
- result = new Array(segments),
147
+ result = [],
149
148
  mDelta = dtheta / segments,
150
149
  mT =
151
150
  ((8 / 3) * Math.sin(mDelta / 4) * Math.sin(mDelta / 4)) /
@@ -842,7 +841,6 @@ const rePathCmd = new RegExp(rePathCommand, 'i');
842
841
  * ['Q', 3, 5, 2, 1, 4, 0],
843
842
  * ['Q', 9, 12, 2, 1, 4, 0],
844
843
  * ];
845
- *
846
844
  */
847
845
  export const parsePath = (pathString: string): TComplexPathData => {
848
846
  // clean the string
@@ -294,6 +294,8 @@ export type TSimpleParsedCommand =
294
294
  | TParsedAbsoluteCubicCurveCommand
295
295
  | TParsedAbsoluteQuadraticCurveCommand;
296
296
 
297
+ export type TSimpleParseCommandType = 'L' | 'M' | 'C' | 'Q' | 'Z';
298
+
297
299
  /**
298
300
  * A series of simple paths
299
301
  */
package/.gitmodules DELETED
@@ -1,3 +0,0 @@
1
- [submodule "website"]
2
- path = website
3
- url = https://github.com/fabricjs/fabricjs.github.io