@elementor/editor-canvas 4.2.0-923 → 4.2.0-924

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/dist/index.js CHANGED
@@ -3734,22 +3734,29 @@ function registerModelExtensions(type, extensions) {
3734
3734
  }
3735
3735
  function registerElementType(type, elementTypeGenerator) {
3736
3736
  elementsLegacyTypes[type] = elementTypeGenerator;
3737
+ if ((0, import_editor_v1_adapters14.__privateIsReady)()) {
3738
+ registerElementInLegacyManager(type, createDomRenderer());
3739
+ }
3737
3740
  }
3738
3741
  function initLegacyViews() {
3739
3742
  (0, import_editor_v1_adapters14.__privateListenTo)((0, import_editor_v1_adapters14.v1ReadyEvent)(), () => {
3740
3743
  const widgetsCache = (0, import_editor_elements10.getWidgetsCache)() ?? {};
3741
- const legacyWindow = window;
3742
3744
  const renderer = createDomRenderer();
3743
3745
  registerProPromotionTypes(widgetsCache);
3744
- Object.entries(widgetsCache).forEach(([type, element]) => {
3745
- if (!element.atomic) {
3746
- return;
3747
- }
3748
- const ResolvedElementType = resolveElementType(type, renderer, element);
3749
- tryRegisterElement(legacyWindow, type, element, ResolvedElementType);
3746
+ Object.keys(widgetsCache).forEach((type) => {
3747
+ registerElementInLegacyManager(type, renderer);
3750
3748
  });
3751
3749
  });
3752
3750
  }
3751
+ function registerElementInLegacyManager(type, renderer) {
3752
+ const element = ((0, import_editor_elements10.getWidgetsCache)() ?? {})[type];
3753
+ if (!element?.atomic) {
3754
+ return;
3755
+ }
3756
+ const legacyWindow = window;
3757
+ const ResolvedElementType = resolveElementType(type, renderer, element);
3758
+ tryRegisterElement(legacyWindow, type, element, ResolvedElementType);
3759
+ }
3753
3760
  function registerProPromotionTypes(widgetsCache) {
3754
3761
  Object.entries(widgetsCache).forEach(([type, element]) => {
3755
3762
  if (element.meta?.is_pro_promotion) {
package/dist/index.mjs CHANGED
@@ -2397,7 +2397,7 @@ function initStyleTransformers() {
2397
2397
 
2398
2398
  // src/legacy/init-legacy-views.ts
2399
2399
  import { getWidgetsCache as getWidgetsCache3 } from "@elementor/editor-elements";
2400
- import { __privateListenTo, v1ReadyEvent as v1ReadyEvent2 } from "@elementor/editor-v1-adapters";
2400
+ import { __privateIsReady as isV1Ready, __privateListenTo, v1ReadyEvent as v1ReadyEvent2 } from "@elementor/editor-v1-adapters";
2401
2401
 
2402
2402
  // src/renderers/create-dom-renderer.ts
2403
2403
  import { createArrayLoader, createEnvironment } from "@elementor/twing";
@@ -3698,22 +3698,29 @@ function registerModelExtensions(type, extensions) {
3698
3698
  }
3699
3699
  function registerElementType(type, elementTypeGenerator) {
3700
3700
  elementsLegacyTypes[type] = elementTypeGenerator;
3701
+ if (isV1Ready()) {
3702
+ registerElementInLegacyManager(type, createDomRenderer());
3703
+ }
3701
3704
  }
3702
3705
  function initLegacyViews() {
3703
3706
  __privateListenTo(v1ReadyEvent2(), () => {
3704
3707
  const widgetsCache = getWidgetsCache3() ?? {};
3705
- const legacyWindow = window;
3706
3708
  const renderer = createDomRenderer();
3707
3709
  registerProPromotionTypes(widgetsCache);
3708
- Object.entries(widgetsCache).forEach(([type, element]) => {
3709
- if (!element.atomic) {
3710
- return;
3711
- }
3712
- const ResolvedElementType = resolveElementType(type, renderer, element);
3713
- tryRegisterElement(legacyWindow, type, element, ResolvedElementType);
3710
+ Object.keys(widgetsCache).forEach((type) => {
3711
+ registerElementInLegacyManager(type, renderer);
3714
3712
  });
3715
3713
  });
3716
3714
  }
3715
+ function registerElementInLegacyManager(type, renderer) {
3716
+ const element = (getWidgetsCache3() ?? {})[type];
3717
+ if (!element?.atomic) {
3718
+ return;
3719
+ }
3720
+ const legacyWindow = window;
3721
+ const ResolvedElementType = resolveElementType(type, renderer, element);
3722
+ tryRegisterElement(legacyWindow, type, element, ResolvedElementType);
3723
+ }
3717
3724
  function registerProPromotionTypes(widgetsCache) {
3718
3725
  Object.entries(widgetsCache).forEach(([type, element]) => {
3719
3726
  if (element.meta?.is_pro_promotion) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-canvas",
3
3
  "description": "Elementor Editor Canvas",
4
- "version": "4.2.0-923",
4
+ "version": "4.2.0-924",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -37,25 +37,25 @@
37
37
  "react-dom": "^18.3.1"
38
38
  },
39
39
  "dependencies": {
40
- "@elementor/editor": "4.2.0-923",
40
+ "@elementor/editor": "4.2.0-924",
41
41
  "dompurify": "^3.2.6",
42
- "@elementor/editor-controls": "4.2.0-923",
43
- "@elementor/editor-documents": "4.2.0-923",
44
- "@elementor/editor-elements": "4.2.0-923",
45
- "@elementor/editor-interactions": "4.2.0-923",
46
- "@elementor/editor-mcp": "4.2.0-923",
47
- "@elementor/editor-notifications": "4.2.0-923",
48
- "@elementor/editor-props": "4.2.0-923",
49
- "@elementor/editor-responsive": "4.2.0-923",
50
- "@elementor/editor-styles": "4.2.0-923",
51
- "@elementor/editor-styles-repository": "4.2.0-923",
52
- "@elementor/editor-ui": "4.2.0-923",
53
- "@elementor/editor-v1-adapters": "4.2.0-923",
54
- "@elementor/schema": "4.2.0-923",
55
- "@elementor/twing": "4.2.0-923",
42
+ "@elementor/editor-controls": "4.2.0-924",
43
+ "@elementor/editor-documents": "4.2.0-924",
44
+ "@elementor/editor-elements": "4.2.0-924",
45
+ "@elementor/editor-interactions": "4.2.0-924",
46
+ "@elementor/editor-mcp": "4.2.0-924",
47
+ "@elementor/editor-notifications": "4.2.0-924",
48
+ "@elementor/editor-props": "4.2.0-924",
49
+ "@elementor/editor-responsive": "4.2.0-924",
50
+ "@elementor/editor-styles": "4.2.0-924",
51
+ "@elementor/editor-styles-repository": "4.2.0-924",
52
+ "@elementor/editor-ui": "4.2.0-924",
53
+ "@elementor/editor-v1-adapters": "4.2.0-924",
54
+ "@elementor/schema": "4.2.0-924",
55
+ "@elementor/twing": "4.2.0-924",
56
56
  "@elementor/ui": "1.37.5",
57
- "@elementor/utils": "4.2.0-923",
58
- "@elementor/wp-media": "4.2.0-923",
57
+ "@elementor/utils": "4.2.0-924",
58
+ "@elementor/wp-media": "4.2.0-924",
59
59
  "@floating-ui/react": "^0.27.5",
60
60
  "@wordpress/i18n": "^5.13.0"
61
61
  },
@@ -0,0 +1,66 @@
1
+ import { mockLegacyElementor } from 'test-utils';
2
+ import { getWidgetsCache } from '@elementor/editor-elements';
3
+
4
+ import { createTemplatedElementType } from '../create-templated-element-type';
5
+ import { initLegacyViews, registerElementType } from '../init-legacy-views';
6
+ import type { LegacyWindow } from '../types';
7
+
8
+ jest.mock( '@elementor/editor-elements', () => ( {
9
+ getWidgetsCache: jest.fn(),
10
+ } ) );
11
+
12
+ jest.mock( '../../renderers/create-dom-renderer', () => ( {
13
+ createDomRenderer: jest.fn( () => ( {
14
+ register: jest.fn(),
15
+ render: jest.fn(),
16
+ } ) ),
17
+ } ) );
18
+
19
+ const MOCK_TYPE = 'test-loop-type';
20
+
21
+ const createMockAtomicWidget = () => ( {
22
+ atomic: true,
23
+ controls: {},
24
+ title: MOCK_TYPE,
25
+ twig_templates: {},
26
+ twig_main_template: 'main',
27
+ atomic_props_schema: {},
28
+ base_styles_dictionary: {},
29
+ } );
30
+
31
+ const createMockElementsManager = () => ( {
32
+ getElementTypeClass: jest.fn().mockReturnValue( null ),
33
+ registerElementType: jest.fn(),
34
+ elementTypes: {} as Record< string, unknown >,
35
+ } );
36
+
37
+ const attachMockElementsManager = ( elementsManager: ReturnType< typeof createMockElementsManager > ) => {
38
+ const legacyWindow = window as unknown as LegacyWindow;
39
+ legacyWindow.elementor.elementsManager =
40
+ elementsManager as unknown as LegacyWindow[ 'elementor' ][ 'elementsManager' ];
41
+ };
42
+
43
+ describe( 'initLegacyViews', () => {
44
+ beforeEach( () => {
45
+ mockLegacyElementor();
46
+ } );
47
+
48
+ it( 'should register a late element type via the legacy manager without leaking state', () => {
49
+ // Arrange
50
+ const elementsManager = createMockElementsManager();
51
+ attachMockElementsManager( elementsManager );
52
+
53
+ jest.mocked( getWidgetsCache ).mockReturnValue( { [ MOCK_TYPE ]: createMockAtomicWidget() } );
54
+
55
+ initLegacyViews();
56
+ elementsManager.registerElementType.mockClear();
57
+
58
+ // Act
59
+ registerElementType( MOCK_TYPE, ( options ) => createTemplatedElementType( options ) );
60
+
61
+ // Assert
62
+ expect( elementsManager.registerElementType ).toHaveBeenCalledTimes( 1 );
63
+ const [ registeredInstance ] = elementsManager.registerElementType.mock.calls[ 0 ];
64
+ expect( registeredInstance.getType() ).toBe( MOCK_TYPE );
65
+ } );
66
+ } );
@@ -1,5 +1,5 @@
1
1
  import { getWidgetsCache, type V1ElementConfig } from '@elementor/editor-elements';
2
- import { __privateListenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';
2
+ import { __privateIsReady as isV1Ready, __privateListenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';
3
3
 
4
4
  import { createDomRenderer, type DomRenderer } from '../renderers/create-dom-renderer';
5
5
  import { createElementType } from './create-element-type';
@@ -30,28 +30,38 @@ export function registerElementType(
30
30
  elementTypeGenerator: ElementLegacyType[ keyof ElementLegacyType ]
31
31
  ) {
32
32
  elementsLegacyTypes[ type ] = elementTypeGenerator;
33
+
34
+ if ( isV1Ready() ) {
35
+ registerElementInLegacyManager( type, createDomRenderer() );
36
+ }
33
37
  }
34
38
 
35
39
  export function initLegacyViews() {
36
40
  __privateListenTo( v1ReadyEvent(), () => {
37
41
  const widgetsCache = getWidgetsCache() ?? {};
38
- const legacyWindow = window as unknown as LegacyWindow;
39
42
  const renderer = createDomRenderer();
40
43
 
41
44
  registerProPromotionTypes( widgetsCache );
42
45
 
43
- Object.entries( widgetsCache ).forEach( ( [ type, element ] ) => {
44
- if ( ! element.atomic ) {
45
- return;
46
- }
47
-
48
- const ResolvedElementType = resolveElementType( type, renderer, element );
49
-
50
- tryRegisterElement( legacyWindow, type, element, ResolvedElementType );
46
+ Object.keys( widgetsCache ).forEach( ( type ) => {
47
+ registerElementInLegacyManager( type, renderer );
51
48
  } );
52
49
  } );
53
50
  }
54
51
 
52
+ function registerElementInLegacyManager( type: string, renderer: DomRenderer ) {
53
+ const element = ( getWidgetsCache() ?? {} )[ type ];
54
+
55
+ if ( ! element?.atomic ) {
56
+ return;
57
+ }
58
+
59
+ const legacyWindow = window as unknown as LegacyWindow;
60
+ const ResolvedElementType = resolveElementType( type, renderer, element );
61
+
62
+ tryRegisterElement( legacyWindow, type, element, ResolvedElementType );
63
+ }
64
+
55
65
  function registerProPromotionTypes( widgetsCache: Record< string, V1ElementConfig > ) {
56
66
  Object.entries( widgetsCache ).forEach( ( [ type, element ] ) => {
57
67
  if ( element.meta?.is_pro_promotion ) {