Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BREAKING: remove object type in favor of Class.name #8714

Merged
merged 31 commits into from
Mar 4, 2023
Merged

Conversation

ShaMan123
Copy link
Contributor

@ShaMan123 ShaMan123 commented Feb 20, 2023

Motivation

No values on prototype, continues the default value effort

Description

removed type since it was a readonly static property

Changes

  • registered FabricObject in class registry. Only to base fabric object was registered

BREAKING:

  • removed type from all objects/filters. Use instanceof or isType instead
  • isType will not work for old types, you must pass the class name, that is why instanceof is the recommended migration path

Gist

In Action

a step forward for default values
@github-actions
Copy link
Contributor

github-actions bot commented Feb 20, 2023

Build Stats

file / KB (diff) bundled minified
fabric 891.840 (+0.405) 304.612 (+0.101)

@ShaMan123 ShaMan123 requested a review from asturur February 20, 2023 06:00
@ShaMan123 ShaMan123 changed the title refactor(): static object type BREAKING: static object type Feb 20, 2023
@ShaMan123 ShaMan123 changed the title BREAKING: static object type BREAKING: static object/filter type Feb 20, 2023
@github-actions
Copy link
Contributor

github-actions bot commented Feb 20, 2023

Coverage after merging static-type into master will be

83.17%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts7.69%100%0%14.29%17, 20, 23, 29, 32, 35
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.68%94.64%86.67%97.06%100, 103, 206–207, 232–233
   CommonMethods.ts100%100%100%100%
   Intersection.ts100%100%100%100%
   Observable.ts87.23%85.29%84.62%89.36%144–145, 170–171, 39–40, 48, 57, 91, 99
   Pattern.ts93.33%94.29%90%93.33%138, 149, 158, 51
   Point.ts100%100%100%100%
   Shadow.ts98.51%96%100%100%168
   cache.ts97.06%90%100%100%56
   config.ts75%64.29%66.67%82.76%138, 138, 138, 138, 138–140, 151–153
   constants.ts100%100%100%100%
   typedefs.ts100%100%100%100%
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%100, 102–104, 113, 113, 113, 115, 117, 119–121, 123–126, 133–134, 141, 143, 28–29, 37–41, 45–49, 56–59, 67–71, 73, 81, 81, 81, 81, 81–82, 84, 84, 84–87, 89, 97–98
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.01%82.35%100%93.75%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%100–101, 103–104, 112, 112, 112, 112, 112–113, 115–116, 123–124, 126, 128–132, 141, 145–146, 146, 154, 154, 154–157, 159–162, 166–167, 169, 171–174, 177, 184–185, 187, 189–190, 192, 199–200, 202–203, 206, 206, 213, 213, 217, 22–23, 25–27, 27, 27–29, 33, 42, 49, 56, 63, 70, 89–91, 99
src/canvas
   Canvas.ts78.93%77.41%81.67%79.60%1000, 1000, 1000–1002, 1004–1005, 1005, 1005, 1007, 1015, 1015, 1015–1017, 1017, 1017, 1023–1024, 1032–1033, 1033, 1033–1034, 1039, 1041, 1072–1074, 1077–1078, 1082–1083, 1197–1199, 1202–1203, 1276, 1396, 1519, 1589, 161, 186, 295–296, 299–303, 308, 331–332, 337–342, 36, 362, 362, 362–363, 363, 363–364, 372, 377–378, 378, 378–379, 381, 390, 396–397, 397, 397, 40, 440, 448, 452, 452, 452–453, 455, 537–538, 538, 538–539, 545, 545, 545–547, 567, 569, 569, 569–570, 570, 570, 573, 573, 573–574, 577, 586–587, 589–590, 592, 592–593, 595–596, 608–609, 609, 609–610, 612–616, 622, 629, 669, 669, 669, 671, 673–677, 683, 689, 689, 689–690, 692, 695, 700, 713, 740, 740, 798–799, 799, 799–800, 802, 805–806, 806, 806–807, 809–810, 813, 813–815, 818–819, 889, 901, 908, 929, 961, 982–983, 999
   SelectableCanvas.ts94.54%91.63%94.44%96.61%1138, 1138–1139, 1142, 1162, 1162, 1221, 1271–1272, 1293, 1301, 1426, 1428, 1430–1431, 717–718, 720–721, 721, 721, 770–771, 832–833, 886–888, 920, 925–926, 953–954
   StaticCanvas.ts95.98%91.29%100%97.93%1112–1113, 1113, 1113–1114, 1234, 1244, 1298–1299, 1302, 1337–1338, 1415, 1424, 1424, 1428, 1428, 1475–1476, 1690–1691, 311–312, 329, 409–410, 412–413, 774, 786–787, 872
   TextEditingManager.ts100%100%100%100%
src/color
   Color.ts92.16%86.49%100%94.29%330–331, 335–336, 339–340, 58, 88–89, 89, 91, 91, 91–92, 94–95
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts100%100%100%100%
src/controls
   Control.ts93.90%88.89%90.91%97.73%235, 319, 319, 354
   changeWidth.ts100%100%100%100%
   commonControls.ts87.50%100%66.67%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   defaultControls.ts77.78%66.67%100%100%10, 17
   drag.ts100%100%100%100%
   polyControl.ts6.15%0%0%11.11%100, 105, 119, 119, 119, 121–124, 124, 127, 134, 17, 25–28, 30, 30, 30, 30, 30, 30, 30, 30, 50–56, 56, 56, 56, 56, 58, 63–64, 66, 76, 82–83, 83, 83–84, 88–90, 90, 90, 90, 90, 92
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59, 59, 59, 59, 59–61, 61, 61–63, 65, 65, 65–67, 67, 67–68, 73, 73, 73–74, 76, 78, 80–81
   scale.ts93.49%92.77%100%93.67%129–130, 132–134, 148–149, 181–183, 42
   scaleSkew.ts78.79%64.29%100%85.71%27, 29, 29, 29, 31, 33, 35
   skew.ts91.03%79.31%100%97.67%130–131, 162–163, 170, 176, 178
   util.ts100%100%100%100%
   wrapWithFireEvent.ts100%100%100%100%
   wrapWithFixedAnchor.ts100%100%100%100%
src/env
   browser.ts84.21%77.78%50%100%14, 17
   index.ts91.67%50%100%100%20
   node.ts76.92%50%66.67%88.24%27, 31–32, 32, 32
src/filters
   BaseFilter.ts21.51%22.81%32%18.27%106–109, 109, 109–110, 116, 116, 116–119, 137, 155, 169–174, 178–179, 179, 179–182, 182,

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ready
IMO most of filters fromObject can be move to the base class

Comment on lines 13 to 15
getType() {
return super.getType();
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TS complains since protected methods can't be in a mixin so I made it public

@asturur
Copy link
Member

asturur commented Feb 20, 2023

For 6.0 we will keep type as it is, a value like the others, we just deprecate it. It will go wherever all other defaults go.
Is not worth to make a special case for it

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated from master

@ShaMan123 ShaMan123 changed the title BREAKING: static object/filter type BREAKING: remove object/filter type in favor of Class.name Feb 28, 2023
Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reverted changes made to filters


I want to remove isType as well
The reason is that logic like isActiveSelection or isTextObject (and more from src/util/types.ts) is not good enough anymore in case of an app subclassing these classes. It will fail the check, instanceof is the migration path.

@ShaMan123
Copy link
Contributor Author

@asturur I want your feed back on this when you are done with filters

@ShaMan123
Copy link
Contributor Author

ShaMan123 commented Feb 28, 2023

The solution I can think about that doesn't involve instanceof (or its hacks I suggested by creating dummy superclasses just for the sake of the test) is using the classRegistry... which is not bad actually
or doing what you did and adding a get for type on the object

@asturur
Copy link
Member

asturur commented Feb 28, 2023

we are not removing type nor chaning its value.
We will have a plan to deprecate it that doens't break developers data.
Going to slim down the breaking changes here in some way. i ll assign to me.

@asturur asturur self-assigned this Feb 28, 2023
@ShaMan123
Copy link
Contributor Author

We will have a plan to deprecate it that doens't break developers data.

It doesn't.
It beaks isType and b416b55

@ShaMan123
Copy link
Contributor Author

I registered IText for example in classRegistry under 2 names, IText and i-text so it is backward compatible

@ShaMan123
Copy link
Contributor Author

exposing a getter as you did is a good option non the less

@asturur
Copy link
Member

asturur commented Feb 28, 2023

yes is what i m doing, adding a getter for type and adding a test to verify old data works.
also isType needs to work for both old and new names for now

@ShaMan123
Copy link
Contributor Author

I added tests in the class registry tests, take a look there

@asturur
Copy link
Member

asturur commented Feb 28, 2023

@ShaMan123 looking at:
e1a6734

I did some things:

  • added a get type / set type for compatibility with old code
  • let go of the new name of Object that can be FabricObject
  • add warnings about setting type, and should add a warning when developer access it
  • keep isType compatibility with both old and new names ( we should put a warning that for now is case-insensitive )

Now before i change the tests from Object to FabricObject i want to hear your thoughts on the changes.
Then i need to write a compatibility test for old data

this[SVG].set(
SVGTagName ?? classConstructor.name.toLowerCase(),
classConstructor
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

svg is always lowercase

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point

if (types.length === 0) {
return [...this._objects];
}
return this._objects.filter((o) => types.includes(o.type));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure why this was deleted? also needs the lowercase/uppercase here too

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use isType instead

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return this._objects.filter((o) => types.includes(o.type));
return this._objects.filter((o) => o.isType(...types));

Copy link
Contributor Author

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest we define type as following:

Object.defineProperty(this, 'type', {
      enumerable: false,
      // so we can define in subclass
      configurable: true,
      writable: false,
      value: 'i-text',
    });

this way trying to write over it will throw an error so all is good. The dev sees it and can easily migrate AND it is hidden from TS so TS will warn about it as well

@asturur
Copy link
Member

asturur commented Feb 28, 2023

I suggest we define type as following:

Object.defineProperty(this, 'type', {
      enumerable: false,
      // so we can define in subclass
      configurable: true,
      writable: false,
      value: 'i-text',
    });

this way trying to write over it will throw an error so all is good. The dev sees it and can easily migrate AND it is hidden from TS so TS will warn about it as well

What is wrong with the setter? i could not add the setter and we would get the error, but the error is exactly what i don't want because today the property is writable
There is the warning on purpose.

@ShaMan123
Copy link
Contributor Author

I don't mind.
It is a difference in approach. I view breaking changes as fine as long as they are not silent, cause then they are deadly and consume days. If everything crashes and points me to the right line I am more than content.

@asturur
Copy link
Member

asturur commented Mar 4, 2023

I don't mind. It is a difference in approach. I view breaking changes as fine as long as they are not silent, cause then they are deadly and consume days. If everything crashes and points me to the right line I am more than content.

Breaking change we have a tons, so for now we are not adding more.

@asturur asturur merged commit 67904b7 into master Mar 4, 2023
@asturur asturur deleted the static-type branch March 4, 2023 23:12
@@ -54,7 +52,7 @@ export class Pattern {
}

set type(value) {
console.warn('Setting type has no effect', value)
console.warn('Setting type has no effect', value);
Copy link
Contributor Author

@ShaMan123 ShaMan123 Mar 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I said previously, I would prefer this to throw an error.
Think of an app that for some strange reason changes type. That app is now broken and the only indication is the console.
For the sake of discussion. The app that did that strange thing should pay the cost somehow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants