@elementor/elementor-mcp-common 4.1.0-754

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ callWpApi: () => callWpApi,
24
+ ensureElementorFrontend: () => ensureElementorFrontend,
25
+ extractElementImageData: () => extractElementImageData,
26
+ extractJSONFromResponse: () => extractJSONFromResponse,
27
+ get$e: () => get$e,
28
+ getAjaxUrl: () => getAjaxUrl,
29
+ getElementSettings: () => getElementSettings,
30
+ getElementor: () => getElementor,
31
+ getElementorAiConfig: () => getElementorAiConfig,
32
+ getElementorCommon: () => getElementorCommon,
33
+ getElementorFrontend: () => getElementorFrontend,
34
+ getGutenbergBlockEditorApis: () => getGutenbergBlockEditorApis,
35
+ getJQuery: () => getJQuery,
36
+ getWp: () => getWp,
37
+ getWpApiSettings: () => getWpApiSettings,
38
+ hasGutenbergUI: () => hasGutenbergUI,
39
+ initNonceRefresh: () => initNonceRefresh,
40
+ injectElementCSS: () => injectElementCSS,
41
+ isElementorAIActive: () => isElementorAIActive,
42
+ isElementorEditor: () => isElementorEditor,
43
+ isElementorEditorReady: () => isElementorEditorReady,
44
+ isGutenbergEditor: () => isGutenbergEditor,
45
+ isNonceError: () => isNonceError,
46
+ isSelectAllCheckbox: () => isSelectAllCheckbox,
47
+ refreshNonce: () => refreshNonce,
48
+ removeElementCSS: () => removeElementCSS,
49
+ updateElementSettings: () => updateElementSettings,
50
+ updateGutenbergBlockAttributes: () => updateGutenbergBlockAttributes,
51
+ validateAndGetGutenbergBlock: () => validateAndGetGutenbergBlock,
52
+ waitForElementor: () => waitForElementor,
53
+ waitForElementorEditor: () => waitForElementorEditor,
54
+ whenElementorReady: () => whenElementorReady
55
+ });
56
+ module.exports = __toCommonJS(index_exports);
57
+
58
+ // src/utils.ts
59
+ var getElementor = () => window.elementor;
60
+ var getElementorFrontend = () => window.elementorFrontend;
61
+ var get$e = () => window.$e;
62
+ var getElementorCommon = () => window.elementorCommon;
63
+ var getWpApiSettings = () => window.wpApiSettings;
64
+ var getAjaxUrl = () => window.ajaxurl;
65
+ var getWp = () => window.wp;
66
+ var getJQuery = () => window.jQuery;
67
+ var getElementorAiConfig = () => window.ElementorAiConfig;
68
+
69
+ // src/editor-detection.ts
70
+ var ELEMENTOR_LOAD_TIMEOUT_MS = 5e3;
71
+ var ELEMENTOR_CHECK_INTERVAL_MS = 100;
72
+ var DEFAULT_MAX_RETRIES = ELEMENTOR_LOAD_TIMEOUT_MS / ELEMENTOR_CHECK_INTERVAL_MS;
73
+ var DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS = {
74
+ maxRetries: DEFAULT_MAX_RETRIES,
75
+ retryInterval: ELEMENTOR_CHECK_INTERVAL_MS,
76
+ checkFn: () => !!(getElementor() && get$e())
77
+ };
78
+ function isGutenbergEditor() {
79
+ return getWp()?.data?.select("core/editor") !== void 0;
80
+ }
81
+ function isElementorEditor() {
82
+ const params = new URLSearchParams(window.location.search);
83
+ for (const [, value] of params.entries()) {
84
+ if (value.includes("elementor")) {
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+ function isElementorAIActive() {
91
+ return !!getElementorAiConfig();
92
+ }
93
+ function hasGutenbergUI() {
94
+ return !!document.querySelector(".edit-post-header-toolbar");
95
+ }
96
+ function ensureElementorFrontend() {
97
+ const frontend = getElementorFrontend();
98
+ if (!frontend?.elements?.$body) {
99
+ throw new Error("elementorFrontend or its required components not available");
100
+ }
101
+ }
102
+ function isElementorEditorReady() {
103
+ return !!get$e()?.components.get("panel");
104
+ }
105
+ function waitForElementorEditor() {
106
+ return new Promise((resolve) => {
107
+ if (isElementorEditorReady()) {
108
+ resolve();
109
+ return;
110
+ }
111
+ const checkReady = () => {
112
+ if (isElementorEditorReady()) {
113
+ resolve();
114
+ } else {
115
+ setTimeout(checkReady, 100);
116
+ }
117
+ };
118
+ window.addEventListener(
119
+ "DOMContentLoaded",
120
+ () => {
121
+ checkReady();
122
+ },
123
+ {
124
+ once: true
125
+ }
126
+ );
127
+ });
128
+ }
129
+ function waitForElementor(options = DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS) {
130
+ const { maxRetries, retryInterval, checkFn } = options;
131
+ return new Promise((resolve, reject) => {
132
+ let attempts = 0;
133
+ const check = () => {
134
+ if (checkFn()) {
135
+ resolve();
136
+ return;
137
+ }
138
+ attempts++;
139
+ if (attempts >= maxRetries) {
140
+ reject(new Error(`Elementor not loaded after ${maxRetries} attempts`));
141
+ return;
142
+ }
143
+ setTimeout(check, retryInterval);
144
+ };
145
+ check();
146
+ });
147
+ }
148
+ async function whenElementorReady(fn, options = DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS) {
149
+ await waitForElementor(options);
150
+ await waitForElementorEditor();
151
+ return await fn();
152
+ }
153
+
154
+ // src/elements.ts
155
+ function injectElementCSS(elementId, css) {
156
+ const style = document.createElement("style");
157
+ style.id = elementId;
158
+ style.appendChild(document.createTextNode(css));
159
+ ensureElementorFrontend();
160
+ const frontend = getElementorFrontend();
161
+ if (frontend) {
162
+ frontend.elements.$body[0].appendChild(style);
163
+ }
164
+ }
165
+ function removeElementCSS(elementId) {
166
+ ensureElementorFrontend();
167
+ const frontend = getElementorFrontend();
168
+ if (!frontend) {
169
+ return;
170
+ }
171
+ const bodyElement = frontend.elements.$body[0];
172
+ const styleTags = bodyElement.querySelectorAll(`#${CSS.escape(elementId)}`);
173
+ if (styleTags?.length > 0) {
174
+ styleTags.forEach((tag) => {
175
+ bodyElement.removeChild(tag);
176
+ });
177
+ }
178
+ }
179
+ async function updateElementSettings({
180
+ id,
181
+ settings
182
+ }) {
183
+ const containerToUpdateSettings = getElementor()?.getContainer(id);
184
+ if (!containerToUpdateSettings) {
185
+ throw new Error(`Element with ID "${id}" not found.`);
186
+ }
187
+ const updateResult = await get$e()?.run("document/elements/settings", {
188
+ container: containerToUpdateSettings,
189
+ settings,
190
+ options: {
191
+ external: true,
192
+ render: true
193
+ }
194
+ });
195
+ const frontend = getElementorFrontend();
196
+ frontend?.elements.$body.resize();
197
+ return updateResult;
198
+ }
199
+ function getElementSettings(id) {
200
+ const container = getElementor()?.getContainer(id);
201
+ if (!container) {
202
+ throw new Error(`Element with ID "${id}" not found.`);
203
+ }
204
+ return container.settings;
205
+ }
206
+ function getGutenbergBlockEditorApis() {
207
+ const wp = getWp();
208
+ if (!isGutenbergEditor() || !wp) {
209
+ throw new Error("WordPress editor API is not available");
210
+ }
211
+ const blockEditorDispatch = wp.data.dispatch("core/block-editor");
212
+ const blockEditorSelect = wp.data.select("core/block-editor");
213
+ if (!blockEditorDispatch || !blockEditorSelect) {
214
+ throw new Error("Block editor API is not available");
215
+ }
216
+ return { blockEditorDispatch, blockEditorSelect };
217
+ }
218
+ function validateAndGetGutenbergBlock(blockEditorSelect, blockId) {
219
+ const block = blockEditorSelect.getBlock(blockId);
220
+ if (!block) {
221
+ throw new Error(`Block with ID "${blockId}" not found`);
222
+ }
223
+ return block;
224
+ }
225
+ function updateGutenbergBlockAttributes(blockId, attributes) {
226
+ const { blockEditorDispatch, blockEditorSelect } = getGutenbergBlockEditorApis();
227
+ const block = validateAndGetGutenbergBlock(blockEditorSelect, blockId);
228
+ blockEditorDispatch.updateBlockAttributes(blockId, attributes);
229
+ return {
230
+ blockId,
231
+ blockName: block.name,
232
+ updatedAttributes: Object.keys(attributes)
233
+ };
234
+ }
235
+ function extractElementImageData(targetElementId, fallbackImageId = "", fallbackImageUrl = "") {
236
+ let extractedImageId = fallbackImageId;
237
+ let extractedImageUrl = fallbackImageUrl;
238
+ if (targetElementId && (!extractedImageId || !extractedImageUrl)) {
239
+ const targetContainer = getElementor()?.getContainer?.(targetElementId);
240
+ if (targetContainer) {
241
+ const imageData = targetContainer.settings.get("image");
242
+ if (imageData && typeof imageData === "object") {
243
+ const imageObj = imageData;
244
+ extractedImageId = extractedImageId || imageObj.id?.toString() || "";
245
+ extractedImageUrl = extractedImageUrl || imageObj.url || "";
246
+ }
247
+ }
248
+ }
249
+ return {
250
+ imageId: extractedImageId,
251
+ imageUrl: extractedImageUrl
252
+ };
253
+ }
254
+ function isSelectAllCheckbox(input) {
255
+ if (input.id && input.id.includes("select-all") || input.name && input.name.includes("select-all")) {
256
+ return true;
257
+ }
258
+ return false;
259
+ }
260
+
261
+ // src/nonce-refresh.ts
262
+ var isNonceRefreshInitialized = false;
263
+ var nonceRefreshPromise = null;
264
+ function initNonceRefresh() {
265
+ const jQuery = getJQuery();
266
+ const wpApiSettings = getWpApiSettings();
267
+ if (isNonceRefreshInitialized || typeof jQuery === "undefined" || !wpApiSettings) {
268
+ return;
269
+ }
270
+ isNonceRefreshInitialized = true;
271
+ jQuery?.(document).on("heartbeat-tick.angieNonceRefresh", (_event, data) => {
272
+ try {
273
+ const tickData = data;
274
+ const currentSettings = getWpApiSettings();
275
+ if (tickData.angie_nonce && currentSettings && currentSettings.nonce !== tickData.angie_nonce) {
276
+ currentSettings.nonce = tickData.angie_nonce;
277
+ }
278
+ } catch (error) {
279
+ console.error("Failed to refresh nonce:", error);
280
+ }
281
+ });
282
+ }
283
+ async function refreshNonce() {
284
+ if (nonceRefreshPromise) {
285
+ return nonceRefreshPromise;
286
+ }
287
+ nonceRefreshPromise = fetchFreshNonce();
288
+ try {
289
+ return await nonceRefreshPromise;
290
+ } finally {
291
+ nonceRefreshPromise = null;
292
+ }
293
+ }
294
+ async function fetchFreshNonce() {
295
+ const ajaxUrl = new URL(getAjaxUrl() || "/wp-admin/admin-ajax.php", window.location.origin);
296
+ ajaxUrl.searchParams.set("action", "rest-nonce");
297
+ const response = await fetch(ajaxUrl.toString(), {
298
+ credentials: "same-origin"
299
+ });
300
+ if (!response.ok) {
301
+ throw new Error(`Failed to refresh nonce: HTTP ${response.status}`);
302
+ }
303
+ const nonce = await response.text();
304
+ if (!nonce || nonce === "0") {
305
+ throw new Error("Session expired \u2014 received invalid nonce");
306
+ }
307
+ const wpApiSettings = getWpApiSettings();
308
+ if (!wpApiSettings) {
309
+ throw new Error("wpApiSettings not available \u2014 cannot refresh nonce");
310
+ }
311
+ wpApiSettings.nonce = nonce;
312
+ return nonce;
313
+ }
314
+ function isNonceError(status, responseText) {
315
+ return status === 403 && responseText.includes("rest_cookie_invalid_nonce");
316
+ }
317
+
318
+ // src/rest-client.ts
319
+ async function callWpApi(endpoint, method, data, options) {
320
+ return executeWpApiCall(endpoint, method, data, options, true);
321
+ }
322
+ async function executeWpApiCall(endpoint, method, data, options, allowNonceRetry = false) {
323
+ const wpApiSettings = getWpApiSettings();
324
+ if (!wpApiSettings?.nonce || !wpApiSettings.root) {
325
+ throw new Error("wpApiSettings not available");
326
+ }
327
+ const baseUrl = wpApiSettings.root;
328
+ const urlObject = new URL(baseUrl);
329
+ const endpointUrl = new URL(endpoint, baseUrl);
330
+ urlObject.searchParams.set("rest_route", endpointUrl.pathname);
331
+ for (const [key, value] of endpointUrl.searchParams.entries()) {
332
+ urlObject.searchParams.append(key, value);
333
+ }
334
+ const url = urlObject.toString();
335
+ const headers = {
336
+ "X-WP-Nonce": wpApiSettings.nonce,
337
+ ...options?.customHeaders || {}
338
+ };
339
+ if (!options?.binaryData && !options?.customHeaders?.["Content-Type"]) {
340
+ headers["Content-Type"] = "application/json";
341
+ }
342
+ const requestOptions = {
343
+ method,
344
+ headers,
345
+ credentials: "same-origin"
346
+ };
347
+ if (options?.binaryData) {
348
+ requestOptions.body = options.binaryData;
349
+ } else if (data && (method === "POST" || method === "PUT" || method === "PATCH")) {
350
+ requestOptions.body = JSON.stringify(data);
351
+ }
352
+ const response = await fetch(url, requestOptions);
353
+ if (!response.ok) {
354
+ const responseText2 = await response.text();
355
+ if (allowNonceRetry && isNonceError(response.status, responseText2)) {
356
+ await refreshNonce();
357
+ return executeWpApiCall(endpoint, method, data, options, false);
358
+ }
359
+ throw new Error(`HTTP error ${response.status}: ${responseText2}`);
360
+ }
361
+ const responseText = await response.text();
362
+ const json = extractJSONFromResponse(responseText);
363
+ if (json === null) {
364
+ throw new Error(`Invalid response: no JSON found in: ${responseText.substring(0, 200)}`);
365
+ }
366
+ const jsonObj = json;
367
+ if (jsonObj?.success !== void 0 && !jsonObj.success) {
368
+ throw new Error(`API errors: ${JSON.stringify(json)}`);
369
+ }
370
+ const totalItemsHeader = response.headers.get("X-WP-Total");
371
+ const totalPagesHeader = response.headers.get("X-WP-TotalPages");
372
+ const totalItems = totalItemsHeader ? parseInt(totalItemsHeader, 10) : void 0;
373
+ const totalPages = totalPagesHeader ? parseInt(totalPagesHeader, 10) : void 0;
374
+ return {
375
+ data: json,
376
+ totalItems,
377
+ totalPages
378
+ };
379
+ }
380
+ function extractJSONFromResponse(responseText) {
381
+ const objectStart = responseText.indexOf("{");
382
+ const arrayStart = responseText.indexOf("[");
383
+ let startIndex = -1;
384
+ let isArray = false;
385
+ if (objectStart === -1 && arrayStart === -1) {
386
+ return null;
387
+ }
388
+ if (objectStart === -1) {
389
+ startIndex = arrayStart;
390
+ isArray = true;
391
+ } else if (arrayStart === -1) {
392
+ startIndex = objectStart;
393
+ isArray = false;
394
+ } else if (arrayStart < objectStart) {
395
+ startIndex = arrayStart;
396
+ isArray = true;
397
+ } else {
398
+ startIndex = objectStart;
399
+ isArray = false;
400
+ }
401
+ let delimiterCount = 0;
402
+ let endIndex = -1;
403
+ const openChar = isArray ? "[" : "{";
404
+ const closeChar = isArray ? "]" : "}";
405
+ for (let i = startIndex; i < responseText.length; i++) {
406
+ if (responseText[i] === openChar) {
407
+ delimiterCount++;
408
+ } else if (responseText[i] === closeChar) {
409
+ delimiterCount--;
410
+ if (delimiterCount === 0) {
411
+ endIndex = i;
412
+ break;
413
+ }
414
+ }
415
+ }
416
+ if (endIndex === -1) {
417
+ return null;
418
+ }
419
+ const jsonString = responseText.substring(startIndex, endIndex + 1);
420
+ try {
421
+ return JSON.parse(jsonString);
422
+ } catch {
423
+ return null;
424
+ }
425
+ }
426
+ // Annotate the CommonJS export names for ESM import in node:
427
+ 0 && (module.exports = {
428
+ callWpApi,
429
+ ensureElementorFrontend,
430
+ extractElementImageData,
431
+ extractJSONFromResponse,
432
+ get$e,
433
+ getAjaxUrl,
434
+ getElementSettings,
435
+ getElementor,
436
+ getElementorAiConfig,
437
+ getElementorCommon,
438
+ getElementorFrontend,
439
+ getGutenbergBlockEditorApis,
440
+ getJQuery,
441
+ getWp,
442
+ getWpApiSettings,
443
+ hasGutenbergUI,
444
+ initNonceRefresh,
445
+ injectElementCSS,
446
+ isElementorAIActive,
447
+ isElementorEditor,
448
+ isElementorEditorReady,
449
+ isGutenbergEditor,
450
+ isNonceError,
451
+ isSelectAllCheckbox,
452
+ refreshNonce,
453
+ removeElementCSS,
454
+ updateElementSettings,
455
+ updateGutenbergBlockAttributes,
456
+ validateAndGetGutenbergBlock,
457
+ waitForElementor,
458
+ waitForElementorEditor,
459
+ whenElementorReady
460
+ });
461
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/editor-detection.ts","../src/elements.ts","../src/nonce-refresh.ts","../src/rest-client.ts"],"sourcesContent":["export {\n\tisGutenbergEditor,\n\tisElementorEditor,\n\tisElementorAIActive,\n\thasGutenbergUI,\n\tensureElementorFrontend,\n\tisElementorEditorReady,\n\twaitForElementorEditor,\n\twaitForElementor,\n\twhenElementorReady,\n} from './editor-detection';\n\nexport {\n\tinjectElementCSS,\n\tremoveElementCSS,\n\tupdateElementSettings,\n\tgetElementSettings,\n\tgetGutenbergBlockEditorApis,\n\tvalidateAndGetGutenbergBlock,\n\tupdateGutenbergBlockAttributes,\n\textractElementImageData,\n\tisSelectAllCheckbox,\n} from './elements';\n\nexport { callWpApi, extractJSONFromResponse } from './rest-client';\n\nexport { initNonceRefresh, refreshNonce, isNonceError } from './nonce-refresh';\n\nexport type {\n\tElementorChannels,\n\tElementorCommandsInstance,\n\tElementorCommonInstance,\n\tElementorContainer,\n\tElementorDocument,\n\tElementorFrontendInstance,\n\tElementorInstance,\n\tJQuery,\n\tWpApiSettings,\n\tWpDataInstance,\n} from './types';\n\nexport {\n\tget$e,\n\tgetAjaxUrl,\n\tgetElementor,\n\tgetElementorAiConfig,\n\tgetElementorCommon,\n\tgetElementorFrontend,\n\tgetJQuery,\n\tgetWp,\n\tgetWpApiSettings,\n} from './utils';\n","import type {\n\tElementorCommandsInstance,\n\tElementorCommonInstance,\n\tElementorFrontendInstance,\n\tElementorInstance,\n\tWpApiSettings,\n\tWpDataInstance,\n} from './types';\n\ninterface McpWindow {\n\telementor?: ElementorInstance;\n\telementorFrontend?: ElementorFrontendInstance;\n\t$e?: ElementorCommandsInstance;\n\telementorCommon?: ElementorCommonInstance;\n\twpApiSettings?: WpApiSettings;\n\tajaxurl?: string;\n\twp?: {\n\t\tdata: WpDataInstance;\n\t};\n\tjQuery?: ( selector: unknown ) => {\n\t\ton: ( event: string, callback: ( event: unknown, data: unknown ) => void ) => void;\n\t\tget?: ( index: number ) => HTMLElement;\n\t};\n\tElementorAiConfig?: Record< string, unknown >;\n}\n\nexport const getElementor = (): ElementorInstance | undefined => ( window as unknown as McpWindow ).elementor;\n\nexport const getElementorFrontend = (): ElementorFrontendInstance | undefined =>\n\t( window as unknown as McpWindow ).elementorFrontend;\n\nexport const get$e = (): ElementorCommandsInstance | undefined => ( window as unknown as McpWindow ).$e;\n\nexport const getElementorCommon = (): ElementorCommonInstance | undefined =>\n\t( window as unknown as McpWindow ).elementorCommon;\n\nexport const getWpApiSettings = (): WpApiSettings | undefined => ( window as unknown as McpWindow ).wpApiSettings;\n\nexport const getAjaxUrl = (): string | undefined => ( window as unknown as McpWindow ).ajaxurl;\n\nexport const getWp = (): { data: WpDataInstance } | undefined => ( window as unknown as McpWindow ).wp;\n\nexport const getJQuery = (): McpWindow[ 'jQuery' ] => ( window as unknown as McpWindow ).jQuery;\n\nexport const getElementorAiConfig = (): Record< string, unknown > | undefined =>\n\t( window as unknown as McpWindow ).ElementorAiConfig;\n","import { get$e, getElementor, getElementorAiConfig, getElementorFrontend, getWp } from './utils';\n\ntype WaitForElementorOptions = {\n\tmaxRetries: number;\n\tretryInterval?: number;\n\tcheckFn: () => boolean;\n};\n\nconst ELEMENTOR_LOAD_TIMEOUT_MS = 5000;\nconst ELEMENTOR_CHECK_INTERVAL_MS = 100;\nconst DEFAULT_MAX_RETRIES = ELEMENTOR_LOAD_TIMEOUT_MS / ELEMENTOR_CHECK_INTERVAL_MS;\n\nconst DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS: WaitForElementorOptions = {\n\tmaxRetries: DEFAULT_MAX_RETRIES,\n\tretryInterval: ELEMENTOR_CHECK_INTERVAL_MS,\n\tcheckFn: () => !! ( getElementor() && get$e() ),\n};\n\nexport function isGutenbergEditor(): boolean {\n\treturn getWp()?.data?.select( 'core/editor' ) !== undefined;\n}\n\nexport function isElementorEditor(): boolean {\n\tconst params = new URLSearchParams( window.location.search );\n\tfor ( const [ , value ] of params.entries() ) {\n\t\tif ( value.includes( 'elementor' ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function isElementorAIActive(): boolean {\n\treturn !! getElementorAiConfig();\n}\n\nexport function hasGutenbergUI(): boolean {\n\treturn !! document.querySelector( '.edit-post-header-toolbar' );\n}\n\nexport function ensureElementorFrontend(): void {\n\tconst frontend = getElementorFrontend() as { elements?: { $body?: unknown } } | undefined;\n\tif ( ! frontend?.elements?.$body ) {\n\t\tthrow new Error( 'elementorFrontend or its required components not available' );\n\t}\n}\n\nexport function isElementorEditorReady(): boolean {\n\treturn !! get$e()?.components.get( 'panel' );\n}\n\nexport function waitForElementorEditor(): Promise< void > {\n\treturn new Promise( ( resolve ) => {\n\t\tif ( isElementorEditorReady() ) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\n\t\tconst checkReady = () => {\n\t\t\tif ( isElementorEditorReady() ) {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tsetTimeout( checkReady, 100 );\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\n\t\t\t'DOMContentLoaded',\n\t\t\t() => {\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t}\n\t\t);\n\t} );\n}\n\nexport function waitForElementor(\n\toptions: WaitForElementorOptions = DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS\n): Promise< void > {\n\tconst { maxRetries, retryInterval, checkFn } = options;\n\n\treturn new Promise( ( resolve, reject ) => {\n\t\tlet attempts = 0;\n\n\t\tconst check = () => {\n\t\t\tif ( checkFn() ) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattempts++;\n\n\t\t\tif ( attempts >= maxRetries ) {\n\t\t\t\treject( new Error( `Elementor not loaded after ${ maxRetries } attempts` ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetTimeout( check, retryInterval );\n\t\t};\n\n\t\tcheck();\n\t} );\n}\n\nexport async function whenElementorReady< T >(\n\tfn: () => T | Promise< T >,\n\toptions: WaitForElementorOptions = DEFAULT_WAIT_FOR_ELEMENTOR_OPTIONS\n): Promise< T > {\n\tawait waitForElementor( options );\n\tawait waitForElementorEditor();\n\treturn await fn();\n}\n","import { ensureElementorFrontend, isGutenbergEditor } from './editor-detection';\nimport { get$e, getElementor, getElementorFrontend, getWp } from './utils';\n\ninterface GutenbergBlockEditorDispatch {\n\tupdateBlockAttributes: ( clientId: string, attributes: Record< string, unknown > ) => void;\n}\n\ninterface GutenbergBlockEditorSelect {\n\tgetBlock: ( clientId: string ) => { name: string } | null;\n}\n\ninterface GutenbergBlock {\n\tname: string;\n}\n\nexport function injectElementCSS( elementId: string, css: string ): void {\n\tconst style = document.createElement( 'style' );\n\tstyle.id = elementId;\n\tstyle.appendChild( document.createTextNode( css ) );\n\n\tensureElementorFrontend();\n\tconst frontend = getElementorFrontend() as { elements: { $body: HTMLElement[] } } | undefined;\n\tif ( frontend ) {\n\t\tfrontend.elements.$body[ 0 ].appendChild( style );\n\t}\n}\n\nexport function removeElementCSS( elementId: string ): void {\n\tensureElementorFrontend();\n\tconst frontend = getElementorFrontend() as { elements: { $body: HTMLElement[] } } | undefined;\n\tif ( ! frontend ) {\n\t\treturn;\n\t}\n\n\tconst bodyElement = frontend.elements.$body[ 0 ];\n\tconst styleTags = bodyElement.querySelectorAll( `#${ CSS.escape( elementId ) }` );\n\n\tif ( styleTags?.length > 0 ) {\n\t\tstyleTags.forEach( ( tag: Element ) => {\n\t\t\tbodyElement.removeChild( tag );\n\t\t} );\n\t}\n}\n\nexport async function updateElementSettings( {\n\tid,\n\tsettings,\n}: {\n\tid: string;\n\tsettings: Record< string, unknown >;\n} ): Promise< unknown > {\n\tconst containerToUpdateSettings = getElementor()?.getContainer( id );\n\tif ( ! containerToUpdateSettings ) {\n\t\tthrow new Error( `Element with ID \"${ id }\" not found.` );\n\t}\n\n\tconst updateResult = await get$e()?.run( 'document/elements/settings', {\n\t\tcontainer: containerToUpdateSettings,\n\t\tsettings,\n\t\toptions: {\n\t\t\texternal: true,\n\t\t\trender: true,\n\t\t},\n\t} );\n\n\tconst frontend = getElementorFrontend() as { elements: { $body: { resize: () => void } } } | undefined;\n\tfrontend?.elements.$body.resize();\n\n\treturn updateResult;\n}\n\nexport function getElementSettings( id: string ): unknown {\n\tconst container = getElementor()?.getContainer( id );\n\tif ( ! container ) {\n\t\tthrow new Error( `Element with ID \"${ id }\" not found.` );\n\t}\n\treturn container.settings;\n}\n\nexport function getGutenbergBlockEditorApis(): {\n\tblockEditorDispatch: GutenbergBlockEditorDispatch;\n\tblockEditorSelect: GutenbergBlockEditorSelect;\n} {\n\tconst wp = getWp();\n\tif ( ! isGutenbergEditor() || ! wp ) {\n\t\tthrow new Error( 'WordPress editor API is not available' );\n\t}\n\n\tconst blockEditorDispatch = wp.data.dispatch( 'core/block-editor' ) as unknown as GutenbergBlockEditorDispatch;\n\tconst blockEditorSelect = wp.data.select( 'core/block-editor' ) as unknown as GutenbergBlockEditorSelect;\n\n\tif ( ! blockEditorDispatch || ! blockEditorSelect ) {\n\t\tthrow new Error( 'Block editor API is not available' );\n\t}\n\n\treturn { blockEditorDispatch, blockEditorSelect };\n}\n\nexport function validateAndGetGutenbergBlock(\n\tblockEditorSelect: GutenbergBlockEditorSelect,\n\tblockId: string\n): GutenbergBlock {\n\tconst block = blockEditorSelect.getBlock( blockId );\n\tif ( ! block ) {\n\t\tthrow new Error( `Block with ID \"${ blockId }\" not found` );\n\t}\n\treturn block;\n}\n\nexport function updateGutenbergBlockAttributes(\n\tblockId: string,\n\tattributes: Record< string, unknown >\n): { blockId: string; blockName: string; updatedAttributes: string[] } {\n\tconst { blockEditorDispatch, blockEditorSelect } = getGutenbergBlockEditorApis();\n\tconst block = validateAndGetGutenbergBlock( blockEditorSelect, blockId );\n\n\tblockEditorDispatch.updateBlockAttributes( blockId, attributes );\n\n\treturn {\n\t\tblockId,\n\t\tblockName: block.name,\n\t\tupdatedAttributes: Object.keys( attributes ),\n\t};\n}\n\nexport function extractElementImageData(\n\ttargetElementId: string,\n\tfallbackImageId = '',\n\tfallbackImageUrl = ''\n): { imageId: string; imageUrl: string } {\n\tlet extractedImageId = fallbackImageId;\n\tlet extractedImageUrl = fallbackImageUrl;\n\n\tif ( targetElementId && ( ! extractedImageId || ! extractedImageUrl ) ) {\n\t\tconst targetContainer = getElementor()?.getContainer?.( targetElementId );\n\t\tif ( targetContainer ) {\n\t\t\tconst imageData = targetContainer.settings.get( 'image' );\n\t\t\tif ( imageData && typeof imageData === 'object' ) {\n\t\t\t\tconst imageObj = imageData as { id?: string | number; url?: string };\n\t\t\t\textractedImageId = extractedImageId || imageObj.id?.toString() || '';\n\t\t\t\textractedImageUrl = extractedImageUrl || imageObj.url || '';\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\timageId: extractedImageId,\n\t\timageUrl: extractedImageUrl,\n\t};\n}\n\nexport function isSelectAllCheckbox( input: HTMLInputElement ): boolean {\n\tif ( ( input.id && input.id.includes( 'select-all' ) ) || ( input.name && input.name.includes( 'select-all' ) ) ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n","import type { WpApiSettings } from './types';\nimport { getAjaxUrl, getJQuery, getWpApiSettings } from './utils';\n\ntype HeartbeatTickData = {\n\tangie_nonce?: string;\n};\n\nlet isNonceRefreshInitialized = false;\nlet nonceRefreshPromise: Promise< string > | null = null;\n\nexport function initNonceRefresh(): void {\n\tconst jQuery = getJQuery();\n\tconst wpApiSettings = getWpApiSettings();\n\tif ( isNonceRefreshInitialized || typeof jQuery === 'undefined' || ! wpApiSettings ) {\n\t\treturn;\n\t}\n\n\tisNonceRefreshInitialized = true;\n\n\tjQuery?.( document ).on( 'heartbeat-tick.angieNonceRefresh', ( _event: unknown, data: unknown ) => {\n\t\ttry {\n\t\t\tconst tickData = data as HeartbeatTickData;\n\t\t\tconst currentSettings = getWpApiSettings() as WpApiSettings | undefined;\n\t\t\tif ( tickData.angie_nonce && currentSettings && currentSettings.nonce !== tickData.angie_nonce ) {\n\t\t\t\tcurrentSettings.nonce = tickData.angie_nonce;\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error( 'Failed to refresh nonce:', error );\n\t\t}\n\t} );\n}\n\nexport async function refreshNonce(): Promise< string > {\n\tif ( nonceRefreshPromise ) {\n\t\treturn nonceRefreshPromise;\n\t}\n\n\tnonceRefreshPromise = fetchFreshNonce();\n\n\ttry {\n\t\treturn await nonceRefreshPromise;\n\t} finally {\n\t\tnonceRefreshPromise = null;\n\t}\n}\n\nasync function fetchFreshNonce(): Promise< string > {\n\tconst ajaxUrl = new URL( getAjaxUrl() || '/wp-admin/admin-ajax.php', window.location.origin );\n\tajaxUrl.searchParams.set( 'action', 'rest-nonce' );\n\tconst response = await fetch( ajaxUrl.toString(), {\n\t\tcredentials: 'same-origin',\n\t} );\n\n\tif ( ! response.ok ) {\n\t\tthrow new Error( `Failed to refresh nonce: HTTP ${ response.status }` );\n\t}\n\n\tconst nonce = await response.text();\n\n\tif ( ! nonce || nonce === '0' ) {\n\t\tthrow new Error( 'Session expired — received invalid nonce' );\n\t}\n\n\tconst wpApiSettings = getWpApiSettings() as WpApiSettings | undefined;\n\tif ( ! wpApiSettings ) {\n\t\tthrow new Error( 'wpApiSettings not available — cannot refresh nonce' );\n\t}\n\n\twpApiSettings.nonce = nonce;\n\treturn nonce;\n}\n\nexport function isNonceError( status: number, responseText: string ): boolean {\n\treturn status === 403 && responseText.includes( 'rest_cookie_invalid_nonce' );\n}\n","import { isNonceError, refreshNonce } from './nonce-refresh';\nimport { getWpApiSettings } from './utils';\n\ntype WpApiResponse = unknown;\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';\n\ntype CallWpApiOptions = {\n\tbinaryData?: ArrayBufferLike;\n\tcustomHeaders?: Record< string, string >;\n};\n\ntype CallWpApiResult< T > = {\n\tdata: T;\n\ttotalItems?: number;\n\ttotalPages?: number;\n};\n\nexport async function callWpApi< T = WpApiResponse >(\n\tendpoint: string,\n\tmethod: HttpMethod,\n\tdata?: Record< string, unknown >,\n\toptions?: CallWpApiOptions\n): Promise< CallWpApiResult< T > > {\n\treturn executeWpApiCall< T >( endpoint, method, data, options, true );\n}\n\nasync function executeWpApiCall< T = WpApiResponse >(\n\tendpoint: string,\n\tmethod: HttpMethod,\n\tdata?: Record< string, unknown >,\n\toptions?: CallWpApiOptions,\n\tallowNonceRetry = false\n): Promise< CallWpApiResult< T > > {\n\tconst wpApiSettings = getWpApiSettings();\n\tif ( ! wpApiSettings?.nonce || ! wpApiSettings.root ) {\n\t\tthrow new Error( 'wpApiSettings not available' );\n\t}\n\n\tconst baseUrl = wpApiSettings.root;\n\tconst urlObject = new URL( baseUrl );\n\tconst endpointUrl = new URL( endpoint, baseUrl );\n\n\turlObject.searchParams.set( 'rest_route', endpointUrl.pathname );\n\n\tfor ( const [ key, value ] of endpointUrl.searchParams.entries() ) {\n\t\turlObject.searchParams.append( key, value );\n\t}\n\n\tconst url = urlObject.toString();\n\n\tconst headers: Record< string, string > = {\n\t\t'X-WP-Nonce': wpApiSettings.nonce,\n\t\t...( options?.customHeaders || {} ),\n\t};\n\n\tif ( ! options?.binaryData && ! options?.customHeaders?.[ 'Content-Type' ] ) {\n\t\theaders[ 'Content-Type' ] = 'application/json';\n\t}\n\n\tconst requestOptions: RequestInit = {\n\t\tmethod,\n\t\theaders,\n\t\tcredentials: 'same-origin',\n\t};\n\n\tif ( options?.binaryData ) {\n\t\trequestOptions.body = options.binaryData as ArrayBuffer;\n\t} else if ( data && ( method === 'POST' || method === 'PUT' || method === 'PATCH' ) ) {\n\t\trequestOptions.body = JSON.stringify( data );\n\t}\n\n\tconst response = await fetch( url, requestOptions );\n\n\tif ( ! response.ok ) {\n\t\tconst responseText = await response.text();\n\n\t\tif ( allowNonceRetry && isNonceError( response.status, responseText ) ) {\n\t\t\tawait refreshNonce();\n\t\t\treturn executeWpApiCall< T >( endpoint, method, data, options, false );\n\t\t}\n\n\t\tthrow new Error( `HTTP error ${ response.status }: ${ responseText }` );\n\t}\n\n\tconst responseText = await response.text();\n\tconst json = extractJSONFromResponse( responseText );\n\n\tif ( json === null ) {\n\t\tthrow new Error( `Invalid response: no JSON found in: ${ responseText.substring( 0, 200 ) }` );\n\t}\n\n\tconst jsonObj = json as { success?: boolean };\n\tif ( jsonObj?.success !== undefined && ! jsonObj.success ) {\n\t\tthrow new Error( `API errors: ${ JSON.stringify( json ) }` );\n\t}\n\n\tconst totalItemsHeader = response.headers.get( 'X-WP-Total' );\n\tconst totalPagesHeader = response.headers.get( 'X-WP-TotalPages' );\n\tconst totalItems: number | undefined = totalItemsHeader ? parseInt( totalItemsHeader, 10 ) : undefined;\n\tconst totalPages: number | undefined = totalPagesHeader ? parseInt( totalPagesHeader, 10 ) : undefined;\n\n\treturn {\n\t\tdata: json as T,\n\t\ttotalItems,\n\t\ttotalPages,\n\t};\n}\n\nexport function extractJSONFromResponse( responseText: string ): unknown {\n\tconst objectStart = responseText.indexOf( '{' );\n\tconst arrayStart = responseText.indexOf( '[' );\n\n\tlet startIndex = -1;\n\tlet isArray = false;\n\n\tif ( objectStart === -1 && arrayStart === -1 ) {\n\t\treturn null;\n\t}\n\n\tif ( objectStart === -1 ) {\n\t\tstartIndex = arrayStart;\n\t\tisArray = true;\n\t} else if ( arrayStart === -1 ) {\n\t\tstartIndex = objectStart;\n\t\tisArray = false;\n\t} else if ( arrayStart < objectStart ) {\n\t\tstartIndex = arrayStart;\n\t\tisArray = true;\n\t} else {\n\t\tstartIndex = objectStart;\n\t\tisArray = false;\n\t}\n\n\tlet delimiterCount = 0;\n\tlet endIndex = -1;\n\tconst openChar = isArray ? '[' : '{';\n\tconst closeChar = isArray ? ']' : '}';\n\n\tfor ( let i = startIndex; i < responseText.length; i++ ) {\n\t\tif ( responseText[ i ] === openChar ) {\n\t\t\tdelimiterCount++;\n\t\t} else if ( responseText[ i ] === closeChar ) {\n\t\t\tdelimiterCount--;\n\t\t\tif ( delimiterCount === 0 ) {\n\t\t\t\tendIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( endIndex === -1 ) {\n\t\treturn null;\n\t}\n\n\tconst jsonString = responseText.substring( startIndex, endIndex + 1 );\n\n\ttry {\n\t\treturn JSON.parse( jsonString );\n\t} catch {\n\t\treturn null;\n\t}\n}\n"],"mappings":"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","names":["responseText"]}