From ea971f709807c1238adc3697f103f0978064f41c Mon Sep 17 00:00:00 2001 From: Daniel Seibel Silva Date: Wed, 6 May 2020 17:26:12 -0300 Subject: [PATCH] fix(core): inheritance delegate ctor regex updated to work on minified code (#36962) If one component Parent inherit another component Base like the following: @Component(...) class Base { constructor(@Inject(InjectionToken) injector: Injector) { } } @Component(...) class Parent extends Base { // no constructor } When creating Component Parent, the dependency injection should work on delegating ctors like above. The code Parent code above will be compiled into something like: class Parent extends Base { constructor() { super(...arguments); } } The angular core isDelegateCtor function will identify the delegation ctor to the base class. But when the code above is minified (using terser), the minified code will compress the spaces, resulting in something like: class Parent extends Base{constructor(){super(...arguments)}} The regex will stop working, since it wasn't aware of this case. So this fix will allow this to work in minified code cases. PR Close #36962 --- .../core/src/reflection/reflection_capabilities.ts | 2 +- packages/core/test/reflection/reflector_spec.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/core/src/reflection/reflection_capabilities.ts b/packages/core/src/reflection/reflection_capabilities.ts index 32a5112659..634a4b48b9 100644 --- a/packages/core/src/reflection/reflection_capabilities.ts +++ b/packages/core/src/reflection/reflection_capabilities.ts @@ -25,7 +25,7 @@ export const INHERITED_CLASS = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/; export const INHERITED_CLASS_WITH_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/; export const INHERITED_CLASS_WITH_DELEGATE_CTOR = - /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{\s+super\(\.\.\.arguments\)/; + /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{\s*super\(\.\.\.arguments\)/; /** * Determine whether a stringified type is a class which delegates its constructor diff --git a/packages/core/test/reflection/reflector_spec.ts b/packages/core/test/reflection/reflector_spec.ts index 90a008238f..554496463d 100644 --- a/packages/core/test/reflection/reflector_spec.ts +++ b/packages/core/test/reflection/reflector_spec.ts @@ -201,6 +201,18 @@ class TestObj { expect(isDelegateCtor(ChildWithCtor.toString())).toBe(false); }); + it('should support ES2015 classes when minified', () => { + // These classes are ES2015 in minified form + const ChildNoCtorMinified = 'class ChildNoCtor extends Parent{}'; + const ChildWithCtorMinified = 'class ChildWithCtor extends Parent{constructor(){super()}}'; + const ChildNoCtorPrivatePropsMinified = + 'class ChildNoCtorPrivateProps extends Parent{constructor(){super(...arguments);this.x=10}}'; + + expect(isDelegateCtor(ChildNoCtorMinified)).toBe(true); + expect(isDelegateCtor(ChildNoCtorPrivatePropsMinified)).toBe(true); + expect(isDelegateCtor(ChildWithCtorMinified)).toBe(false); + }); + it('should not throw when no prototype on type', () => { // Cannot test arrow function here due to the compilation const dummyArrowFn = function() {};