@elementor/editor-styles-repository 0.8.8 → 0.10.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,22 +1,22 @@
1
1
 
2
- > @elementor/editor-styles-repository@0.8.8 build
2
+ > @elementor/editor-styles-repository@0.10.0 build
3
3
  > tsup --config=../../tsup.build.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: ../../../tsconfig.json
7
- CLI tsup v8.4.0
7
+ CLI tsup v8.5.0
8
8
  CLI Using tsup config: /home/runner/work/elementor-packages/elementor-packages/tsup.build.ts
9
9
  CLI Target: esnext
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- ESM dist/index.mjs 7.72 KB
14
- ESM dist/index.mjs.map 15.08 KB
15
- ESM ⚡️ Build success in 172ms
16
- CJS dist/index.js 9.64 KB
17
- CJS dist/index.js.map 15.94 KB
18
- CJS ⚡️ Build success in 172ms
13
+ ESM dist/index.mjs 8.70 KB
14
+ ESM dist/index.mjs.map 17.15 KB
15
+ ESM ⚡️ Build success in 131ms
16
+ CJS dist/index.js 10.70 KB
17
+ CJS dist/index.js.map 18.08 KB
18
+ CJS ⚡️ Build success in 132ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 8375ms
21
- DTS dist/index.d.mts 3.35 KB
22
- DTS dist/index.d.ts 3.35 KB
20
+ DTS ⚡️ Build success in 8811ms
21
+ DTS dist/index.d.mts 3.88 KB
22
+ DTS dist/index.d.ts 3.88 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @elementor/editor-styles-repository
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6e1d5ff: Enforce capabilities on global classes.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [6e1d5ff]
12
+ - @elementor/editor-current-user@0.5.0
13
+
14
+ ## 0.9.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 15450a8: Allow render labels of global classes as css selector
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [27c4c1f]
23
+ - @elementor/editor-props@0.12.1
24
+ - @elementor/editor-elements@0.8.4
25
+ - @elementor/editor-styles@0.6.8
26
+
3
27
  ## 0.8.8
4
28
 
5
29
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -5,6 +5,12 @@ import { StyleDefinition, StyleDefinitionID, StyleDefinitionVariant } from '@ele
5
5
  type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
6
6
  type Meta = Record<string, unknown>;
7
7
  type UpdateActionPayload = MakeOptional<StyleDefinition, 'label' | 'variants' | 'type'>;
8
+ type UserCapabilities = {
9
+ create: string;
10
+ delete: string;
11
+ update: string;
12
+ updateProps: string;
13
+ };
8
14
  type UpdatePropsActionPayload = {
9
15
  id: StyleDefinitionID;
10
16
  meta: StyleDefinitionVariant['meta'];
@@ -22,11 +28,13 @@ type StylesProvider = {
22
28
  actions: {
23
29
  all: (meta?: Meta) => StyleDefinition[];
24
30
  get: (id: StyleDefinitionID, meta?: Meta) => StyleDefinition | null;
31
+ resolveCssName: (id: StyleDefinitionID) => string;
25
32
  create?: (label: StyleDefinition['label']) => StyleDefinitionID;
26
33
  delete?: (id: StyleDefinitionID) => void;
27
34
  update?: (data: UpdateActionPayload) => void;
28
35
  updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
29
36
  };
37
+ capabilities?: UserCapabilities;
30
38
  };
31
39
 
32
40
  declare const stylesRepository: {
@@ -43,6 +51,13 @@ type CreateAction = Required<StylesProvider['actions']>['create'];
43
51
  type CreateTuple = [StylesProvider, CreateAction];
44
52
  declare function useGetStylesRepositoryCreateAction(): CreateTuple | null;
45
53
 
54
+ type UserCan = {
55
+ [key in keyof UserCapabilities]: boolean;
56
+ };
57
+ declare const useUserStylesCapability: () => {
58
+ userCan: (providerKey: string) => UserCan;
59
+ };
60
+
46
61
  type ValidationEvent = 'inputChange' | 'create' | 'rename';
47
62
  type ValidationResult = {
48
63
  isValid: true;
@@ -65,13 +80,15 @@ type CreateStylesProviderOptions = {
65
80
  actions: {
66
81
  all: StylesProvider['actions']['all'];
67
82
  get: StylesProvider['actions']['get'];
83
+ resolveCssName?: StylesProvider['actions']['resolveCssName'];
68
84
  create?: StylesProvider['actions']['create'];
69
85
  delete?: StylesProvider['actions']['delete'];
70
86
  update?: StylesProvider['actions']['update'];
71
87
  updateProps?: StylesProvider['actions']['updateProps'];
72
88
  };
89
+ capabilities?: UserCapabilities;
73
90
  };
74
- declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, }: CreateStylesProviderOptions): StylesProvider;
91
+ declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, capabilities, }: CreateStylesProviderOptions): StylesProvider;
75
92
 
76
93
  declare function isElementsStylesProvider(key: string): boolean;
77
94
 
@@ -82,4 +99,4 @@ declare const ELEMENTS_STYLES_RESERVED_LABEL = "local";
82
99
 
83
100
  declare function init(): void;
84
101
 
85
- export { type CreateStylesProviderOptions, ELEMENTS_BASE_STYLES_PROVIDER_KEY, ELEMENTS_STYLES_PROVIDER_KEY_PREFIX, ELEMENTS_STYLES_RESERVED_LABEL, type Meta, type StylesProvider, type UpdateActionPayload, type UpdatePropsActionPayload, createStylesProvider, init, isElementsStylesProvider, stylesRepository, useGetStylesRepositoryCreateAction, useProviders, validateStyleLabel };
102
+ export { type CreateStylesProviderOptions, ELEMENTS_BASE_STYLES_PROVIDER_KEY, ELEMENTS_STYLES_PROVIDER_KEY_PREFIX, ELEMENTS_STYLES_RESERVED_LABEL, type Meta, type StylesProvider, type UpdateActionPayload, type UpdatePropsActionPayload, type UserCapabilities, createStylesProvider, init, isElementsStylesProvider, stylesRepository, useGetStylesRepositoryCreateAction, useProviders, useUserStylesCapability, validateStyleLabel };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,12 @@ import { StyleDefinition, StyleDefinitionID, StyleDefinitionVariant } from '@ele
5
5
  type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
6
6
  type Meta = Record<string, unknown>;
7
7
  type UpdateActionPayload = MakeOptional<StyleDefinition, 'label' | 'variants' | 'type'>;
8
+ type UserCapabilities = {
9
+ create: string;
10
+ delete: string;
11
+ update: string;
12
+ updateProps: string;
13
+ };
8
14
  type UpdatePropsActionPayload = {
9
15
  id: StyleDefinitionID;
10
16
  meta: StyleDefinitionVariant['meta'];
@@ -22,11 +28,13 @@ type StylesProvider = {
22
28
  actions: {
23
29
  all: (meta?: Meta) => StyleDefinition[];
24
30
  get: (id: StyleDefinitionID, meta?: Meta) => StyleDefinition | null;
31
+ resolveCssName: (id: StyleDefinitionID) => string;
25
32
  create?: (label: StyleDefinition['label']) => StyleDefinitionID;
26
33
  delete?: (id: StyleDefinitionID) => void;
27
34
  update?: (data: UpdateActionPayload) => void;
28
35
  updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
29
36
  };
37
+ capabilities?: UserCapabilities;
30
38
  };
31
39
 
32
40
  declare const stylesRepository: {
@@ -43,6 +51,13 @@ type CreateAction = Required<StylesProvider['actions']>['create'];
43
51
  type CreateTuple = [StylesProvider, CreateAction];
44
52
  declare function useGetStylesRepositoryCreateAction(): CreateTuple | null;
45
53
 
54
+ type UserCan = {
55
+ [key in keyof UserCapabilities]: boolean;
56
+ };
57
+ declare const useUserStylesCapability: () => {
58
+ userCan: (providerKey: string) => UserCan;
59
+ };
60
+
46
61
  type ValidationEvent = 'inputChange' | 'create' | 'rename';
47
62
  type ValidationResult = {
48
63
  isValid: true;
@@ -65,13 +80,15 @@ type CreateStylesProviderOptions = {
65
80
  actions: {
66
81
  all: StylesProvider['actions']['all'];
67
82
  get: StylesProvider['actions']['get'];
83
+ resolveCssName?: StylesProvider['actions']['resolveCssName'];
68
84
  create?: StylesProvider['actions']['create'];
69
85
  delete?: StylesProvider['actions']['delete'];
70
86
  update?: StylesProvider['actions']['update'];
71
87
  updateProps?: StylesProvider['actions']['updateProps'];
72
88
  };
89
+ capabilities?: UserCapabilities;
73
90
  };
74
- declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, }: CreateStylesProviderOptions): StylesProvider;
91
+ declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, capabilities, }: CreateStylesProviderOptions): StylesProvider;
75
92
 
76
93
  declare function isElementsStylesProvider(key: string): boolean;
77
94
 
@@ -82,4 +99,4 @@ declare const ELEMENTS_STYLES_RESERVED_LABEL = "local";
82
99
 
83
100
  declare function init(): void;
84
101
 
85
- export { type CreateStylesProviderOptions, ELEMENTS_BASE_STYLES_PROVIDER_KEY, ELEMENTS_STYLES_PROVIDER_KEY_PREFIX, ELEMENTS_STYLES_RESERVED_LABEL, type Meta, type StylesProvider, type UpdateActionPayload, type UpdatePropsActionPayload, createStylesProvider, init, isElementsStylesProvider, stylesRepository, useGetStylesRepositoryCreateAction, useProviders, validateStyleLabel };
102
+ export { type CreateStylesProviderOptions, ELEMENTS_BASE_STYLES_PROVIDER_KEY, ELEMENTS_STYLES_PROVIDER_KEY_PREFIX, ELEMENTS_STYLES_RESERVED_LABEL, type Meta, type StylesProvider, type UpdateActionPayload, type UpdatePropsActionPayload, type UserCapabilities, createStylesProvider, init, isElementsStylesProvider, stylesRepository, useGetStylesRepositoryCreateAction, useProviders, useUserStylesCapability, validateStyleLabel };
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ __export(index_exports, {
29
29
  stylesRepository: () => stylesRepository,
30
30
  useGetStylesRepositoryCreateAction: () => useGetStylesRepositoryCreateAction,
31
31
  useProviders: () => useProviders,
32
+ useUserStylesCapability: () => useUserStylesCapability,
32
33
  validateStyleLabel: () => validateStyleLabel
33
34
  });
34
35
  module.exports = __toCommonJS(index_exports);
@@ -78,14 +79,43 @@ function useProviders() {
78
79
 
79
80
  // src/hooks/use-get-styles-repository-create-action.ts
80
81
  var import_react2 = require("react");
82
+
83
+ // src/hooks/use-user-styles-capability.ts
84
+ var import_editor_current_user = require("@elementor/editor-current-user");
85
+ var DEFAULT_CAPABILITIES = {
86
+ create: true,
87
+ delete: true,
88
+ update: true,
89
+ updateProps: true
90
+ };
91
+ var useUserStylesCapability = () => {
92
+ const { capabilities } = (0, import_editor_current_user.useCurrentUserCapabilities)();
93
+ const userCan = (providerKey) => {
94
+ const provider = stylesRepository.getProviderByKey(providerKey);
95
+ if (!provider?.capabilities) {
96
+ return DEFAULT_CAPABILITIES;
97
+ }
98
+ return Object.entries(provider.capabilities).reduce(
99
+ (acc, [key, capability]) => ({
100
+ ...acc,
101
+ [key]: capabilities?.includes(capability) ?? true
102
+ }),
103
+ DEFAULT_CAPABILITIES
104
+ );
105
+ };
106
+ return { userCan };
107
+ };
108
+
109
+ // src/hooks/use-get-styles-repository-create-action.ts
81
110
  function useGetStylesRepositoryCreateAction() {
111
+ const { userCan } = useUserStylesCapability();
82
112
  return (0, import_react2.useMemo)(() => {
83
113
  const createActions = stylesRepository.getProviders().map((provider) => {
84
- if (!provider.actions.create) {
114
+ if (!provider.actions.create || !userCan(provider.getKey()).create) {
85
115
  return null;
86
116
  }
87
117
  return [provider, provider.actions.create];
88
- }).filter((item) => !!item);
118
+ }).filter(Boolean);
89
119
  if (createActions.length === 1) {
90
120
  return createActions[0];
91
121
  } else if (createActions.length === 0) {
@@ -124,12 +154,14 @@ function createStylesProvider({
124
154
  subscribe = () => () => {
125
155
  },
126
156
  labels,
127
- actions
157
+ actions,
158
+ capabilities
128
159
  }) {
129
160
  return {
130
161
  getKey: typeof key === "string" ? () => key : key,
131
162
  priority,
132
163
  limit,
164
+ capabilities,
133
165
  subscribe,
134
166
  labels: {
135
167
  singular: labels?.singular ?? null,
@@ -138,6 +170,7 @@ function createStylesProvider({
138
170
  actions: {
139
171
  all: actions.all,
140
172
  get: actions.get,
173
+ resolveCssName: actions.resolveCssName ?? ((id) => id),
141
174
  create: actions.create,
142
175
  delete: actions.delete,
143
176
  update: actions.update,
@@ -269,6 +302,7 @@ function init() {
269
302
  stylesRepository,
270
303
  useGetStylesRepositoryCreateAction,
271
304
  useProviders,
305
+ useUserStylesCapability,
272
306
  validateStyleLabel
273
307
  });
274
308
  //# 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/hooks/use-providers.ts","../src/hooks/use-get-styles-repository-create-action.ts","../src/utils/validate-style-label.ts","../src/providers/document-elements-styles-provider.ts","../src/errors.ts","../src/utils/create-styles-provider.ts","../src/utils/is-elements-styles-provider.ts","../src/providers/element-base-styles-provider.ts","../src/init.ts"],"sourcesContent":["export * from './types';\n\nexport { stylesRepository } from './styles-repository';\nexport { useProviders } from './hooks/use-providers';\nexport { useGetStylesRepositoryCreateAction } from './hooks/use-get-styles-repository-create-action';\nexport { validateStyleLabel } from './utils/validate-style-label';\nexport { createStylesProvider, type CreateStylesProviderOptions } from './utils/create-styles-provider';\nexport { isElementsStylesProvider } from './utils/is-elements-styles-provider';\n\nexport { ELEMENTS_BASE_STYLES_PROVIDER_KEY } from './providers/element-base-styles-provider';\nexport {\n\tELEMENTS_STYLES_PROVIDER_KEY_PREFIX,\n\tELEMENTS_STYLES_RESERVED_LABEL,\n} from './providers/document-elements-styles-provider';\n\nexport { init } from './init';\n","import { type Meta, type StylesProvider } from '../types';\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\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 all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all( 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\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.getKey() === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\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';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../types';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useGetStylesRepositoryCreateAction() {\n\treturn useMemo( () => {\n\t\tconst createActions = stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\n\t\tif ( createActions.length === 1 ) {\n\t\t\treturn createActions[ 0 ];\n\t\t} else if ( createActions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error( 'Multiple providers with create action found in styles repository.' );\n\t}, [] );\n}\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nimport { ELEMENTS_STYLES_RESERVED_LABEL } from '../providers/document-elements-styles-provider';\nimport { stylesRepository } from '../styles-repository';\n\nconst NO_START_DIGIT_REGEX = /^(|[^0-9].*)$/;\nconst NO_SPACES_REGEX = /^\\S*$/;\nconst NO_SPECIAL_CHARS_REGEX = /^(|[a-zA-Z0-9_-]+)$/;\nconst NO_DOUBLE_HYPHEN_START_REGEX = /^(?!--).*/;\nconst NO_HYPHEN_DIGIT_START_REGEX = /^(?!-[0-9])/;\n\nconst RESERVED_CLASS_NAMES = [ 'container' ];\n\nconst schema = z\n\t.string()\n\t.max( 50, __( 'Class name is too long. Please keep it under 50 characters.', 'elementor' ) )\n\t.regex( NO_START_DIGIT_REGEX, __( 'Class names must start with a letter.', 'elementor' ) )\n\t.regex( NO_SPACES_REGEX, __( 'Class names can’t contain spaces.', 'elementor' ) )\n\t.regex(\n\t\tNO_SPECIAL_CHARS_REGEX,\n\t\t__( 'Class names can only use letters, numbers, dashes (-), and underscores (_).', 'elementor' )\n\t)\n\t.regex( NO_DOUBLE_HYPHEN_START_REGEX, __( 'Double hyphens are reserved for custom properties.', 'elementor' ) )\n\t.regex(\n\t\tNO_HYPHEN_DIGIT_START_REGEX,\n\t\t__( 'Class names can’t start with a hyphen followed by a number.', 'elementor' )\n\t)\n\t.refine( ( value ) => ! RESERVED_CLASS_NAMES.includes( value ), {\n\t\tmessage: __( 'This name is reserved and can’t be used. Try something more specific.', 'elementor' ),\n\t} );\n\ntype ValidationEvent = 'inputChange' | 'create' | 'rename';\ntype ValidationResult = { isValid: true; errorMessage: null } | { isValid: false; errorMessage: string };\n\nexport function validateStyleLabel( label: string, event: ValidationEvent | 'rename' ): ValidationResult {\n\tconst existingLabels = new Set( [\n\t\tELEMENTS_STYLES_RESERVED_LABEL,\n\t\t...stylesRepository.all().map( ( styleDef ) => styleDef.label.toLowerCase() ),\n\t] );\n\n\tconst fullValidationEvent = [ 'create', 'rename' ].includes( event );\n\n\tconst result = schema\n\t\t.refine( ( value ) => ! ( fullValidationEvent && value.length < 2 ), {\n\t\t\tmessage: __( 'Class name is too short. Use at least 2 characters.', 'elementor' ),\n\t\t} )\n\t\t.refine( ( value ) => ! ( fullValidationEvent && existingLabels.has( value ) ), {\n\t\t\tmessage: __( 'This class name already exists. Please choose a unique name.', 'elementor' ),\n\t\t} )\n\t\t.safeParse( label.toLowerCase() );\n\n\tif ( result.success ) {\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\terrorMessage: null,\n\t\t};\n\t}\n\n\treturn {\n\t\tisValid: false,\n\t\terrorMessage: result.error.format()._errors[ 0 ],\n\t};\n}\n","import {\n\tgetCurrentDocumentId,\n\tgetElements,\n\tgetElementStyles,\n\tstyleRerenderEvents,\n\tupdateElementStyle,\n} from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { ActiveDocumentMustExistError, InvalidElementsStyleProviderMetaError } from '../errors';\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY_PREFIX = 'document-elements-';\nexport const ELEMENTS_STYLES_RESERVED_LABEL = 'local';\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nexport const documentElementsStylesProvider = createStylesProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tthrow new ActiveDocumentMustExistError();\n\t\t}\n\n\t\treturn `${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n\tactions: {\n\t\tall: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tget: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n} );\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n\nexport const ActiveDocumentMustExistError = createError( {\n\tcode: 'active_document_must_exist',\n\tmessage: 'Active document must exist.',\n} );\n","import { type StylesProvider } from '../types';\n\nexport type CreateStylesProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tlimit?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n\tactions: {\n\t\tall: StylesProvider[ 'actions' ][ 'all' ];\n\t\tget: StylesProvider[ 'actions' ][ 'get' ];\n\t\tcreate?: StylesProvider[ 'actions' ][ 'create' ];\n\t\tdelete?: StylesProvider[ 'actions' ][ 'delete' ];\n\t\tupdate?: StylesProvider[ 'actions' ][ 'update' ];\n\t\tupdateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];\n\t};\n};\n\nconst DEFAULT_LIMIT = 10000;\nconst DEFAULT_PRIORITY = 10;\n\nexport function createStylesProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tlimit = DEFAULT_LIMIT,\n\tsubscribe = () => () => {},\n\tlabels,\n\tactions,\n}: CreateStylesProviderOptions ): StylesProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tlimit,\n\t\tsubscribe,\n\t\tlabels: {\n\t\t\tsingular: labels?.singular ?? null,\n\t\t\tplural: labels?.plural ?? null,\n\t\t},\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t\tget: actions.get,\n\t\t\tcreate: actions.create,\n\t\t\tdelete: actions.delete,\n\t\t\tupdate: actions.update,\n\t\t\tupdateProps: actions.updateProps,\n\t\t},\n\t};\n}\n","import { ELEMENTS_STYLES_PROVIDER_KEY_PREFIX } from '../providers/document-elements-styles-provider';\n\nexport function isElementsStylesProvider( key: string ) {\n\treturn new RegExp( `^${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }\\\\d+$` ).test( key );\n}\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider = createStylesProvider( {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tactions: {\n\t\tall() {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) =>\n\t\t\t\tObject.values( widget.base_styles ?? {} )\n\t\t\t);\n\t\t},\n\n\t\tget( id ) {\n\t\t\treturn this.all().find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { documentElementsStylesProvider } from './providers/document-elements-styles-provider';\nimport { elementBaseStylesProvider } from './providers/element-base-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( documentElementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n"],"mappings":"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","names":["import_react","listenTo","import_editor_elements"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-providers.ts","../src/hooks/use-get-styles-repository-create-action.ts","../src/hooks/use-user-styles-capability.ts","../src/utils/validate-style-label.ts","../src/providers/document-elements-styles-provider.ts","../src/errors.ts","../src/utils/create-styles-provider.ts","../src/utils/is-elements-styles-provider.ts","../src/providers/element-base-styles-provider.ts","../src/init.ts"],"sourcesContent":["export * from './types';\n\nexport { stylesRepository } from './styles-repository';\nexport { useProviders } from './hooks/use-providers';\nexport { useGetStylesRepositoryCreateAction } from './hooks/use-get-styles-repository-create-action';\nexport { useUserStylesCapability } from './hooks/use-user-styles-capability';\nexport { validateStyleLabel } from './utils/validate-style-label';\nexport { createStylesProvider, type CreateStylesProviderOptions } from './utils/create-styles-provider';\nexport { isElementsStylesProvider } from './utils/is-elements-styles-provider';\n\nexport { ELEMENTS_BASE_STYLES_PROVIDER_KEY } from './providers/element-base-styles-provider';\nexport {\n\tELEMENTS_STYLES_PROVIDER_KEY_PREFIX,\n\tELEMENTS_STYLES_RESERVED_LABEL,\n} from './providers/document-elements-styles-provider';\n\nexport { init } from './init';\n","import { type Meta, type StylesProvider } from '../types';\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\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 all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all( 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\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.getKey() === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\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';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../types';\nimport { useUserStylesCapability } from './use-user-styles-capability';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useGetStylesRepositoryCreateAction() {\n\tconst { userCan } = useUserStylesCapability();\n\n\treturn useMemo( () => {\n\t\tconst createActions = stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create || ! userCan( provider.getKey() ).create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( Boolean );\n\n\t\tif ( createActions.length === 1 ) {\n\t\t\treturn createActions[ 0 ];\n\t\t} else if ( createActions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error( 'Multiple providers with create action found in styles repository.' );\n\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [] );\n}\n","import { useCurrentUserCapabilities } from '@elementor/editor-current-user';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type UserCapabilities } from '../types';\n\ntype UserCan = {\n\t[ key in keyof UserCapabilities ]: boolean;\n};\n\nconst DEFAULT_CAPABILITIES: UserCan = {\n\tcreate: true,\n\tdelete: true,\n\tupdate: true,\n\tupdateProps: true,\n};\n\nexport const useUserStylesCapability = () => {\n\tconst { capabilities } = useCurrentUserCapabilities();\n\n\tconst userCan = ( providerKey: string ): UserCan => {\n\t\tconst provider = stylesRepository.getProviderByKey( providerKey );\n\n\t\tif ( ! provider?.capabilities ) {\n\t\t\treturn DEFAULT_CAPABILITIES;\n\t\t}\n\n\t\treturn Object.entries( provider.capabilities ).reduce(\n\t\t\t( acc, [ key, capability ] ) => ( {\n\t\t\t\t...acc,\n\t\t\t\t[ key ]: capabilities?.includes( capability ) ?? true,\n\t\t\t} ),\n\t\t\tDEFAULT_CAPABILITIES\n\t\t);\n\t};\n\n\treturn { userCan };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nimport { ELEMENTS_STYLES_RESERVED_LABEL } from '../providers/document-elements-styles-provider';\nimport { stylesRepository } from '../styles-repository';\n\nconst NO_START_DIGIT_REGEX = /^(|[^0-9].*)$/;\nconst NO_SPACES_REGEX = /^\\S*$/;\nconst NO_SPECIAL_CHARS_REGEX = /^(|[a-zA-Z0-9_-]+)$/;\nconst NO_DOUBLE_HYPHEN_START_REGEX = /^(?!--).*/;\nconst NO_HYPHEN_DIGIT_START_REGEX = /^(?!-[0-9])/;\n\nconst RESERVED_CLASS_NAMES = [ 'container' ];\n\nconst schema = z\n\t.string()\n\t.max( 50, __( 'Class name is too long. Please keep it under 50 characters.', 'elementor' ) )\n\t.regex( NO_START_DIGIT_REGEX, __( 'Class names must start with a letter.', 'elementor' ) )\n\t.regex( NO_SPACES_REGEX, __( 'Class names can’t contain spaces.', 'elementor' ) )\n\t.regex(\n\t\tNO_SPECIAL_CHARS_REGEX,\n\t\t__( 'Class names can only use letters, numbers, dashes (-), and underscores (_).', 'elementor' )\n\t)\n\t.regex( NO_DOUBLE_HYPHEN_START_REGEX, __( 'Double hyphens are reserved for custom properties.', 'elementor' ) )\n\t.regex(\n\t\tNO_HYPHEN_DIGIT_START_REGEX,\n\t\t__( 'Class names can’t start with a hyphen followed by a number.', 'elementor' )\n\t)\n\t.refine( ( value ) => ! RESERVED_CLASS_NAMES.includes( value ), {\n\t\tmessage: __( 'This name is reserved and can’t be used. Try something more specific.', 'elementor' ),\n\t} );\n\ntype ValidationEvent = 'inputChange' | 'create' | 'rename';\ntype ValidationResult = { isValid: true; errorMessage: null } | { isValid: false; errorMessage: string };\n\nexport function validateStyleLabel( label: string, event: ValidationEvent | 'rename' ): ValidationResult {\n\tconst existingLabels = new Set( [\n\t\tELEMENTS_STYLES_RESERVED_LABEL,\n\t\t...stylesRepository.all().map( ( styleDef ) => styleDef.label.toLowerCase() ),\n\t] );\n\n\tconst fullValidationEvent = [ 'create', 'rename' ].includes( event );\n\n\tconst result = schema\n\t\t.refine( ( value ) => ! ( fullValidationEvent && value.length < 2 ), {\n\t\t\tmessage: __( 'Class name is too short. Use at least 2 characters.', 'elementor' ),\n\t\t} )\n\t\t.refine( ( value ) => ! ( fullValidationEvent && existingLabels.has( value ) ), {\n\t\t\tmessage: __( 'This class name already exists. Please choose a unique name.', 'elementor' ),\n\t\t} )\n\t\t.safeParse( label.toLowerCase() );\n\n\tif ( result.success ) {\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\terrorMessage: null,\n\t\t};\n\t}\n\n\treturn {\n\t\tisValid: false,\n\t\terrorMessage: result.error.format()._errors[ 0 ],\n\t};\n}\n","import {\n\tgetCurrentDocumentId,\n\tgetElements,\n\tgetElementStyles,\n\tstyleRerenderEvents,\n\tupdateElementStyle,\n} from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { ActiveDocumentMustExistError, InvalidElementsStyleProviderMetaError } from '../errors';\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY_PREFIX = 'document-elements-';\nexport const ELEMENTS_STYLES_RESERVED_LABEL = 'local';\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nexport const documentElementsStylesProvider = createStylesProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tthrow new ActiveDocumentMustExistError();\n\t\t}\n\n\t\treturn `${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n\tactions: {\n\t\tall: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tget: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n} );\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n\nexport const ActiveDocumentMustExistError = createError( {\n\tcode: 'active_document_must_exist',\n\tmessage: 'Active document must exist.',\n} );\n","import { type StylesProvider, type UserCapabilities } from '../types';\n\nexport type CreateStylesProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tlimit?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n\tactions: {\n\t\tall: StylesProvider[ 'actions' ][ 'all' ];\n\t\tget: StylesProvider[ 'actions' ][ 'get' ];\n\t\tresolveCssName?: StylesProvider[ 'actions' ][ 'resolveCssName' ];\n\t\tcreate?: StylesProvider[ 'actions' ][ 'create' ];\n\t\tdelete?: StylesProvider[ 'actions' ][ 'delete' ];\n\t\tupdate?: StylesProvider[ 'actions' ][ 'update' ];\n\t\tupdateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];\n\t};\n\tcapabilities?: UserCapabilities;\n};\n\nconst DEFAULT_LIMIT = 10000;\nconst DEFAULT_PRIORITY = 10;\n\nexport function createStylesProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tlimit = DEFAULT_LIMIT,\n\tsubscribe = () => () => {},\n\tlabels,\n\tactions,\n\tcapabilities,\n}: CreateStylesProviderOptions ): StylesProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tlimit,\n\t\tcapabilities,\n\t\tsubscribe,\n\t\tlabels: {\n\t\t\tsingular: labels?.singular ?? null,\n\t\t\tplural: labels?.plural ?? null,\n\t\t},\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t\tget: actions.get,\n\t\t\tresolveCssName: actions.resolveCssName ?? ( ( id ) => id ),\n\t\t\tcreate: actions.create,\n\t\t\tdelete: actions.delete,\n\t\t\tupdate: actions.update,\n\t\t\tupdateProps: actions.updateProps,\n\t\t},\n\t};\n}\n","import { ELEMENTS_STYLES_PROVIDER_KEY_PREFIX } from '../providers/document-elements-styles-provider';\n\nexport function isElementsStylesProvider( key: string ) {\n\treturn new RegExp( `^${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }\\\\d+$` ).test( key );\n}\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider = createStylesProvider( {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tactions: {\n\t\tall() {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) =>\n\t\t\t\tObject.values( widget.base_styles ?? {} )\n\t\t\t);\n\t\t},\n\n\t\tget( id ) {\n\t\t\treturn this.all().find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { documentElementsStylesProvider } from './providers/document-elements-styles-provider';\nimport { elementBaseStylesProvider } from './providers/element-base-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( documentElementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n"],"mappings":"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","names":["import_react","listenTo","import_editor_elements"]}
package/dist/index.mjs CHANGED
@@ -43,14 +43,43 @@ function useProviders() {
43
43
 
44
44
  // src/hooks/use-get-styles-repository-create-action.ts
45
45
  import { useMemo } from "react";
46
+
47
+ // src/hooks/use-user-styles-capability.ts
48
+ import { useCurrentUserCapabilities } from "@elementor/editor-current-user";
49
+ var DEFAULT_CAPABILITIES = {
50
+ create: true,
51
+ delete: true,
52
+ update: true,
53
+ updateProps: true
54
+ };
55
+ var useUserStylesCapability = () => {
56
+ const { capabilities } = useCurrentUserCapabilities();
57
+ const userCan = (providerKey) => {
58
+ const provider = stylesRepository.getProviderByKey(providerKey);
59
+ if (!provider?.capabilities) {
60
+ return DEFAULT_CAPABILITIES;
61
+ }
62
+ return Object.entries(provider.capabilities).reduce(
63
+ (acc, [key, capability]) => ({
64
+ ...acc,
65
+ [key]: capabilities?.includes(capability) ?? true
66
+ }),
67
+ DEFAULT_CAPABILITIES
68
+ );
69
+ };
70
+ return { userCan };
71
+ };
72
+
73
+ // src/hooks/use-get-styles-repository-create-action.ts
46
74
  function useGetStylesRepositoryCreateAction() {
75
+ const { userCan } = useUserStylesCapability();
47
76
  return useMemo(() => {
48
77
  const createActions = stylesRepository.getProviders().map((provider) => {
49
- if (!provider.actions.create) {
78
+ if (!provider.actions.create || !userCan(provider.getKey()).create) {
50
79
  return null;
51
80
  }
52
81
  return [provider, provider.actions.create];
53
- }).filter((item) => !!item);
82
+ }).filter(Boolean);
54
83
  if (createActions.length === 1) {
55
84
  return createActions[0];
56
85
  } else if (createActions.length === 0) {
@@ -95,12 +124,14 @@ function createStylesProvider({
95
124
  subscribe = () => () => {
96
125
  },
97
126
  labels,
98
- actions
127
+ actions,
128
+ capabilities
99
129
  }) {
100
130
  return {
101
131
  getKey: typeof key === "string" ? () => key : key,
102
132
  priority,
103
133
  limit,
134
+ capabilities,
104
135
  subscribe,
105
136
  labels: {
106
137
  singular: labels?.singular ?? null,
@@ -109,6 +140,7 @@ function createStylesProvider({
109
140
  actions: {
110
141
  all: actions.all,
111
142
  get: actions.get,
143
+ resolveCssName: actions.resolveCssName ?? ((id) => id),
112
144
  create: actions.create,
113
145
  delete: actions.delete,
114
146
  update: actions.update,
@@ -239,6 +271,7 @@ export {
239
271
  stylesRepository,
240
272
  useGetStylesRepositoryCreateAction,
241
273
  useProviders,
274
+ useUserStylesCapability,
242
275
  validateStyleLabel
243
276
  };
244
277
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-providers.ts","../src/hooks/use-get-styles-repository-create-action.ts","../src/utils/validate-style-label.ts","../src/providers/document-elements-styles-provider.ts","../src/errors.ts","../src/utils/create-styles-provider.ts","../src/utils/is-elements-styles-provider.ts","../src/providers/element-base-styles-provider.ts","../src/init.ts"],"sourcesContent":["import { type Meta, type StylesProvider } from '../types';\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\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 all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all( 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\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.getKey() === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\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';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../types';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useGetStylesRepositoryCreateAction() {\n\treturn useMemo( () => {\n\t\tconst createActions = stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( ( item ) => !! item );\n\n\t\tif ( createActions.length === 1 ) {\n\t\t\treturn createActions[ 0 ];\n\t\t} else if ( createActions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error( 'Multiple providers with create action found in styles repository.' );\n\t}, [] );\n}\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nimport { ELEMENTS_STYLES_RESERVED_LABEL } from '../providers/document-elements-styles-provider';\nimport { stylesRepository } from '../styles-repository';\n\nconst NO_START_DIGIT_REGEX = /^(|[^0-9].*)$/;\nconst NO_SPACES_REGEX = /^\\S*$/;\nconst NO_SPECIAL_CHARS_REGEX = /^(|[a-zA-Z0-9_-]+)$/;\nconst NO_DOUBLE_HYPHEN_START_REGEX = /^(?!--).*/;\nconst NO_HYPHEN_DIGIT_START_REGEX = /^(?!-[0-9])/;\n\nconst RESERVED_CLASS_NAMES = [ 'container' ];\n\nconst schema = z\n\t.string()\n\t.max( 50, __( 'Class name is too long. Please keep it under 50 characters.', 'elementor' ) )\n\t.regex( NO_START_DIGIT_REGEX, __( 'Class names must start with a letter.', 'elementor' ) )\n\t.regex( NO_SPACES_REGEX, __( 'Class names can’t contain spaces.', 'elementor' ) )\n\t.regex(\n\t\tNO_SPECIAL_CHARS_REGEX,\n\t\t__( 'Class names can only use letters, numbers, dashes (-), and underscores (_).', 'elementor' )\n\t)\n\t.regex( NO_DOUBLE_HYPHEN_START_REGEX, __( 'Double hyphens are reserved for custom properties.', 'elementor' ) )\n\t.regex(\n\t\tNO_HYPHEN_DIGIT_START_REGEX,\n\t\t__( 'Class names can’t start with a hyphen followed by a number.', 'elementor' )\n\t)\n\t.refine( ( value ) => ! RESERVED_CLASS_NAMES.includes( value ), {\n\t\tmessage: __( 'This name is reserved and can’t be used. Try something more specific.', 'elementor' ),\n\t} );\n\ntype ValidationEvent = 'inputChange' | 'create' | 'rename';\ntype ValidationResult = { isValid: true; errorMessage: null } | { isValid: false; errorMessage: string };\n\nexport function validateStyleLabel( label: string, event: ValidationEvent | 'rename' ): ValidationResult {\n\tconst existingLabels = new Set( [\n\t\tELEMENTS_STYLES_RESERVED_LABEL,\n\t\t...stylesRepository.all().map( ( styleDef ) => styleDef.label.toLowerCase() ),\n\t] );\n\n\tconst fullValidationEvent = [ 'create', 'rename' ].includes( event );\n\n\tconst result = schema\n\t\t.refine( ( value ) => ! ( fullValidationEvent && value.length < 2 ), {\n\t\t\tmessage: __( 'Class name is too short. Use at least 2 characters.', 'elementor' ),\n\t\t} )\n\t\t.refine( ( value ) => ! ( fullValidationEvent && existingLabels.has( value ) ), {\n\t\t\tmessage: __( 'This class name already exists. Please choose a unique name.', 'elementor' ),\n\t\t} )\n\t\t.safeParse( label.toLowerCase() );\n\n\tif ( result.success ) {\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\terrorMessage: null,\n\t\t};\n\t}\n\n\treturn {\n\t\tisValid: false,\n\t\terrorMessage: result.error.format()._errors[ 0 ],\n\t};\n}\n","import {\n\tgetCurrentDocumentId,\n\tgetElements,\n\tgetElementStyles,\n\tstyleRerenderEvents,\n\tupdateElementStyle,\n} from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { ActiveDocumentMustExistError, InvalidElementsStyleProviderMetaError } from '../errors';\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY_PREFIX = 'document-elements-';\nexport const ELEMENTS_STYLES_RESERVED_LABEL = 'local';\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nexport const documentElementsStylesProvider = createStylesProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tthrow new ActiveDocumentMustExistError();\n\t\t}\n\n\t\treturn `${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n\tactions: {\n\t\tall: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tget: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n} );\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n\nexport const ActiveDocumentMustExistError = createError( {\n\tcode: 'active_document_must_exist',\n\tmessage: 'Active document must exist.',\n} );\n","import { type StylesProvider } from '../types';\n\nexport type CreateStylesProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tlimit?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n\tactions: {\n\t\tall: StylesProvider[ 'actions' ][ 'all' ];\n\t\tget: StylesProvider[ 'actions' ][ 'get' ];\n\t\tcreate?: StylesProvider[ 'actions' ][ 'create' ];\n\t\tdelete?: StylesProvider[ 'actions' ][ 'delete' ];\n\t\tupdate?: StylesProvider[ 'actions' ][ 'update' ];\n\t\tupdateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];\n\t};\n};\n\nconst DEFAULT_LIMIT = 10000;\nconst DEFAULT_PRIORITY = 10;\n\nexport function createStylesProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tlimit = DEFAULT_LIMIT,\n\tsubscribe = () => () => {},\n\tlabels,\n\tactions,\n}: CreateStylesProviderOptions ): StylesProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tlimit,\n\t\tsubscribe,\n\t\tlabels: {\n\t\t\tsingular: labels?.singular ?? null,\n\t\t\tplural: labels?.plural ?? null,\n\t\t},\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t\tget: actions.get,\n\t\t\tcreate: actions.create,\n\t\t\tdelete: actions.delete,\n\t\t\tupdate: actions.update,\n\t\t\tupdateProps: actions.updateProps,\n\t\t},\n\t};\n}\n","import { ELEMENTS_STYLES_PROVIDER_KEY_PREFIX } from '../providers/document-elements-styles-provider';\n\nexport function isElementsStylesProvider( key: string ) {\n\treturn new RegExp( `^${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }\\\\d+$` ).test( key );\n}\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider = createStylesProvider( {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tactions: {\n\t\tall() {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) =>\n\t\t\t\tObject.values( widget.base_styles ?? {} )\n\t\t\t);\n\t\t},\n\n\t\tget( id ) {\n\t\t\treturn this.all().find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { documentElementsStylesProvider } from './providers/document-elements-styles-provider';\nimport { elementBaseStylesProvider } from './providers/element-base-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( documentElementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/utils/create-styles-repository.ts","../src/styles-repository.ts","../src/hooks/use-providers.ts","../src/hooks/use-get-styles-repository-create-action.ts","../src/hooks/use-user-styles-capability.ts","../src/utils/validate-style-label.ts","../src/providers/document-elements-styles-provider.ts","../src/errors.ts","../src/utils/create-styles-provider.ts","../src/utils/is-elements-styles-provider.ts","../src/providers/element-base-styles-provider.ts","../src/init.ts"],"sourcesContent":["import { type Meta, type StylesProvider } from '../types';\n\nexport const createStylesRepository = () => {\n\tconst providers: StylesProvider[] = [];\n\n\tconst getProviders = () => {\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 all = ( meta: Meta = {} ) => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all( 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\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => provider.getKey() === key );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\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';\n\nexport function useProviders() {\n\tconst [ , rerender ] = useReducer( ( prev ) => ! prev, false );\n\n\tuseEffect( () => stylesRepository.subscribe( rerender ), [] );\n\n\treturn stylesRepository.getProviders();\n}\n","import { useMemo } from 'react';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type StylesProvider } from '../types';\nimport { useUserStylesCapability } from './use-user-styles-capability';\n\ntype CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];\ntype CreateTuple = [ StylesProvider, CreateAction ];\n\nexport function useGetStylesRepositoryCreateAction() {\n\tconst { userCan } = useUserStylesCapability();\n\n\treturn useMemo( () => {\n\t\tconst createActions = stylesRepository\n\t\t\t.getProviders()\n\t\t\t.map< CreateTuple | null >( ( provider ) => {\n\t\t\t\tif ( ! provider.actions.create || ! userCan( provider.getKey() ).create ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ provider, provider.actions.create ];\n\t\t\t} )\n\t\t\t.filter( Boolean );\n\n\t\tif ( createActions.length === 1 ) {\n\t\t\treturn createActions[ 0 ];\n\t\t} else if ( createActions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error( 'Multiple providers with create action found in styles repository.' );\n\t\t// eslint-disable-next-line react-compiler/react-compiler\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [] );\n}\n","import { useCurrentUserCapabilities } from '@elementor/editor-current-user';\n\nimport { stylesRepository } from '../styles-repository';\nimport { type UserCapabilities } from '../types';\n\ntype UserCan = {\n\t[ key in keyof UserCapabilities ]: boolean;\n};\n\nconst DEFAULT_CAPABILITIES: UserCan = {\n\tcreate: true,\n\tdelete: true,\n\tupdate: true,\n\tupdateProps: true,\n};\n\nexport const useUserStylesCapability = () => {\n\tconst { capabilities } = useCurrentUserCapabilities();\n\n\tconst userCan = ( providerKey: string ): UserCan => {\n\t\tconst provider = stylesRepository.getProviderByKey( providerKey );\n\n\t\tif ( ! provider?.capabilities ) {\n\t\t\treturn DEFAULT_CAPABILITIES;\n\t\t}\n\n\t\treturn Object.entries( provider.capabilities ).reduce(\n\t\t\t( acc, [ key, capability ] ) => ( {\n\t\t\t\t...acc,\n\t\t\t\t[ key ]: capabilities?.includes( capability ) ?? true,\n\t\t\t} ),\n\t\t\tDEFAULT_CAPABILITIES\n\t\t);\n\t};\n\n\treturn { userCan };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nimport { ELEMENTS_STYLES_RESERVED_LABEL } from '../providers/document-elements-styles-provider';\nimport { stylesRepository } from '../styles-repository';\n\nconst NO_START_DIGIT_REGEX = /^(|[^0-9].*)$/;\nconst NO_SPACES_REGEX = /^\\S*$/;\nconst NO_SPECIAL_CHARS_REGEX = /^(|[a-zA-Z0-9_-]+)$/;\nconst NO_DOUBLE_HYPHEN_START_REGEX = /^(?!--).*/;\nconst NO_HYPHEN_DIGIT_START_REGEX = /^(?!-[0-9])/;\n\nconst RESERVED_CLASS_NAMES = [ 'container' ];\n\nconst schema = z\n\t.string()\n\t.max( 50, __( 'Class name is too long. Please keep it under 50 characters.', 'elementor' ) )\n\t.regex( NO_START_DIGIT_REGEX, __( 'Class names must start with a letter.', 'elementor' ) )\n\t.regex( NO_SPACES_REGEX, __( 'Class names can’t contain spaces.', 'elementor' ) )\n\t.regex(\n\t\tNO_SPECIAL_CHARS_REGEX,\n\t\t__( 'Class names can only use letters, numbers, dashes (-), and underscores (_).', 'elementor' )\n\t)\n\t.regex( NO_DOUBLE_HYPHEN_START_REGEX, __( 'Double hyphens are reserved for custom properties.', 'elementor' ) )\n\t.regex(\n\t\tNO_HYPHEN_DIGIT_START_REGEX,\n\t\t__( 'Class names can’t start with a hyphen followed by a number.', 'elementor' )\n\t)\n\t.refine( ( value ) => ! RESERVED_CLASS_NAMES.includes( value ), {\n\t\tmessage: __( 'This name is reserved and can’t be used. Try something more specific.', 'elementor' ),\n\t} );\n\ntype ValidationEvent = 'inputChange' | 'create' | 'rename';\ntype ValidationResult = { isValid: true; errorMessage: null } | { isValid: false; errorMessage: string };\n\nexport function validateStyleLabel( label: string, event: ValidationEvent | 'rename' ): ValidationResult {\n\tconst existingLabels = new Set( [\n\t\tELEMENTS_STYLES_RESERVED_LABEL,\n\t\t...stylesRepository.all().map( ( styleDef ) => styleDef.label.toLowerCase() ),\n\t] );\n\n\tconst fullValidationEvent = [ 'create', 'rename' ].includes( event );\n\n\tconst result = schema\n\t\t.refine( ( value ) => ! ( fullValidationEvent && value.length < 2 ), {\n\t\t\tmessage: __( 'Class name is too short. Use at least 2 characters.', 'elementor' ),\n\t\t} )\n\t\t.refine( ( value ) => ! ( fullValidationEvent && existingLabels.has( value ) ), {\n\t\t\tmessage: __( 'This class name already exists. Please choose a unique name.', 'elementor' ),\n\t\t} )\n\t\t.safeParse( label.toLowerCase() );\n\n\tif ( result.success ) {\n\t\treturn {\n\t\t\tisValid: true,\n\t\t\terrorMessage: null,\n\t\t};\n\t}\n\n\treturn {\n\t\tisValid: false,\n\t\terrorMessage: result.error.format()._errors[ 0 ],\n\t};\n}\n","import {\n\tgetCurrentDocumentId,\n\tgetElements,\n\tgetElementStyles,\n\tstyleRerenderEvents,\n\tupdateElementStyle,\n} from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo } from '@elementor/editor-v1-adapters';\n\nimport { ActiveDocumentMustExistError, InvalidElementsStyleProviderMetaError } from '../errors';\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_STYLES_PROVIDER_KEY_PREFIX = 'document-elements-';\nexport const ELEMENTS_STYLES_RESERVED_LABEL = 'local';\n\ntype ElementsMeta = {\n\telementId: string;\n};\n\nexport const documentElementsStylesProvider = createStylesProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tthrow new ActiveDocumentMustExistError();\n\t\t}\n\n\t\treturn `${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => listenTo( styleRerenderEvents, cb ),\n\tactions: {\n\t\tall: ( meta = {} ) => {\n\t\t\tlet elements = getElements();\n\n\t\t\tif ( isValidElementsMeta( meta ) ) {\n\t\t\t\telements = elements.filter( ( element ) => element.id === meta.elementId );\n\t\t\t}\n\n\t\t\treturn elements.flatMap( ( element ) => Object.values( element.model.get( 'styles' ) ?? {} ) );\n\t\t},\n\n\t\tget: ( id, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tconst styles = getElementStyles( meta.elementId ) ?? {};\n\n\t\t\treturn styles[ id ] ?? null;\n\t\t},\n\n\t\tupdateProps: ( args, meta = {} ) => {\n\t\t\tif ( ! isValidElementsMeta( meta ) ) {\n\t\t\t\tthrow new InvalidElementsStyleProviderMetaError( { context: { meta } } );\n\t\t\t}\n\n\t\t\tupdateElementStyle( {\n\t\t\t\telementId: meta.elementId,\n\t\t\t\tstyleId: args.id,\n\t\t\t\tmeta: args.meta,\n\t\t\t\tprops: args.props,\n\t\t\t} );\n\t\t},\n\t},\n} );\n\nfunction isValidElementsMeta( meta: Record< string, unknown > ): meta is ElementsMeta {\n\treturn 'elementId' in meta && typeof meta.elementId === 'string' && !! meta.elementId;\n}\n","import { createError } from '@elementor/utils';\n\nexport const InvalidElementsStyleProviderMetaError = createError< { meta: Record< string, unknown > } >( {\n\tcode: 'invalid_elements_style_provider_meta',\n\tmessage: 'Invalid elements style provider meta.',\n} );\n\nexport const ActiveDocumentMustExistError = createError( {\n\tcode: 'active_document_must_exist',\n\tmessage: 'Active document must exist.',\n} );\n","import { type StylesProvider, type UserCapabilities } from '../types';\n\nexport type CreateStylesProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tlimit?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tlabels?: {\n\t\tsingular: string;\n\t\tplural: string;\n\t};\n\tactions: {\n\t\tall: StylesProvider[ 'actions' ][ 'all' ];\n\t\tget: StylesProvider[ 'actions' ][ 'get' ];\n\t\tresolveCssName?: StylesProvider[ 'actions' ][ 'resolveCssName' ];\n\t\tcreate?: StylesProvider[ 'actions' ][ 'create' ];\n\t\tdelete?: StylesProvider[ 'actions' ][ 'delete' ];\n\t\tupdate?: StylesProvider[ 'actions' ][ 'update' ];\n\t\tupdateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];\n\t};\n\tcapabilities?: UserCapabilities;\n};\n\nconst DEFAULT_LIMIT = 10000;\nconst DEFAULT_PRIORITY = 10;\n\nexport function createStylesProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tlimit = DEFAULT_LIMIT,\n\tsubscribe = () => () => {},\n\tlabels,\n\tactions,\n\tcapabilities,\n}: CreateStylesProviderOptions ): StylesProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tlimit,\n\t\tcapabilities,\n\t\tsubscribe,\n\t\tlabels: {\n\t\t\tsingular: labels?.singular ?? null,\n\t\t\tplural: labels?.plural ?? null,\n\t\t},\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t\tget: actions.get,\n\t\t\tresolveCssName: actions.resolveCssName ?? ( ( id ) => id ),\n\t\t\tcreate: actions.create,\n\t\t\tdelete: actions.delete,\n\t\t\tupdate: actions.update,\n\t\t\tupdateProps: actions.updateProps,\n\t\t},\n\t};\n}\n","import { ELEMENTS_STYLES_PROVIDER_KEY_PREFIX } from '../providers/document-elements-styles-provider';\n\nexport function isElementsStylesProvider( key: string ) {\n\treturn new RegExp( `^${ ELEMENTS_STYLES_PROVIDER_KEY_PREFIX }\\\\d+$` ).test( key );\n}\n","import { getWidgetsCache } from '@elementor/editor-elements';\n\nimport { createStylesProvider } from '../utils/create-styles-provider';\n\nexport const ELEMENTS_BASE_STYLES_PROVIDER_KEY = 'element-base-styles';\n\nexport const elementBaseStylesProvider = createStylesProvider( {\n\tkey: ELEMENTS_BASE_STYLES_PROVIDER_KEY,\n\tactions: {\n\t\tall() {\n\t\t\tconst widgetsCache = getWidgetsCache();\n\n\t\t\treturn Object.values( widgetsCache ?? {} ).flatMap( ( widget ) =>\n\t\t\t\tObject.values( widget.base_styles ?? {} )\n\t\t\t);\n\t\t},\n\n\t\tget( id ) {\n\t\t\treturn this.all().find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { documentElementsStylesProvider } from './providers/document-elements-styles-provider';\nimport { elementBaseStylesProvider } from './providers/element-base-styles-provider';\nimport { stylesRepository } from './styles-repository';\n\nexport function init() {\n\tstylesRepository.register( documentElementsStylesProvider );\n\tstylesRepository.register( elementBaseStylesProvider );\n}\n"],"mappings":"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","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.8.8",
4
+ "version": "0.10.0",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -33,9 +33,10 @@
33
33
  "dev": "tsup --config=../../tsup.dev.ts"
34
34
  },
35
35
  "dependencies": {
36
- "@elementor/editor-elements": "0.8.3",
37
- "@elementor/editor-props": "0.12.0",
38
- "@elementor/editor-styles": "0.6.7",
36
+ "@elementor/editor-current-user": "0.5.0",
37
+ "@elementor/editor-elements": "0.8.4",
38
+ "@elementor/editor-props": "0.12.1",
39
+ "@elementor/editor-styles": "0.6.8",
39
40
  "@elementor/editor-v1-adapters": "0.12.0",
40
41
  "@elementor/schema": "0.1.2",
41
42
  "@elementor/utils": "0.4.0",
@@ -2,22 +2,25 @@ import { useMemo } from 'react';
2
2
 
3
3
  import { stylesRepository } from '../styles-repository';
4
4
  import { type StylesProvider } from '../types';
5
+ import { useUserStylesCapability } from './use-user-styles-capability';
5
6
 
6
7
  type CreateAction = Required< StylesProvider[ 'actions' ] >[ 'create' ];
7
8
  type CreateTuple = [ StylesProvider, CreateAction ];
8
9
 
9
10
  export function useGetStylesRepositoryCreateAction() {
11
+ const { userCan } = useUserStylesCapability();
12
+
10
13
  return useMemo( () => {
11
14
  const createActions = stylesRepository
12
15
  .getProviders()
13
16
  .map< CreateTuple | null >( ( provider ) => {
14
- if ( ! provider.actions.create ) {
17
+ if ( ! provider.actions.create || ! userCan( provider.getKey() ).create ) {
15
18
  return null;
16
19
  }
17
20
 
18
21
  return [ provider, provider.actions.create ];
19
22
  } )
20
- .filter( ( item ) => !! item );
23
+ .filter( Boolean );
21
24
 
22
25
  if ( createActions.length === 1 ) {
23
26
  return createActions[ 0 ];
@@ -25,5 +28,7 @@ export function useGetStylesRepositoryCreateAction() {
25
28
  return null;
26
29
  }
27
30
  throw new Error( 'Multiple providers with create action found in styles repository.' );
31
+ // eslint-disable-next-line react-compiler/react-compiler
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
28
33
  }, [] );
29
34
  }
@@ -0,0 +1,37 @@
1
+ import { useCurrentUserCapabilities } from '@elementor/editor-current-user';
2
+
3
+ import { stylesRepository } from '../styles-repository';
4
+ import { type UserCapabilities } from '../types';
5
+
6
+ type UserCan = {
7
+ [ key in keyof UserCapabilities ]: boolean;
8
+ };
9
+
10
+ const DEFAULT_CAPABILITIES: UserCan = {
11
+ create: true,
12
+ delete: true,
13
+ update: true,
14
+ updateProps: true,
15
+ };
16
+
17
+ export const useUserStylesCapability = () => {
18
+ const { capabilities } = useCurrentUserCapabilities();
19
+
20
+ const userCan = ( providerKey: string ): UserCan => {
21
+ const provider = stylesRepository.getProviderByKey( providerKey );
22
+
23
+ if ( ! provider?.capabilities ) {
24
+ return DEFAULT_CAPABILITIES;
25
+ }
26
+
27
+ return Object.entries( provider.capabilities ).reduce(
28
+ ( acc, [ key, capability ] ) => ( {
29
+ ...acc,
30
+ [ key ]: capabilities?.includes( capability ) ?? true,
31
+ } ),
32
+ DEFAULT_CAPABILITIES
33
+ );
34
+ };
35
+
36
+ return { userCan };
37
+ };
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export * from './types';
3
3
  export { stylesRepository } from './styles-repository';
4
4
  export { useProviders } from './hooks/use-providers';
5
5
  export { useGetStylesRepositoryCreateAction } from './hooks/use-get-styles-repository-create-action';
6
+ export { useUserStylesCapability } from './hooks/use-user-styles-capability';
6
7
  export { validateStyleLabel } from './utils/validate-style-label';
7
8
  export { createStylesProvider, type CreateStylesProviderOptions } from './utils/create-styles-provider';
8
9
  export { isElementsStylesProvider } from './utils/is-elements-styles-provider';
package/src/types.ts CHANGED
@@ -7,6 +7,13 @@ export type Meta = Record< string, unknown >;
7
7
 
8
8
  export type UpdateActionPayload = MakeOptional< StyleDefinition, 'label' | 'variants' | 'type' >;
9
9
 
10
+ export type UserCapabilities = {
11
+ create: string;
12
+ delete: string;
13
+ update: string;
14
+ updateProps: string;
15
+ };
16
+
10
17
  export type UpdatePropsActionPayload = {
11
18
  id: StyleDefinitionID;
12
19
  meta: StyleDefinitionVariant[ 'meta' ];
@@ -25,9 +32,11 @@ export type StylesProvider = {
25
32
  actions: {
26
33
  all: ( meta?: Meta ) => StyleDefinition[];
27
34
  get: ( id: StyleDefinitionID, meta?: Meta ) => StyleDefinition | null;
35
+ resolveCssName: ( id: StyleDefinitionID ) => string;
28
36
  create?: ( label: StyleDefinition[ 'label' ] ) => StyleDefinitionID;
29
37
  delete?: ( id: StyleDefinitionID ) => void;
30
38
  update?: ( data: UpdateActionPayload ) => void;
31
39
  updateProps?: ( args: UpdatePropsActionPayload, meta?: Meta ) => void;
32
40
  };
41
+ capabilities?: UserCapabilities;
33
42
  };
@@ -1,4 +1,4 @@
1
- import { type StylesProvider } from '../types';
1
+ import { type StylesProvider, type UserCapabilities } from '../types';
2
2
 
3
3
  export type CreateStylesProviderOptions = {
4
4
  key: string | ( () => string );
@@ -12,11 +12,13 @@ export type CreateStylesProviderOptions = {
12
12
  actions: {
13
13
  all: StylesProvider[ 'actions' ][ 'all' ];
14
14
  get: StylesProvider[ 'actions' ][ 'get' ];
15
+ resolveCssName?: StylesProvider[ 'actions' ][ 'resolveCssName' ];
15
16
  create?: StylesProvider[ 'actions' ][ 'create' ];
16
17
  delete?: StylesProvider[ 'actions' ][ 'delete' ];
17
18
  update?: StylesProvider[ 'actions' ][ 'update' ];
18
19
  updateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];
19
20
  };
21
+ capabilities?: UserCapabilities;
20
22
  };
21
23
 
22
24
  const DEFAULT_LIMIT = 10000;
@@ -29,11 +31,13 @@ export function createStylesProvider( {
29
31
  subscribe = () => () => {},
30
32
  labels,
31
33
  actions,
34
+ capabilities,
32
35
  }: CreateStylesProviderOptions ): StylesProvider {
33
36
  return {
34
37
  getKey: typeof key === 'string' ? () => key : key,
35
38
  priority,
36
39
  limit,
40
+ capabilities,
37
41
  subscribe,
38
42
  labels: {
39
43
  singular: labels?.singular ?? null,
@@ -42,6 +46,7 @@ export function createStylesProvider( {
42
46
  actions: {
43
47
  all: actions.all,
44
48
  get: actions.get,
49
+ resolveCssName: actions.resolveCssName ?? ( ( id ) => id ),
45
50
  create: actions.create,
46
51
  delete: actions.delete,
47
52
  update: actions.update,