@elementor/editor-styles-repository 0.1.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.
@@ -0,0 +1,22 @@
1
+
2
+ > @elementor/editor-styles-repository@0.1.0 build
3
+ > tsup --config=../../tsup.build.ts
4
+
5
+ CLI Building entry: src/index.ts
6
+ CLI Using tsconfig: ../../../tsconfig.json
7
+ CLI tsup v8.3.5
8
+ CLI Using tsup config: /home/runner/work/elementor-packages/elementor-packages/tsup.build.ts
9
+ CLI Target: esnext
10
+ CLI Cleaning output folder
11
+ ESM Build start
12
+ CJS Build start
13
+ ESM dist/index.mjs 1.62 KB
14
+ ESM dist/index.mjs.map 3.55 KB
15
+ ESM ⚡️ Build success in 30ms
16
+ CJS dist/index.js 2.74 KB
17
+ CJS dist/index.js.map 3.59 KB
18
+ CJS ⚡️ Build success in 31ms
19
+ DTS Build start
20
+ DTS ⚡️ Build success in 11031ms
21
+ DTS dist/index.d.mts 519.00 B
22
+ DTS dist/index.d.ts 519.00 B
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # @elementor/editor-styles-repository
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 081bae8: Move the style renderer into editor-canvas and register the elements styles provider in editor-styles-repository
8
+ - f584292: Create editor styles repository
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies [081bae8]
13
+ - Updated dependencies [f584292]
14
+ - @elementor/editor-elements@0.3.1
15
+ - @elementor/editor-styles@0.3.0
@@ -0,0 +1,15 @@
1
+ import * as _elementor_editor_styles from '@elementor/editor-styles';
2
+ import { StyleDefinitionsMap } from '@elementor/editor-styles';
3
+
4
+ type StylesProvider = {
5
+ get: () => StyleDefinitionsMap;
6
+ subscribe: (callback: () => void) => () => void;
7
+ };
8
+
9
+ declare const stylesRepository: {
10
+ registerProvider: (key: string, provider: StylesProvider) => void;
11
+ all: () => _elementor_editor_styles.StyleDefinitionsMap;
12
+ subscribe: (cb: () => void) => () => void;
13
+ };
14
+
15
+ export { type StylesProvider, stylesRepository };
@@ -0,0 +1,15 @@
1
+ import * as _elementor_editor_styles from '@elementor/editor-styles';
2
+ import { StyleDefinitionsMap } from '@elementor/editor-styles';
3
+
4
+ type StylesProvider = {
5
+ get: () => StyleDefinitionsMap;
6
+ subscribe: (callback: () => void) => () => void;
7
+ };
8
+
9
+ declare const stylesRepository: {
10
+ registerProvider: (key: string, provider: StylesProvider) => void;
11
+ all: () => _elementor_editor_styles.StyleDefinitionsMap;
12
+ subscribe: (cb: () => void) => () => void;
13
+ };
14
+
15
+ export { type StylesProvider, stylesRepository };
package/dist/index.js ADDED
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ stylesRepository: () => stylesRepository
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // src/utils/create-styles-repository.ts
28
+ var createStylesRepository = () => {
29
+ const providers = /* @__PURE__ */ new Map();
30
+ const registerProvider = (key, provider) => {
31
+ providers.set(key, provider);
32
+ };
33
+ const all = () => {
34
+ return Array.from(providers.values()).reduce((acc, provider) => {
35
+ const styles = provider.get();
36
+ return { ...acc, ...styles };
37
+ }, {});
38
+ };
39
+ const subscribe = (cb) => {
40
+ const unsubscribes = Array.from(providers.values()).map((provider) => {
41
+ return provider.subscribe(cb);
42
+ });
43
+ return () => {
44
+ unsubscribes.forEach((unsubscribe) => unsubscribe());
45
+ };
46
+ };
47
+ return {
48
+ registerProvider,
49
+ all,
50
+ subscribe
51
+ };
52
+ };
53
+
54
+ // src/styles-repository.ts
55
+ var stylesRepository = createStylesRepository();
56
+
57
+ // src/elements-styles-provider.ts
58
+ var import_editor_elements = require("@elementor/editor-elements");
59
+ var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
60
+ var elementsStylesProvider = {
61
+ get: () => {
62
+ const elements = (0, import_editor_elements.getElements)();
63
+ const entries = elements.flatMap((element) => {
64
+ const styles = element.model.get("styles");
65
+ return styles ? Object.entries(styles) : [];
66
+ });
67
+ return Object.fromEntries(entries);
68
+ },
69
+ subscribe: (cb) => {
70
+ return (0, import_editor_v1_adapters.__privateListenTo)(
71
+ [
72
+ (0, import_editor_v1_adapters.commandEndEvent)("editor/documents/attach-preview"),
73
+ (0, import_editor_v1_adapters.commandEndEvent)("document/atomic-widgets/styles")
74
+ ],
75
+ cb
76
+ );
77
+ }
78
+ };
79
+
80
+ // src/init.ts
81
+ function init() {
82
+ stylesRepository.registerProvider("elements", elementsStylesProvider);
83
+ }
84
+
85
+ // src/index.ts
86
+ init();
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ stylesRepository
90
+ });
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/elements-styles-provider.ts","../src/init.ts"],"sourcesContent":["export { type StylesProvider } from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\n\nimport { init } from './init';\n\ninit();\n","import { type StyleDefinitionsMap } from '@elementor/editor-styles';\n\nexport type StylesProvider = {\n\tget: () => StyleDefinitionsMap;\n\tsubscribe: ( callback: () => void ) => () => void;\n};\n\nexport const createStylesRepository = () => {\n\tconst providers = new Map< string, StylesProvider >();\n\n\tconst registerProvider = ( key: string, provider: StylesProvider ) => {\n\t\tproviders.set( key, provider );\n\t};\n\n\tconst all = () => {\n\t\treturn Array.from( providers.values() ).reduce< StyleDefinitionsMap >( ( acc, provider ) => {\n\t\t\tconst styles = provider.get();\n\n\t\t\treturn { ...acc, ...styles };\n\t\t}, {} );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = Array.from( providers.values() ).map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\treturn {\n\t\tregisterProvider,\n\t\tall,\n\t\tsubscribe,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tget: () => {\n\t\tconst elements = getElements();\n\n\t\tconst entries = elements.flatMap( ( element ) => {\n\t\t\tconst styles = element.model.get( 'styles' );\n\n\t\t\treturn styles ? Object.entries( styles ) : [];\n\t\t} );\n\n\t\treturn Object.fromEntries( entries );\n\t},\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo(\n\t\t\t[\n\t\t\t\tcommandEndEvent( 'editor/documents/attach-preview' ),\n\t\t\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t\t],\n\t\t\tcb\n\t\t);\n\t},\n};\n","import { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.registerProvider( 'elements', elementsStylesProvider );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAAY,oBAAI,IAA8B;AAEpD,QAAM,mBAAmB,CAAE,KAAa,aAA8B;AACrE,cAAU,IAAK,KAAK,QAAS;AAAA,EAC9B;AAEA,QAAM,MAAM,MAAM;AACjB,WAAO,MAAM,KAAM,UAAU,OAAO,CAAE,EAAE,OAA+B,CAAE,KAAK,aAAc;AAC3F,YAAM,SAAS,SAAS,IAAI;AAE5B,aAAO,EAAE,GAAG,KAAK,GAAG,OAAO;AAAA,IAC5B,GAAG,CAAC,CAAE;AAAA,EACP;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,MAAM,KAAM,UAAU,OAAO,CAAE,EAAE,IAAK,CAAE,aAAc;AAC1E,aAAO,SAAS,UAAW,EAAG;AAAA,IAC/B,CAAE;AAEF,WAAO,MAAM;AACZ,mBAAa,QAAS,CAAE,gBAAiB,YAAY,CAAE;AAAA,IACxD;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;ACnCO,IAAM,mBAAmB,uBAAuB;;;ACFvD,6BAA4B;AAC5B,gCAA+D;AAIxD,IAAM,yBAAyC;AAAA,EACrD,KAAK,MAAM;AACV,UAAM,eAAW,oCAAY;AAE7B,UAAM,UAAU,SAAS,QAAS,CAAE,YAAa;AAChD,YAAM,SAAS,QAAQ,MAAM,IAAK,QAAS;AAE3C,aAAO,SAAS,OAAO,QAAS,MAAO,IAAI,CAAC;AAAA,IAC7C,CAAE;AAEF,WAAO,OAAO,YAAa,OAAQ;AAAA,EACpC;AAAA,EACA,WAAW,CAAE,OAAQ;AACpB,eAAO,0BAAAA;AAAA,MACN;AAAA,YACC,2CAAiB,iCAAkC;AAAA,YACnD,2CAAiB,gCAAiC;AAAA,MACnD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;;;ACvBO,SAAS,OAAO;AACtB,mBAAiB,iBAAkB,YAAY,sBAAuB;AACvE;;;AJCA,KAAK;","names":["listenTo"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,64 @@
1
+ // src/utils/create-styles-repository.ts
2
+ var createStylesRepository = () => {
3
+ const providers = /* @__PURE__ */ new Map();
4
+ const registerProvider = (key, provider) => {
5
+ providers.set(key, provider);
6
+ };
7
+ const all = () => {
8
+ return Array.from(providers.values()).reduce((acc, provider) => {
9
+ const styles = provider.get();
10
+ return { ...acc, ...styles };
11
+ }, {});
12
+ };
13
+ const subscribe = (cb) => {
14
+ const unsubscribes = Array.from(providers.values()).map((provider) => {
15
+ return provider.subscribe(cb);
16
+ });
17
+ return () => {
18
+ unsubscribes.forEach((unsubscribe) => unsubscribe());
19
+ };
20
+ };
21
+ return {
22
+ registerProvider,
23
+ all,
24
+ subscribe
25
+ };
26
+ };
27
+
28
+ // src/styles-repository.ts
29
+ var stylesRepository = createStylesRepository();
30
+
31
+ // src/elements-styles-provider.ts
32
+ import { getElements } from "@elementor/editor-elements";
33
+ import { __privateListenTo as listenTo, commandEndEvent } from "@elementor/editor-v1-adapters";
34
+ var elementsStylesProvider = {
35
+ get: () => {
36
+ const elements = getElements();
37
+ const entries = elements.flatMap((element) => {
38
+ const styles = element.model.get("styles");
39
+ return styles ? Object.entries(styles) : [];
40
+ });
41
+ return Object.fromEntries(entries);
42
+ },
43
+ subscribe: (cb) => {
44
+ return listenTo(
45
+ [
46
+ commandEndEvent("editor/documents/attach-preview"),
47
+ commandEndEvent("document/atomic-widgets/styles")
48
+ ],
49
+ cb
50
+ );
51
+ }
52
+ };
53
+
54
+ // src/init.ts
55
+ function init() {
56
+ stylesRepository.registerProvider("elements", elementsStylesProvider);
57
+ }
58
+
59
+ // src/index.ts
60
+ init();
61
+ export {
62
+ stylesRepository
63
+ };
64
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/elements-styles-provider.ts","../src/init.ts","../src/index.ts"],"sourcesContent":["import { type StyleDefinitionsMap } from '@elementor/editor-styles';\n\nexport type StylesProvider = {\n\tget: () => StyleDefinitionsMap;\n\tsubscribe: ( callback: () => void ) => () => void;\n};\n\nexport const createStylesRepository = () => {\n\tconst providers = new Map< string, StylesProvider >();\n\n\tconst registerProvider = ( key: string, provider: StylesProvider ) => {\n\t\tproviders.set( key, provider );\n\t};\n\n\tconst all = () => {\n\t\treturn Array.from( providers.values() ).reduce< StyleDefinitionsMap >( ( acc, provider ) => {\n\t\t\tconst styles = provider.get();\n\n\t\t\treturn { ...acc, ...styles };\n\t\t}, {} );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = Array.from( providers.values() ).map( ( provider ) => {\n\t\t\treturn provider.subscribe( cb );\n\t\t} );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\treturn {\n\t\tregisterProvider,\n\t\tall,\n\t\tsubscribe,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';\n\nimport { type StylesProvider } from './utils/create-styles-repository';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tget: () => {\n\t\tconst elements = getElements();\n\n\t\tconst entries = elements.flatMap( ( element ) => {\n\t\t\tconst styles = element.model.get( 'styles' );\n\n\t\t\treturn styles ? Object.entries( styles ) : [];\n\t\t} );\n\n\t\treturn Object.fromEntries( entries );\n\t},\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo(\n\t\t\t[\n\t\t\t\tcommandEndEvent( 'editor/documents/attach-preview' ),\n\t\t\t\tcommandEndEvent( 'document/atomic-widgets/styles' ),\n\t\t\t],\n\t\t\tcb\n\t\t);\n\t},\n};\n","import { elementsStylesProvider } from './elements-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.registerProvider( 'elements', elementsStylesProvider );\n}\n","export { type StylesProvider } from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\n\nimport { init } from './init';\n\ninit();\n"],"mappings":";AAOO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAAY,oBAAI,IAA8B;AAEpD,QAAM,mBAAmB,CAAE,KAAa,aAA8B;AACrE,cAAU,IAAK,KAAK,QAAS;AAAA,EAC9B;AAEA,QAAM,MAAM,MAAM;AACjB,WAAO,MAAM,KAAM,UAAU,OAAO,CAAE,EAAE,OAA+B,CAAE,KAAK,aAAc;AAC3F,YAAM,SAAS,SAAS,IAAI;AAE5B,aAAO,EAAE,GAAG,KAAK,GAAG,OAAO;AAAA,IAC5B,GAAG,CAAC,CAAE;AAAA,EACP;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,MAAM,KAAM,UAAU,OAAO,CAAE,EAAE,IAAK,CAAE,aAAc;AAC1E,aAAO,SAAS,UAAW,EAAG;AAAA,IAC/B,CAAE;AAEF,WAAO,MAAM;AACZ,mBAAa,QAAS,CAAE,gBAAiB,YAAY,CAAE;AAAA,IACxD;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;ACnCO,IAAM,mBAAmB,uBAAuB;;;ACFvD,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB,UAAU,uBAAuB;AAIxD,IAAM,yBAAyC;AAAA,EACrD,KAAK,MAAM;AACV,UAAM,WAAW,YAAY;AAE7B,UAAM,UAAU,SAAS,QAAS,CAAE,YAAa;AAChD,YAAM,SAAS,QAAQ,MAAM,IAAK,QAAS;AAE3C,aAAO,SAAS,OAAO,QAAS,MAAO,IAAI,CAAC;AAAA,IAC7C,CAAE;AAEF,WAAO,OAAO,YAAa,OAAQ;AAAA,EACpC;AAAA,EACA,WAAW,CAAE,OAAQ;AACpB,WAAO;AAAA,MACN;AAAA,QACC,gBAAiB,iCAAkC;AAAA,QACnD,gBAAiB,gCAAiC;AAAA,MACnD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;;;ACvBO,SAAS,OAAO;AACtB,mBAAiB,iBAAkB,YAAY,sBAAuB;AACvE;;;ACCA,KAAK;","names":[]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@elementor/editor-styles-repository",
3
+ "description": "Elementor Editor Styles Repository",
4
+ "version": "0.1.0",
5
+ "private": false,
6
+ "author": "Elementor Team",
7
+ "homepage": "https://elementor.com/",
8
+ "license": "GPL-3.0-or-later",
9
+ "main": "dist/index.js",
10
+ "module": "dist/index.mjs",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.mjs",
16
+ "require": "./dist/index.js"
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/elementor/elementor-packages.git",
23
+ "directory": "packages/core/editor-styles-repository"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/elementor/elementor-packages/issues"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsup --config=../../tsup.build.ts",
33
+ "dev": "tsup --config=../../tsup.dev.ts"
34
+ },
35
+ "dependencies": {
36
+ "@elementor/editor-elements": "^0.3.1",
37
+ "@elementor/editor-styles": "^0.3.0",
38
+ "@elementor/editor-v1-adapters": "^0.8.4"
39
+ }
40
+ }
@@ -0,0 +1,41 @@
1
+ import { createMockElement, createMockStyleDefinition } from 'test-utils';
2
+ import { getElements } from '@elementor/editor-elements';
3
+
4
+ import { elementsStylesProvider } from '../elements-styles-provider';
5
+
6
+ jest.mock( '@elementor/editor-elements' );
7
+
8
+ describe( 'elementsStylesProvider', () => {
9
+ it( 'should return all the styles attached to all the document elements', () => {
10
+ // Arrange.
11
+ jest.mocked( getElements ).mockReturnValue( [
12
+ createMockElement( {
13
+ model: {
14
+ id: '1',
15
+ styles: {
16
+ 's-1': createMockStyleDefinition( { id: 's-1' } ),
17
+ 's-2': createMockStyleDefinition( { id: 's-2' } ),
18
+ },
19
+ },
20
+ } ),
21
+ createMockElement( {
22
+ model: {
23
+ id: '2',
24
+ styles: {
25
+ 's-3': createMockStyleDefinition( { id: 's-3' } ),
26
+ },
27
+ },
28
+ } ),
29
+ ] );
30
+
31
+ // Act.
32
+ const styles = elementsStylesProvider.get();
33
+
34
+ // Assert.
35
+ expect( styles ).toEqual( {
36
+ 's-1': expect.objectContaining( { id: 's-1' } ),
37
+ 's-2': expect.objectContaining( { id: 's-2' } ),
38
+ 's-3': expect.objectContaining( { id: 's-3' } ),
39
+ } );
40
+ } );
41
+ } );
@@ -0,0 +1,27 @@
1
+ import { getElements } from '@elementor/editor-elements';
2
+ import { __privateListenTo as listenTo, commandEndEvent } from '@elementor/editor-v1-adapters';
3
+
4
+ import { type StylesProvider } from './utils/create-styles-repository';
5
+
6
+ export const elementsStylesProvider: StylesProvider = {
7
+ get: () => {
8
+ const elements = getElements();
9
+
10
+ const entries = elements.flatMap( ( element ) => {
11
+ const styles = element.model.get( 'styles' );
12
+
13
+ return styles ? Object.entries( styles ) : [];
14
+ } );
15
+
16
+ return Object.fromEntries( entries );
17
+ },
18
+ subscribe: ( cb ) => {
19
+ return listenTo(
20
+ [
21
+ commandEndEvent( 'editor/documents/attach-preview' ),
22
+ commandEndEvent( 'document/atomic-widgets/styles' ),
23
+ ],
24
+ cb
25
+ );
26
+ },
27
+ };
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ export { type StylesProvider } from './utils/create-styles-repository';
2
+
3
+ export { stylesRepository } from './styles-repository';
4
+
5
+ import { init } from './init';
6
+
7
+ init();
package/src/init.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { elementsStylesProvider } from './elements-styles-provider';
2
+ import { stylesRepository } from './styles-repository';
3
+
4
+ export function init() {
5
+ stylesRepository.registerProvider( 'elements', elementsStylesProvider );
6
+ }
@@ -0,0 +1,3 @@
1
+ import { createStylesRepository } from './utils/create-styles-repository';
2
+
3
+ export const stylesRepository = createStylesRepository();
@@ -0,0 +1,84 @@
1
+ import { createMockStyleDefinition } from 'test-utils';
2
+ import { type StyleDefinitionsMap } from '@elementor/editor-styles';
3
+
4
+ import { createStylesRepository, type StylesProvider } from '../create-styles-repository';
5
+
6
+ const styleDef1 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#dddddd' } } } );
7
+ const styleDef2 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#eeeeee' } } } );
8
+
9
+ describe( 'createStylesRepository', () => {
10
+ it( 'should register and get all styles from all providers', () => {
11
+ // Arrange
12
+ const repo = createStylesRepository();
13
+
14
+ repo.registerProvider( 'mock1', createMockProvider( { [ styleDef1.id ]: styleDef1 } ).provider );
15
+ repo.registerProvider( 'mock2', createMockProvider( { [ styleDef2.id ]: styleDef2 } ).provider );
16
+
17
+ // Assert
18
+ expect( repo.all() ).toEqual( {
19
+ [ styleDef1.id ]: styleDef1,
20
+ [ styleDef2.id ]: styleDef2,
21
+ } );
22
+ } );
23
+
24
+ it( 'should subscribe and unsubscribe to all style providers', () => {
25
+ // Arrange
26
+ const repo = createStylesRepository();
27
+
28
+ const { provider: mockStylesProvider1, notify: notify1 } = createMockProvider( {
29
+ [ styleDef1.id ]: styleDef1,
30
+ } );
31
+
32
+ const { provider: mockStylesProvider2, notify: notify2 } = createMockProvider( {
33
+ [ styleDef2.id ]: styleDef2,
34
+ } );
35
+
36
+ repo.registerProvider( 'mock1', mockStylesProvider1 );
37
+ repo.registerProvider( 'mock2', mockStylesProvider2 );
38
+
39
+ const cb = jest.fn();
40
+ const unsubscribe = repo.subscribe( cb );
41
+
42
+ // Act
43
+ notify1();
44
+
45
+ // Assert
46
+ expect( cb ).toHaveBeenCalledTimes( 1 );
47
+
48
+ // Act
49
+ notify2();
50
+
51
+ // Assert
52
+ expect( cb ).toHaveBeenCalledTimes( 2 );
53
+
54
+ // Act
55
+ unsubscribe();
56
+
57
+ notify1();
58
+ notify2();
59
+
60
+ // Assert
61
+ expect( cb ).toHaveBeenCalledTimes( 2 );
62
+ } );
63
+ } );
64
+
65
+ const createMockProvider = ( styleDefinitions: StyleDefinitionsMap ) => {
66
+ const subscribers = new Set< () => void >();
67
+
68
+ const notify = () => {
69
+ subscribers.forEach( ( cb ) => cb() );
70
+ };
71
+
72
+ const provider: StylesProvider = {
73
+ get: () => styleDefinitions,
74
+ subscribe: ( cb ) => {
75
+ subscribers.add( cb );
76
+
77
+ return () => {
78
+ subscribers.delete( cb );
79
+ };
80
+ },
81
+ };
82
+
83
+ return { provider, notify };
84
+ };
@@ -0,0 +1,38 @@
1
+ import { type StyleDefinitionsMap } from '@elementor/editor-styles';
2
+
3
+ export type StylesProvider = {
4
+ get: () => StyleDefinitionsMap;
5
+ subscribe: ( callback: () => void ) => () => void;
6
+ };
7
+
8
+ export const createStylesRepository = () => {
9
+ const providers = new Map< string, StylesProvider >();
10
+
11
+ const registerProvider = ( key: string, provider: StylesProvider ) => {
12
+ providers.set( key, provider );
13
+ };
14
+
15
+ const all = () => {
16
+ return Array.from( providers.values() ).reduce< StyleDefinitionsMap >( ( acc, provider ) => {
17
+ const styles = provider.get();
18
+
19
+ return { ...acc, ...styles };
20
+ }, {} );
21
+ };
22
+
23
+ const subscribe = ( cb: () => void ) => {
24
+ const unsubscribes = Array.from( providers.values() ).map( ( provider ) => {
25
+ return provider.subscribe( cb );
26
+ } );
27
+
28
+ return () => {
29
+ unsubscribes.forEach( ( unsubscribe ) => unsubscribe() );
30
+ };
31
+ };
32
+
33
+ return {
34
+ registerProvider,
35
+ all,
36
+ subscribe,
37
+ };
38
+ };