@elementor/editor-styles-repository 0.1.1 → 0.3.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @elementor/editor-styles-repository@0.1.1 build
2
+ > @elementor/editor-styles-repository@0.3.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
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 75ms
16
- CJS dist/index.js 2.74 KB
17
- CJS dist/index.js.map 3.59 KB
18
- CJS ⚡️ Build success in 76ms
13
+ ESM dist/index.mjs 2.22 KB
14
+ ESM dist/index.mjs.map 5.02 KB
15
+ ESM ⚡️ Build success in 55ms
16
+ CJS dist/index.js 3.50 KB
17
+ CJS dist/index.js.map 5.07 KB
18
+ CJS ⚡️ Build success in 56ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 9578ms
21
- DTS dist/index.d.mts 519.00 B
22
- DTS dist/index.d.ts 519.00 B
20
+ DTS ⚡️ Build success in 4336ms
21
+ DTS dist/index.d.mts 990.00 B
22
+ DTS dist/index.d.ts 990.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @elementor/editor-styles-repository
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ed4260a: Introduce global classes styles provider and store
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 6f2b17f: Introduce empty (local) style def for class selector.
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [6f2b17f]
18
+ - @elementor/editor-elements@0.3.3
19
+ - @elementor/editor-styles@0.3.2
20
+
3
21
  ## 0.1.1
4
22
 
5
23
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,15 +1,23 @@
1
1
  import * as _elementor_editor_styles from '@elementor/editor-styles';
2
- import { StyleDefinitionsMap } from '@elementor/editor-styles';
2
+ import { StyleDefinition } from '@elementor/editor-styles';
3
3
 
4
+ type StyleProviderMeta = Record<string, unknown>;
4
5
  type StylesProvider = {
5
- get: () => StyleDefinitionsMap;
6
+ key: string;
7
+ priority: number;
8
+ get: (meta?: StyleProviderMeta) => StyleDefinition[];
6
9
  subscribe: (callback: () => void) => () => void;
7
10
  };
8
11
 
9
12
  declare const stylesRepository: {
10
- registerProvider: (key: string, provider: StylesProvider) => void;
11
- all: () => _elementor_editor_styles.StyleDefinitionsMap;
13
+ all: (meta?: StyleProviderMeta) => _elementor_editor_styles.StyleDefinition[];
14
+ allByProvider: (meta?: StyleProviderMeta) => (readonly [string, _elementor_editor_styles.StyleDefinition[]])[];
15
+ register: (provider: StylesProvider) => void;
12
16
  subscribe: (cb: () => void) => () => void;
13
17
  };
14
18
 
15
- export { type StylesProvider, stylesRepository };
19
+ declare function useAllStylesByProvider(meta?: StyleProviderMeta): (readonly [string, _elementor_editor_styles.StyleDefinition[]])[];
20
+
21
+ declare const ELEMENTS_STYLES_PROVIDER_KEY = "elements";
22
+
23
+ export { ELEMENTS_STYLES_PROVIDER_KEY, type StylesProvider, stylesRepository, useAllStylesByProvider };
package/dist/index.d.ts CHANGED
@@ -1,15 +1,23 @@
1
1
  import * as _elementor_editor_styles from '@elementor/editor-styles';
2
- import { StyleDefinitionsMap } from '@elementor/editor-styles';
2
+ import { StyleDefinition } from '@elementor/editor-styles';
3
3
 
4
+ type StyleProviderMeta = Record<string, unknown>;
4
5
  type StylesProvider = {
5
- get: () => StyleDefinitionsMap;
6
+ key: string;
7
+ priority: number;
8
+ get: (meta?: StyleProviderMeta) => StyleDefinition[];
6
9
  subscribe: (callback: () => void) => () => void;
7
10
  };
8
11
 
9
12
  declare const stylesRepository: {
10
- registerProvider: (key: string, provider: StylesProvider) => void;
11
- all: () => _elementor_editor_styles.StyleDefinitionsMap;
13
+ all: (meta?: StyleProviderMeta) => _elementor_editor_styles.StyleDefinition[];
14
+ allByProvider: (meta?: StyleProviderMeta) => (readonly [string, _elementor_editor_styles.StyleDefinition[]])[];
15
+ register: (provider: StylesProvider) => void;
12
16
  subscribe: (cb: () => void) => () => void;
13
17
  };
14
18
 
15
- export { type StylesProvider, stylesRepository };
19
+ declare function useAllStylesByProvider(meta?: StyleProviderMeta): (readonly [string, _elementor_editor_styles.StyleDefinition[]])[];
20
+
21
+ declare const ELEMENTS_STYLES_PROVIDER_KEY = "elements";
22
+
23
+ export { ELEMENTS_STYLES_PROVIDER_KEY, type StylesProvider, stylesRepository, useAllStylesByProvider };
package/dist/index.js CHANGED
@@ -18,26 +18,31 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- stylesRepository: () => stylesRepository
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ELEMENTS_STYLES_PROVIDER_KEY: () => ELEMENTS_STYLES_PROVIDER_KEY,
24
+ stylesRepository: () => stylesRepository,
25
+ useAllStylesByProvider: () => useAllStylesByProvider
24
26
  });
25
- module.exports = __toCommonJS(src_exports);
27
+ module.exports = __toCommonJS(index_exports);
26
28
 
27
29
  // src/utils/create-styles-repository.ts
28
30
  var createStylesRepository = () => {
29
- const providers = /* @__PURE__ */ new Map();
30
- const registerProvider = (key, provider) => {
31
- providers.set(key, provider);
31
+ const providers = [];
32
+ const getProvidersByPriority = () => {
33
+ return providers.slice(0).sort((a, b) => a.priority > b.priority ? -1 : 1);
32
34
  };
33
- const all = () => {
34
- return Array.from(providers.values()).reduce((acc, provider) => {
35
- const styles = provider.get();
36
- return { ...acc, ...styles };
37
- }, {});
35
+ const register = (provider) => {
36
+ providers.push(provider);
37
+ };
38
+ const allByProvider = (meta = {}) => {
39
+ return getProvidersByPriority().map((provider) => [provider.key, provider.get(meta)]);
40
+ };
41
+ const all = (meta = {}) => {
42
+ return getProvidersByPriority().flatMap((provider) => provider.get(meta));
38
43
  };
39
44
  const subscribe = (cb) => {
40
- const unsubscribes = Array.from(providers.values()).map((provider) => {
45
+ const unsubscribes = providers.map((provider) => {
41
46
  return provider.subscribe(cb);
42
47
  });
43
48
  return () => {
@@ -45,8 +50,9 @@ var createStylesRepository = () => {
45
50
  };
46
51
  };
47
52
  return {
48
- registerProvider,
49
53
  all,
54
+ allByProvider,
55
+ register,
50
56
  subscribe
51
57
  };
52
58
  };
@@ -54,17 +60,27 @@ var createStylesRepository = () => {
54
60
  // src/styles-repository.ts
55
61
  var stylesRepository = createStylesRepository();
56
62
 
63
+ // src/hooks/use-all-styles-by-provider.ts
64
+ var import_react = require("react");
65
+ function useAllStylesByProvider(meta = {}) {
66
+ const [, rerender] = (0, import_react.useReducer)((prev) => !prev, false);
67
+ (0, import_react.useEffect)(() => stylesRepository.subscribe(rerender), []);
68
+ return stylesRepository.allByProvider(meta);
69
+ }
70
+
57
71
  // src/elements-styles-provider.ts
58
72
  var import_editor_elements = require("@elementor/editor-elements");
59
73
  var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
74
+ var ELEMENTS_STYLES_PROVIDER_KEY = "elements";
60
75
  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);
76
+ key: ELEMENTS_STYLES_PROVIDER_KEY,
77
+ priority: 50,
78
+ get: (meta = {}) => {
79
+ let elements = (0, import_editor_elements.getElements)();
80
+ if ("elementId" in meta && meta.elementId) {
81
+ elements = elements.filter((element) => element.id === meta.elementId);
82
+ }
83
+ return elements.flatMap((element) => Object.values(element.model.get("styles") ?? {}));
68
84
  },
69
85
  subscribe: (cb) => {
70
86
  return (0, import_editor_v1_adapters.__privateListenTo)(
@@ -79,13 +95,15 @@ var elementsStylesProvider = {
79
95
 
80
96
  // src/init.ts
81
97
  function init() {
82
- stylesRepository.registerProvider("elements", elementsStylesProvider);
98
+ stylesRepository.register(elementsStylesProvider);
83
99
  }
84
100
 
85
101
  // src/index.ts
86
102
  init();
87
103
  // Annotate the CommonJS export names for ESM import in node:
88
104
  0 && (module.exports = {
89
- stylesRepository
105
+ ELEMENTS_STYLES_PROVIDER_KEY,
106
+ stylesRepository,
107
+ useAllStylesByProvider
90
108
  });
91
109
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-all-styles-by-provider.ts","../src/elements-styles-provider.ts","../src/init.ts"],"sourcesContent":["export { type StylesProvider } from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n","import { type StyleDefinition } from '@elementor/editor-styles';\n\nexport type StyleProviderMeta = Record< string, unknown >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tget: ( meta?: StyleProviderMeta ) => StyleDefinition[];\n\tsubscribe: ( callback: () => void ) => () => void;\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProvidersByPriority = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst allByProvider = ( meta: StyleProviderMeta = {} ) => {\n\t\treturn getProvidersByPriority().map( ( provider ) => [ provider.key, provider.get( meta ) ] as const );\n\t};\n\n\tconst all = ( meta: StyleProviderMeta = {} ) => {\n\t\treturn getProvidersByPriority().flatMap( ( provider ) => provider.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.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\tall,\n\t\tallByProvider,\n\t\tregister,\n\t\tsubscribe,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StyleProviderMeta } from '../utils/create-styles-repository';\n\nexport function useAllStylesByProvider( meta: StyleProviderMeta = {} ) {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.allByProvider( meta );\n}\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 ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tget: ( meta = {} ) => {\n\t\tlet elements = getElements();\n\n\t\tif ( 'elementId' in meta && meta.elementId ) {\n\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t}\n\n\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\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.register( elementsStylesProvider );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAA8B,CAAC;AAErC,QAAM,yBAAyB,MAAM;AACpC,WAAO,UAAU,MAAO,CAAE,EAAE,KAAM,CAAE,GAAG,MAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAI;AAAA,EACpF;AAEA,QAAM,WAAW,CAAE,aAA8B;AAChD,cAAU,KAAM,QAAS;AAAA,EAC1B;AAEA,QAAM,gBAAgB,CAAE,OAA0B,CAAC,MAAO;AACzD,WAAO,uBAAuB,EAAE,IAAK,CAAE,aAAc,CAAE,SAAS,KAAK,SAAS,IAAK,IAAK,CAAE,CAAW;AAAA,EACtG;AAEA,QAAM,MAAM,CAAE,OAA0B,CAAC,MAAO;AAC/C,WAAO,uBAAuB,EAAE,QAAS,CAAE,aAAc,SAAS,IAAK,IAAK,CAAE;AAAA,EAC/E;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,UAAU,IAAK,CAAE,aAAc;AACnD,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,IACA;AAAA,EACD;AACD;;;AC5CO,IAAM,mBAAmB,uBAAuB;;;ACFvD,mBAAsC;AAK/B,SAAS,uBAAwB,OAA0B,CAAC,GAAI;AACtE,QAAM,CAAE,EAAE,QAAS,QAAI,yBAAY,CAAE,SAAU,CAAE,MAAM,KAAM;AAE7D,8BAAW,MAAM,iBAAiB,UAAW,QAAS,GAAG,CAAC,CAAE;AAE5D,SAAO,iBAAiB,cAAe,IAAK;AAC7C;;;ACXA,6BAA4B;AAC5B,gCAA+D;AAIxD,IAAM,+BAA+B;AAErC,IAAM,yBAAyC;AAAA,EACrD,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK,CAAE,OAAO,CAAC,MAAO;AACrB,QAAI,eAAW,oCAAY;AAE3B,QAAK,eAAe,QAAQ,KAAK,WAAY;AAC5C,iBAAW,SAAS,OAAQ,CAAE,YAAa,QAAQ,OAAO,KAAK,SAAU;AAAA,IAC1E;AAEA,WAAO,SAAS,QAAS,CAAE,YAAa,OAAO,OAAQ,QAAQ,MAAM,IAAK,QAAS,KAAK,CAAC,CAAE,CAAE;AAAA,EAC9F;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;;;ACzBO,SAAS,OAAO;AACtB,mBAAiB,SAAU,sBAAuB;AACnD;;;ALIA,KAAK;","names":["listenTo"]}
package/dist/index.mjs CHANGED
@@ -1,17 +1,20 @@
1
1
  // src/utils/create-styles-repository.ts
2
2
  var createStylesRepository = () => {
3
- const providers = /* @__PURE__ */ new Map();
4
- const registerProvider = (key, provider) => {
5
- providers.set(key, provider);
3
+ const providers = [];
4
+ const getProvidersByPriority = () => {
5
+ return providers.slice(0).sort((a, b) => a.priority > b.priority ? -1 : 1);
6
6
  };
7
- const all = () => {
8
- return Array.from(providers.values()).reduce((acc, provider) => {
9
- const styles = provider.get();
10
- return { ...acc, ...styles };
11
- }, {});
7
+ const register = (provider) => {
8
+ providers.push(provider);
9
+ };
10
+ const allByProvider = (meta = {}) => {
11
+ return getProvidersByPriority().map((provider) => [provider.key, provider.get(meta)]);
12
+ };
13
+ const all = (meta = {}) => {
14
+ return getProvidersByPriority().flatMap((provider) => provider.get(meta));
12
15
  };
13
16
  const subscribe = (cb) => {
14
- const unsubscribes = Array.from(providers.values()).map((provider) => {
17
+ const unsubscribes = providers.map((provider) => {
15
18
  return provider.subscribe(cb);
16
19
  });
17
20
  return () => {
@@ -19,8 +22,9 @@ var createStylesRepository = () => {
19
22
  };
20
23
  };
21
24
  return {
22
- registerProvider,
23
25
  all,
26
+ allByProvider,
27
+ register,
24
28
  subscribe
25
29
  };
26
30
  };
@@ -28,17 +32,27 @@ var createStylesRepository = () => {
28
32
  // src/styles-repository.ts
29
33
  var stylesRepository = createStylesRepository();
30
34
 
35
+ // src/hooks/use-all-styles-by-provider.ts
36
+ import { useEffect, useReducer } from "react";
37
+ function useAllStylesByProvider(meta = {}) {
38
+ const [, rerender] = useReducer((prev) => !prev, false);
39
+ useEffect(() => stylesRepository.subscribe(rerender), []);
40
+ return stylesRepository.allByProvider(meta);
41
+ }
42
+
31
43
  // src/elements-styles-provider.ts
32
44
  import { getElements } from "@elementor/editor-elements";
33
45
  import { __privateListenTo as listenTo, commandEndEvent } from "@elementor/editor-v1-adapters";
46
+ var ELEMENTS_STYLES_PROVIDER_KEY = "elements";
34
47
  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);
48
+ key: ELEMENTS_STYLES_PROVIDER_KEY,
49
+ priority: 50,
50
+ get: (meta = {}) => {
51
+ let elements = getElements();
52
+ if ("elementId" in meta && meta.elementId) {
53
+ elements = elements.filter((element) => element.id === meta.elementId);
54
+ }
55
+ return elements.flatMap((element) => Object.values(element.model.get("styles") ?? {}));
42
56
  },
43
57
  subscribe: (cb) => {
44
58
  return listenTo(
@@ -53,12 +67,14 @@ var elementsStylesProvider = {
53
67
 
54
68
  // src/init.ts
55
69
  function init() {
56
- stylesRepository.registerProvider("elements", elementsStylesProvider);
70
+ stylesRepository.register(elementsStylesProvider);
57
71
  }
58
72
 
59
73
  // src/index.ts
60
74
  init();
61
75
  export {
62
- stylesRepository
76
+ ELEMENTS_STYLES_PROVIDER_KEY,
77
+ stylesRepository,
78
+ useAllStylesByProvider
63
79
  };
64
80
  //# sourceMappingURL=index.mjs.map
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-all-styles-by-provider.ts","../src/elements-styles-provider.ts","../src/init.ts","../src/index.ts"],"sourcesContent":["import { type StyleDefinition } from '@elementor/editor-styles';\n\nexport type StyleProviderMeta = Record< string, unknown >;\n\nexport type StylesProvider = {\n\tkey: string;\n\tpriority: number;\n\tget: ( meta?: StyleProviderMeta ) => StyleDefinition[];\n\tsubscribe: ( callback: () => void ) => () => void;\n};\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProvidersByPriority = () => {\n\t\treturn providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t};\n\n\tconst register = ( provider: StylesProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst allByProvider = ( meta: StyleProviderMeta = {} ) => {\n\t\treturn getProvidersByPriority().map( ( provider ) => [ provider.key, provider.get( meta ) ] as const );\n\t};\n\n\tconst all = ( meta: StyleProviderMeta = {} ) => {\n\t\treturn getProvidersByPriority().flatMap( ( provider ) => provider.get( meta ) );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.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\tall,\n\t\tallByProvider,\n\t\tregister,\n\t\tsubscribe,\n\t};\n};\n","import { createStylesRepository } from './utils/create-styles-repository';\n\nexport const stylesRepository = createStylesRepository();\n","import { useEffect, useReducer } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StyleProviderMeta } from '../utils/create-styles-repository';\n\nexport function useAllStylesByProvider( meta: StyleProviderMeta = {} ) {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.allByProvider( meta );\n}\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 ELEMENTS_STYLES_PROVIDER_KEY = 'elements';\n\nexport const elementsStylesProvider: StylesProvider = {\n\tkey: ELEMENTS_STYLES_PROVIDER_KEY,\n\tpriority: 50,\n\tget: ( meta = {} ) => {\n\t\tlet elements = getElements();\n\n\t\tif ( 'elementId' in meta && meta.elementId ) {\n\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t}\n\n\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\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.register( elementsStylesProvider );\n}\n","export { type StylesProvider } from './utils/create-styles-repository';\n\nexport { stylesRepository } from './styles-repository';\nexport { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';\n\nexport { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';\n\nimport { init } from './init';\n\ninit();\n"],"mappings":";AAWO,IAAM,yBAAyB,MAAM;AAC3C,QAAM,YAA8B,CAAC;AAErC,QAAM,yBAAyB,MAAM;AACpC,WAAO,UAAU,MAAO,CAAE,EAAE,KAAM,CAAE,GAAG,MAAS,EAAE,WAAW,EAAE,WAAW,KAAK,CAAI;AAAA,EACpF;AAEA,QAAM,WAAW,CAAE,aAA8B;AAChD,cAAU,KAAM,QAAS;AAAA,EAC1B;AAEA,QAAM,gBAAgB,CAAE,OAA0B,CAAC,MAAO;AACzD,WAAO,uBAAuB,EAAE,IAAK,CAAE,aAAc,CAAE,SAAS,KAAK,SAAS,IAAK,IAAK,CAAE,CAAW;AAAA,EACtG;AAEA,QAAM,MAAM,CAAE,OAA0B,CAAC,MAAO;AAC/C,WAAO,uBAAuB,EAAE,QAAS,CAAE,aAAc,SAAS,IAAK,IAAK,CAAE;AAAA,EAC/E;AAEA,QAAM,YAAY,CAAE,OAAoB;AACvC,UAAM,eAAe,UAAU,IAAK,CAAE,aAAc;AACnD,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,IACA;AAAA,EACD;AACD;;;AC5CO,IAAM,mBAAmB,uBAAuB;;;ACFvD,SAAS,WAAW,kBAAkB;AAK/B,SAAS,uBAAwB,OAA0B,CAAC,GAAI;AACtE,QAAM,CAAE,EAAE,QAAS,IAAI,WAAY,CAAE,SAAU,CAAE,MAAM,KAAM;AAE7D,YAAW,MAAM,iBAAiB,UAAW,QAAS,GAAG,CAAC,CAAE;AAE5D,SAAO,iBAAiB,cAAe,IAAK;AAC7C;;;ACXA,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB,UAAU,uBAAuB;AAIxD,IAAM,+BAA+B;AAErC,IAAM,yBAAyC;AAAA,EACrD,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK,CAAE,OAAO,CAAC,MAAO;AACrB,QAAI,WAAW,YAAY;AAE3B,QAAK,eAAe,QAAQ,KAAK,WAAY;AAC5C,iBAAW,SAAS,OAAQ,CAAE,YAAa,QAAQ,OAAO,KAAK,SAAU;AAAA,IAC1E;AAEA,WAAO,SAAS,QAAS,CAAE,YAAa,OAAO,OAAQ,QAAQ,MAAM,IAAK,QAAS,KAAK,CAAC,CAAE,CAAE;AAAA,EAC9F;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;;;ACzBO,SAAS,OAAO;AACtB,mBAAiB,SAAU,sBAAuB;AACnD;;;ACIA,KAAK;","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-styles-repository",
3
3
  "description": "Elementor Editor Styles Repository",
4
- "version": "0.1.1",
4
+ "version": "0.3.0",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -33,8 +33,11 @@
33
33
  "dev": "tsup --config=../../tsup.dev.ts"
34
34
  },
35
35
  "dependencies": {
36
- "@elementor/editor-elements": "0.3.2",
37
- "@elementor/editor-styles": "0.3.1",
36
+ "@elementor/editor-elements": "0.3.3",
37
+ "@elementor/editor-styles": "0.3.2",
38
38
  "@elementor/editor-v1-adapters": "0.8.5"
39
+ },
40
+ "peerDependencies": {
41
+ "react": "^18.3.1"
39
42
  }
40
43
  }
@@ -6,8 +6,7 @@ import { elementsStylesProvider } from '../elements-styles-provider';
6
6
  jest.mock( '@elementor/editor-elements' );
7
7
 
8
8
  describe( 'elementsStylesProvider', () => {
9
- it( 'should return all the styles attached to all the document elements', () => {
10
- // Arrange.
9
+ beforeEach( () => {
11
10
  jest.mocked( getElements ).mockReturnValue( [
12
11
  createMockElement( {
13
12
  model: {
@@ -27,15 +26,28 @@ describe( 'elementsStylesProvider', () => {
27
26
  },
28
27
  } ),
29
28
  ] );
29
+ } );
30
30
 
31
+ it( 'should return all the styles attached to all the document elements', () => {
31
32
  // Act.
32
33
  const styles = elementsStylesProvider.get();
33
34
 
34
35
  // 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
- } );
36
+ expect( styles ).toEqual( [
37
+ expect.objectContaining( { id: 's-1' } ),
38
+ expect.objectContaining( { id: 's-2' } ),
39
+ expect.objectContaining( { id: 's-3' } ),
40
+ ] );
41
+ } );
42
+
43
+ it( 'should return all styles filtered by element', () => {
44
+ // Act.
45
+ const styles = elementsStylesProvider.get( { elementId: '1' } );
46
+
47
+ // Assert.
48
+ expect( styles ).toEqual( [
49
+ expect.objectContaining( { id: 's-1' } ),
50
+ expect.objectContaining( { id: 's-2' } ),
51
+ ] );
40
52
  } );
41
53
  } );
@@ -3,17 +3,19 @@ import { __privateListenTo as listenTo, commandEndEvent } from '@elementor/edito
3
3
 
4
4
  import { type StylesProvider } from './utils/create-styles-repository';
5
5
 
6
- export const elementsStylesProvider: StylesProvider = {
7
- get: () => {
8
- const elements = getElements();
6
+ export const ELEMENTS_STYLES_PROVIDER_KEY = 'elements';
9
7
 
10
- const entries = elements.flatMap( ( element ) => {
11
- const styles = element.model.get( 'styles' );
8
+ export const elementsStylesProvider: StylesProvider = {
9
+ key: ELEMENTS_STYLES_PROVIDER_KEY,
10
+ priority: 50,
11
+ get: ( meta = {} ) => {
12
+ let elements = getElements();
12
13
 
13
- return styles ? Object.entries( styles ) : [];
14
- } );
14
+ if ( 'elementId' in meta && meta.elementId ) {
15
+ elements = elements.filter( ( element ) => element.id === meta.elementId );
16
+ }
15
17
 
16
- return Object.fromEntries( entries );
18
+ return elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );
17
19
  },
18
20
  subscribe: ( cb ) => {
19
21
  return listenTo(
@@ -0,0 +1,12 @@
1
+ import { useEffect, useReducer } from 'react';
2
+
3
+ import { stylesRepository } from '../styles-repository';
4
+ import { type StyleProviderMeta } from '../utils/create-styles-repository';
5
+
6
+ export function useAllStylesByProvider( meta: StyleProviderMeta = {} ) {
7
+ const [ , rerender ] = useReducer( ( prev ) => ! prev, false );
8
+
9
+ useEffect( () => stylesRepository.subscribe( rerender ), [] );
10
+
11
+ return stylesRepository.allByProvider( meta );
12
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export { type StylesProvider } from './utils/create-styles-repository';
2
2
 
3
3
  export { stylesRepository } from './styles-repository';
4
+ export { useAllStylesByProvider } from './hooks/use-all-styles-by-provider';
5
+
6
+ export { ELEMENTS_STYLES_PROVIDER_KEY } from './elements-styles-provider';
4
7
 
5
8
  import { init } from './init';
6
9
 
package/src/init.ts CHANGED
@@ -2,5 +2,5 @@ import { elementsStylesProvider } from './elements-styles-provider';
2
2
  import { stylesRepository } from './styles-repository';
3
3
 
4
4
  export function init() {
5
- stylesRepository.registerProvider( 'elements', elementsStylesProvider );
5
+ stylesRepository.register( elementsStylesProvider );
6
6
  }
@@ -1,40 +1,48 @@
1
1
  import { createMockStyleDefinition } from 'test-utils';
2
- import { type StyleDefinitionsMap } from '@elementor/editor-styles';
2
+ import { type StyleDefinition } from '@elementor/editor-styles';
3
3
 
4
4
  import { createStylesRepository, type StylesProvider } from '../create-styles-repository';
5
5
 
6
6
  const styleDef1 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#dddddd' } } } );
7
7
  const styleDef2 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#eeeeee' } } } );
8
+ const styleDef3 = createMockStyleDefinition( { props: { color: { $$type: 'color', value: '#111111' } } } );
8
9
 
9
10
  describe( 'createStylesRepository', () => {
10
- it( 'should register and get all styles from all providers', () => {
11
+ it( 'should get all the style defs from all providers ordered by priority', () => {
11
12
  // Arrange
12
13
  const repo = createStylesRepository();
13
14
 
14
- repo.registerProvider( 'mock1', createMockProvider( { [ styleDef1.id ]: styleDef1 } ).provider );
15
- repo.registerProvider( 'mock2', createMockProvider( { [ styleDef2.id ]: styleDef2 } ).provider );
15
+ repo.register( createMockProvider( 'mock1', 10, [ styleDef1 ] ).provider );
16
+ repo.register( createMockProvider( 'mock2', 20, [ styleDef2 ] ).provider );
16
17
 
17
18
  // Assert
18
- expect( repo.all() ).toEqual( {
19
- [ styleDef1.id ]: styleDef1,
20
- [ styleDef2.id ]: styleDef2,
21
- } );
19
+ expect( repo.all() ).toEqual( [ styleDef2, styleDef1 ] );
20
+ } );
21
+
22
+ it( 'should get all the style defs grouped by providers', () => {
23
+ // Arrange
24
+ const repo = createStylesRepository();
25
+
26
+ repo.register( createMockProvider( 'mock1', 10, [ styleDef1 ] ).provider );
27
+ repo.register( createMockProvider( 'mock2', 20, [ styleDef2, styleDef3 ] ).provider );
28
+
29
+ // Assert
30
+ expect( repo.allByProvider() ).toEqual( [
31
+ [ 'mock2', [ styleDef2, styleDef3 ] ],
32
+ [ 'mock1', [ styleDef1 ] ],
33
+ ] );
22
34
  } );
23
35
 
24
36
  it( 'should subscribe and unsubscribe to all style providers', () => {
25
37
  // Arrange
26
38
  const repo = createStylesRepository();
27
39
 
28
- const { provider: mockStylesProvider1, notify: notify1 } = createMockProvider( {
29
- [ styleDef1.id ]: styleDef1,
30
- } );
40
+ const { provider: mockStylesProvider1, notify: notify1 } = createMockProvider( 'mock1', 10, [ styleDef1 ] );
31
41
 
32
- const { provider: mockStylesProvider2, notify: notify2 } = createMockProvider( {
33
- [ styleDef2.id ]: styleDef2,
34
- } );
42
+ const { provider: mockStylesProvider2, notify: notify2 } = createMockProvider( 'mock2', 10, [ styleDef2 ] );
35
43
 
36
- repo.registerProvider( 'mock1', mockStylesProvider1 );
37
- repo.registerProvider( 'mock2', mockStylesProvider2 );
44
+ repo.register( mockStylesProvider1 );
45
+ repo.register( mockStylesProvider2 );
38
46
 
39
47
  const cb = jest.fn();
40
48
  const unsubscribe = repo.subscribe( cb );
@@ -62,7 +70,7 @@ describe( 'createStylesRepository', () => {
62
70
  } );
63
71
  } );
64
72
 
65
- const createMockProvider = ( styleDefinitions: StyleDefinitionsMap ) => {
73
+ const createMockProvider = ( key: string, priority: number, styleDefinitions: StyleDefinition[] ) => {
66
74
  const subscribers = new Set< () => void >();
67
75
 
68
76
  const notify = () => {
@@ -70,6 +78,8 @@ const createMockProvider = ( styleDefinitions: StyleDefinitionsMap ) => {
70
78
  };
71
79
 
72
80
  const provider: StylesProvider = {
81
+ key,
82
+ priority,
73
83
  get: () => styleDefinitions,
74
84
  subscribe: ( cb ) => {
75
85
  subscribers.add( cb );
@@ -1,27 +1,35 @@
1
- import { type StyleDefinitionsMap } from '@elementor/editor-styles';
1
+ import { type StyleDefinition } from '@elementor/editor-styles';
2
+
3
+ export type StyleProviderMeta = Record< string, unknown >;
2
4
 
3
5
  export type StylesProvider = {
4
- get: () => StyleDefinitionsMap;
6
+ key: string;
7
+ priority: number;
8
+ get: ( meta?: StyleProviderMeta ) => StyleDefinition[];
5
9
  subscribe: ( callback: () => void ) => () => void;
6
10
  };
7
11
 
8
12
  export const createStylesRepository = () => {
9
- const providers = new Map< string, StylesProvider >();
13
+ const providers: StylesProvider[] = [];
14
+
15
+ const getProvidersByPriority = () => {
16
+ return providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );
17
+ };
10
18
 
11
- const registerProvider = ( key: string, provider: StylesProvider ) => {
12
- providers.set( key, provider );
19
+ const register = ( provider: StylesProvider ) => {
20
+ providers.push( provider );
13
21
  };
14
22
 
15
- const all = () => {
16
- return Array.from( providers.values() ).reduce< StyleDefinitionsMap >( ( acc, provider ) => {
17
- const styles = provider.get();
23
+ const allByProvider = ( meta: StyleProviderMeta = {} ) => {
24
+ return getProvidersByPriority().map( ( provider ) => [ provider.key, provider.get( meta ) ] as const );
25
+ };
18
26
 
19
- return { ...acc, ...styles };
20
- }, {} );
27
+ const all = ( meta: StyleProviderMeta = {} ) => {
28
+ return getProvidersByPriority().flatMap( ( provider ) => provider.get( meta ) );
21
29
  };
22
30
 
23
31
  const subscribe = ( cb: () => void ) => {
24
- const unsubscribes = Array.from( providers.values() ).map( ( provider ) => {
32
+ const unsubscribes = providers.map( ( provider ) => {
25
33
  return provider.subscribe( cb );
26
34
  } );
27
35
 
@@ -31,8 +39,9 @@ export const createStylesRepository = () => {
31
39
  };
32
40
 
33
41
  return {
34
- registerProvider,
35
42
  all,
43
+ allByProvider,
44
+ register,
36
45
  subscribe,
37
46
  };
38
47
  };