@elementor/editor-styles-repository 0.9.0 → 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.
- package/.turbo/turbo-build.log +11 -11
- package/CHANGELOG.md +11 -0
- package/dist/index.d.mts +17 -2
- package/dist/index.d.ts +17 -2
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/hooks/use-get-styles-repository-create-action.ts +7 -2
- package/src/hooks/use-user-styles-capability.ts +37 -0
- package/src/index.ts +1 -0
- package/src/types.ts +8 -0
- package/src/utils/create-styles-provider.ts +4 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
|
|
2
|
-
> @elementor/editor-styles-repository@0.
|
|
2
|
+
> @elementor/editor-styles-repository@0.10.0 build
|
|
3
3
|
> tsup --config=../../tsup.build.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
6
6
|
[34mCLI[39m Using tsconfig: ../../../tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v8.
|
|
7
|
+
[34mCLI[39m tsup v8.5.0
|
|
8
8
|
[34mCLI[39m Using tsup config: /home/runner/work/elementor-packages/elementor-packages/tsup.build.ts
|
|
9
9
|
[34mCLI[39m Target: esnext
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m8.70 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m17.15 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 131ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m10.70 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m18.08 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 132ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[32m3.
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m3.
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 8811ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m3.88 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m3.88 KB[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
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
|
+
|
|
3
14
|
## 0.9.0
|
|
4
15
|
|
|
5
16
|
### Minor 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'];
|
|
@@ -28,6 +34,7 @@ type StylesProvider = {
|
|
|
28
34
|
update?: (data: UpdateActionPayload) => void;
|
|
29
35
|
updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
|
|
30
36
|
};
|
|
37
|
+
capabilities?: UserCapabilities;
|
|
31
38
|
};
|
|
32
39
|
|
|
33
40
|
declare const stylesRepository: {
|
|
@@ -44,6 +51,13 @@ type CreateAction = Required<StylesProvider['actions']>['create'];
|
|
|
44
51
|
type CreateTuple = [StylesProvider, CreateAction];
|
|
45
52
|
declare function useGetStylesRepositoryCreateAction(): CreateTuple | null;
|
|
46
53
|
|
|
54
|
+
type UserCan = {
|
|
55
|
+
[key in keyof UserCapabilities]: boolean;
|
|
56
|
+
};
|
|
57
|
+
declare const useUserStylesCapability: () => {
|
|
58
|
+
userCan: (providerKey: string) => UserCan;
|
|
59
|
+
};
|
|
60
|
+
|
|
47
61
|
type ValidationEvent = 'inputChange' | 'create' | 'rename';
|
|
48
62
|
type ValidationResult = {
|
|
49
63
|
isValid: true;
|
|
@@ -72,8 +86,9 @@ type CreateStylesProviderOptions = {
|
|
|
72
86
|
update?: StylesProvider['actions']['update'];
|
|
73
87
|
updateProps?: StylesProvider['actions']['updateProps'];
|
|
74
88
|
};
|
|
89
|
+
capabilities?: UserCapabilities;
|
|
75
90
|
};
|
|
76
|
-
declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, }: CreateStylesProviderOptions): StylesProvider;
|
|
91
|
+
declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, capabilities, }: CreateStylesProviderOptions): StylesProvider;
|
|
77
92
|
|
|
78
93
|
declare function isElementsStylesProvider(key: string): boolean;
|
|
79
94
|
|
|
@@ -84,4 +99,4 @@ declare const ELEMENTS_STYLES_RESERVED_LABEL = "local";
|
|
|
84
99
|
|
|
85
100
|
declare function init(): void;
|
|
86
101
|
|
|
87
|
-
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'];
|
|
@@ -28,6 +34,7 @@ type StylesProvider = {
|
|
|
28
34
|
update?: (data: UpdateActionPayload) => void;
|
|
29
35
|
updateProps?: (args: UpdatePropsActionPayload, meta?: Meta) => void;
|
|
30
36
|
};
|
|
37
|
+
capabilities?: UserCapabilities;
|
|
31
38
|
};
|
|
32
39
|
|
|
33
40
|
declare const stylesRepository: {
|
|
@@ -44,6 +51,13 @@ type CreateAction = Required<StylesProvider['actions']>['create'];
|
|
|
44
51
|
type CreateTuple = [StylesProvider, CreateAction];
|
|
45
52
|
declare function useGetStylesRepositoryCreateAction(): CreateTuple | null;
|
|
46
53
|
|
|
54
|
+
type UserCan = {
|
|
55
|
+
[key in keyof UserCapabilities]: boolean;
|
|
56
|
+
};
|
|
57
|
+
declare const useUserStylesCapability: () => {
|
|
58
|
+
userCan: (providerKey: string) => UserCan;
|
|
59
|
+
};
|
|
60
|
+
|
|
47
61
|
type ValidationEvent = 'inputChange' | 'create' | 'rename';
|
|
48
62
|
type ValidationResult = {
|
|
49
63
|
isValid: true;
|
|
@@ -72,8 +86,9 @@ type CreateStylesProviderOptions = {
|
|
|
72
86
|
update?: StylesProvider['actions']['update'];
|
|
73
87
|
updateProps?: StylesProvider['actions']['updateProps'];
|
|
74
88
|
};
|
|
89
|
+
capabilities?: UserCapabilities;
|
|
75
90
|
};
|
|
76
|
-
declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, }: CreateStylesProviderOptions): StylesProvider;
|
|
91
|
+
declare function createStylesProvider({ key, priority, limit, subscribe, labels, actions, capabilities, }: CreateStylesProviderOptions): StylesProvider;
|
|
77
92
|
|
|
78
93
|
declare function isElementsStylesProvider(key: string): boolean;
|
|
79
94
|
|
|
@@ -84,4 +99,4 @@ declare const ELEMENTS_STYLES_RESERVED_LABEL = "local";
|
|
|
84
99
|
|
|
85
100
|
declare function init(): void;
|
|
86
101
|
|
|
87
|
-
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(
|
|
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,
|
|
@@ -270,6 +302,7 @@ function init() {
|
|
|
270
302
|
stylesRepository,
|
|
271
303
|
useGetStylesRepositoryCreateAction,
|
|
272
304
|
useProviders,
|
|
305
|
+
useUserStylesCapability,
|
|
273
306
|
validateStyleLabel
|
|
274
307
|
});
|
|
275
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\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};\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\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"]}
|
|
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(
|
|
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,
|
|
@@ -240,6 +271,7 @@ export {
|
|
|
240
271
|
stylesRepository,
|
|
241
272
|
useGetStylesRepositoryCreateAction,
|
|
242
273
|
useProviders,
|
|
274
|
+
useUserStylesCapability,
|
|
243
275
|
validateStyleLabel
|
|
244
276
|
};
|
|
245
277
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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\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};\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\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":[]}
|
|
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.
|
|
4
|
+
"version": "0.10.0",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"@elementor/editor-current-user": "0.5.0",
|
|
36
37
|
"@elementor/editor-elements": "0.8.4",
|
|
37
38
|
"@elementor/editor-props": "0.12.1",
|
|
38
39
|
"@elementor/editor-styles": "0.6.8",
|
|
@@ -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(
|
|
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' ];
|
|
@@ -31,4 +38,5 @@ export type StylesProvider = {
|
|
|
31
38
|
update?: ( data: UpdateActionPayload ) => void;
|
|
32
39
|
updateProps?: ( args: UpdatePropsActionPayload, meta?: Meta ) => void;
|
|
33
40
|
};
|
|
41
|
+
capabilities?: UserCapabilities;
|
|
34
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 );
|
|
@@ -18,6 +18,7 @@ export type CreateStylesProviderOptions = {
|
|
|
18
18
|
update?: StylesProvider[ 'actions' ][ 'update' ];
|
|
19
19
|
updateProps?: StylesProvider[ 'actions' ][ 'updateProps' ];
|
|
20
20
|
};
|
|
21
|
+
capabilities?: UserCapabilities;
|
|
21
22
|
};
|
|
22
23
|
|
|
23
24
|
const DEFAULT_LIMIT = 10000;
|
|
@@ -30,11 +31,13 @@ export function createStylesProvider( {
|
|
|
30
31
|
subscribe = () => () => {},
|
|
31
32
|
labels,
|
|
32
33
|
actions,
|
|
34
|
+
capabilities,
|
|
33
35
|
}: CreateStylesProviderOptions ): StylesProvider {
|
|
34
36
|
return {
|
|
35
37
|
getKey: typeof key === 'string' ? () => key : key,
|
|
36
38
|
priority,
|
|
37
39
|
limit,
|
|
40
|
+
capabilities,
|
|
38
41
|
subscribe,
|
|
39
42
|
labels: {
|
|
40
43
|
singular: labels?.singular ?? null,
|