fix: prevent asset conflicts between React and Grid.js versions

Add coexistence checks to all enqueue methods to prevent loading
both React and Grid.js assets simultaneously.

Changes:
- ReactAdmin.php: Only enqueue React assets when ?react=1
- Init.php: Skip Grid.js when React active on admin pages
- Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0
- Customer.php, Product.php, License.php: Add coexistence checks

Now the toggle between Classic and React versions works correctly.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
dwindown
2026-04-18 17:02:14 +07:00
parent bd9cdac02e
commit e8fbfb14c1
74973 changed files with 6658406 additions and 71 deletions

View File

@@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBlock = exports.deleteAllBlocks = void 0;
/**
* Delete all blocks using REST API.
*
* @see https://developer.wordpress.org/rest-api/reference/blocks/#list-editor-blocks
* @param this
*/
async function deleteAllBlocks() {
// List all blocks.
// https://developer.wordpress.org/rest-api/reference/blocks/#list-editor-blocks
const blocks = await this.rest({
path: '/wp/v2/blocks',
params: {
per_page: 100,
// All possible statuses.
status: 'publish,future,draft,pending,private,trash',
},
});
// Delete blocks.
// https://developer.wordpress.org/rest-api/reference/blocks/#delete-a-editor-block
// "/wp/v2/posts" not yet supports batch requests.
await this.batchRest(blocks.map((block) => ({
method: 'DELETE',
path: `/wp/v2/blocks/${block.id}?force=true`,
})));
}
exports.deleteAllBlocks = deleteAllBlocks;
/**
* Creates a new block using the REST API.
*
* @see https://developer.wordpress.org/rest-api/reference/blocks/#create-a-editor-block.
* @param this
* @param payload Block payload.
*/
async function createBlock(payload) {
const block = await this.rest({
path: '/wp/v2/blocks',
method: 'POST',
data: { ...payload },
});
return block;
}
exports.createBlock = createBlock;
//# sourceMappingURL=blocks.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/request-utils/blocks.ts"],"names":[],"mappings":";;;AAgBA;;;;;GAKG;AACI,KAAK,UAAU,eAAe;IACpC,mBAAmB;IACnB,gFAAgF;IAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QAC/B,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;YACb,yBAAyB;YACzB,MAAM,EAAE,4CAA4C;SACpD;KACD,CAAE,CAAC;IAEJ,iBAAiB;IACjB,mFAAmF;IACnF,kDAAkD;IAClD,MAAM,IAAI,CAAC,SAAS,CACnB,MAAM,CAAC,GAAG,CAAE,CAAE,KAAqB,EAAG,EAAE,CAAC,CAAE;QAC1C,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,iBAAkB,KAAK,CAAC,EAAG,aAAa;KAC9C,CAAE,CAAE,CACL,CAAC;AACH,CAAC;AArBD,0CAqBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAEhC,OAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QAC9B,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE;KACpB,CAAE,CAAC;IAEJ,OAAO,KAAK,CAAC;AACd,CAAC;AAXD,kCAWC"}

View File

@@ -0,0 +1,52 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteAllComments = exports.createComment = void 0;
/**
* Create new comment using the REST API.
*
* @param this
* @param payload
*/
async function createComment(payload) {
const currentUser = await this.rest({
path: '/wp/v2/users/me',
method: 'GET',
});
const author = currentUser.id;
const comment = await this.rest({
method: 'POST',
path: '/wp/v2/comments',
data: { ...payload, author },
});
return comment;
}
exports.createComment = createComment;
/**
* Delete all comments using the REST API.
*
* @param this
*/
async function deleteAllComments() {
// List all comments.
// https://developer.wordpress.org/rest-api/reference/comments/#list-comments
const comments = await this.rest({
path: '/wp/v2/comments',
params: {
per_page: 100,
// All possible statuses.
status: 'unapproved,approved,spam,trash',
},
});
// Delete all comments one by one.
// https://developer.wordpress.org/rest-api/reference/comments/#delete-a-comment
// "/wp/v2/comments" doesn't support batch requests yet.
await Promise.all(comments.map((comment) => this.rest({
method: 'DELETE',
path: `/wp/v2/comments/${comment.id}`,
params: {
force: true,
},
})));
}
exports.deleteAllComments = deleteAllComments;
//# sourceMappingURL=comments.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/request-utils/comments.ts"],"names":[],"mappings":";;;AAqBA;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAElC,OAA6B;IAE7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU;QAC5C,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,KAAK;KACb,CAAE,CAAC;IAEJ,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAa;QAC3C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE;KAC5B,CAAE,CAAC;IAEJ,OAAO,OAAO,CAAC;AAChB,CAAC;AAlBD,sCAkBC;AAED;;;;GAIG;AACI,KAAK,UAAU,iBAAiB;IACtC,qBAAqB;IACrB,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACjC,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;YACb,yBAAyB;YACzB,MAAM,EAAE,gCAAgC;SACxC;KACD,CAAE,CAAC;IAEJ,kCAAkC;IAClC,gFAAgF;IAChF,wDAAwD;IACxD,MAAM,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAE,CAAE,OAAgB,EAAG,EAAE,CACpC,IAAI,CAAC,IAAI,CAAE;QACV,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,mBAAoB,OAAO,CAAC,EAAG,EAAE;QACvC,MAAM,EAAE;YACP,KAAK,EAAE,IAAI;SACX;KACD,CAAE,CACH,CACD,CAAC;AACH,CAAC;AA1BD,8CA0BC"}

View File

@@ -0,0 +1,30 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.setGutenbergExperiments = void 0;
/**
* Sets the Gutenberg experiments.
*
* @param this
* @param experiments Array of experimental flags to enable. Pass in an empty array to disable all experiments.
*/
async function setGutenbergExperiments(experiments) {
const response = await this.request.get('/wp-admin/admin.php?page=gutenberg-experiments');
const html = await response.text();
const nonce = html.match(/name="_wpnonce" value="([^"]+)"/)[1];
await this.request.post('/wp-admin/options.php', {
form: {
option_page: 'gutenberg-experiments',
action: 'update',
_wpnonce: nonce,
_wp_http_referer: '/wp-admin/admin.php?page=gutenberg-experiments',
...Object.fromEntries(experiments.map((experiment) => [
`gutenberg-experiments[${experiment}]`,
1,
])),
submit: 'Save Changes',
},
failOnStatusCode: true,
});
}
exports.setGutenbergExperiments = setGutenbergExperiments;
//# sourceMappingURL=gutenberg-experiments.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"gutenberg-experiments.js","sourceRoot":"","sources":["../../src/request-utils/gutenberg-experiments.ts"],"names":[],"mappings":";;;AAKA;;;;;GAKG;AACH,KAAK,UAAU,uBAAuB,CAErC,WAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACtC,gDAAgD,CAChD,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,iCAAiC,CAAG,CAAE,CAAC,CAAE,CAAC;IAEpE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,uBAAuB,EAAE;QACjD,IAAI,EAAE;YACL,WAAW,EAAE,uBAAuB;YACpC,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,gDAAgD;YAClE,GAAG,MAAM,CAAC,WAAW,CACpB,WAAW,CAAC,GAAG,CAAE,CAAE,UAAU,EAAG,EAAE,CAAC;gBAClC,yBAA0B,UAAW,GAAG;gBACxC,CAAC;aACD,CAAE,CACH;YACD,MAAM,EAAE,cAAc;SACtB;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAE,CAAC;AACL,CAAC;AAEQ,0DAAuB"}

View File

@@ -0,0 +1,158 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestUtils = void 0;
/**
* External dependencies
*/
const fs = require("fs/promises");
const path = require("path");
const test_1 = require("@playwright/test");
/**
* Internal dependencies
*/
const config_1 = require("../config");
const login_1 = require("./login");
const media_1 = require("./media");
const users_1 = require("./users");
const rest_1 = require("./rest");
const plugins_1 = require("./plugins");
const templates_1 = require("./templates");
const themes_1 = require("./themes");
const blocks_1 = require("./blocks");
const comments_1 = require("./comments");
const posts_1 = require("./posts");
const menus_1 = require("./menus");
const pages_1 = require("./pages");
const preferences_1 = require("./preferences");
const site_settings_1 = require("./site-settings");
const widgets_1 = require("./widgets");
const patterns_1 = require("./patterns");
const gutenberg_experiments_1 = require("./gutenberg-experiments");
class RequestUtils {
request;
user;
maxBatchSize;
storageState;
storageStatePath;
baseURL;
pluginsMap = null;
static async setup({ user, storageStatePath, baseURL = config_1.WP_BASE_URL, }) {
let storageState;
if (storageStatePath) {
await fs.mkdir(path.dirname(storageStatePath), {
recursive: true,
});
try {
storageState = JSON.parse(await fs.readFile(storageStatePath, 'utf-8'));
}
catch (error) {
if (error instanceof Error &&
error.code === 'ENOENT') {
// Ignore errors if the state is not found.
}
else {
throw error;
}
}
}
const requestContext = await test_1.request.newContext({
baseURL,
storageState: storageState && {
cookies: storageState.cookies,
origins: [],
},
});
const requestUtils = new this(requestContext, {
user,
storageState,
storageStatePath,
baseURL,
});
return requestUtils;
}
constructor(requestContext, { user = config_1.WP_ADMIN_USER, storageState, storageStatePath, baseURL = config_1.WP_BASE_URL, } = {}) {
this.user = user;
this.request = requestContext;
this.storageStatePath = storageStatePath;
this.storageState = storageState;
this.baseURL = baseURL;
}
/** @borrows login as this.login */
login = login_1.login.bind(this);
/** @borrows setupRest as this.setupRest */
setupRest = rest_1.setupRest.bind(this);
// .bind() drops the generic types. Re-casting it to keep the type signature.
rest = rest_1.rest.bind(this);
/** @borrows getMaxBatchSize as this.getMaxBatchSize */
getMaxBatchSize = rest_1.getMaxBatchSize.bind(this);
// .bind() drops the generic types. Re-casting it to keep the type signature.
batchRest = rest_1.batchRest.bind(this);
/** @borrows getPluginsMap as this.getPluginsMap */
getPluginsMap = plugins_1.getPluginsMap.bind(this);
/** @borrows activatePlugin as this.activatePlugin */
activatePlugin = plugins_1.activatePlugin.bind(this);
/** @borrows deactivatePlugin as this.deactivatePlugin */
deactivatePlugin = plugins_1.deactivatePlugin.bind(this);
/** @borrows activateTheme as this.activateTheme */
activateTheme = themes_1.activateTheme.bind(this);
/** @borrows createBlock as this.createBlock */
createBlock = blocks_1.createBlock.bind(this);
/** @borrows deleteAllBlocks as this.deleteAllBlocks */
deleteAllBlocks = blocks_1.deleteAllBlocks.bind(this);
/** @borrows createPost as this.createPost */
createPost = posts_1.createPost.bind(this);
/** @borrows deleteAllPosts as this.deleteAllPosts */
deleteAllPosts = posts_1.deleteAllPosts.bind(this);
/** @borrows createClassicMenu as this.createClassicMenu */
createClassicMenu = menus_1.createClassicMenu.bind(this);
/** @borrows createNavigationMenu as this.createNavigationMenu */
createNavigationMenu = menus_1.createNavigationMenu.bind(this);
/** @borrows deleteAllMenus as this.deleteAllMenus */
deleteAllMenus = menus_1.deleteAllMenus.bind(this);
/** @borrows getNavigationMenus as this.getNavigationMenus */
getNavigationMenus = menus_1.getNavigationMenus.bind(this);
/** @borrows createComment as this.createComment */
createComment = comments_1.createComment.bind(this);
/** @borrows deleteAllComments as this.deleteAllComments */
deleteAllComments = comments_1.deleteAllComments.bind(this);
/** @borrows deleteAllWidgets as this.deleteAllWidgets */
deleteAllWidgets = widgets_1.deleteAllWidgets.bind(this);
/** @borrows addWidgetBlock as this.addWidgetBlock */
addWidgetBlock = widgets_1.addWidgetBlock.bind(this);
/** @borrows deleteAllTemplates as this.deleteAllTemplates */
deleteAllTemplates = templates_1.deleteAllTemplates.bind(this);
/** @borrows createTemplate as this.createTemplate */
createTemplate = templates_1.createTemplate.bind(this);
/** @borrows resetPreferences as this.resetPreferences */
resetPreferences = preferences_1.resetPreferences.bind(this);
/** @borrows listMedia as this.listMedia */
listMedia = media_1.listMedia.bind(this);
/** @borrows uploadMedia as this.uploadMedia */
uploadMedia = media_1.uploadMedia.bind(this);
/** @borrows deleteMedia as this.deleteMedia */
deleteMedia = media_1.deleteMedia.bind(this);
/** @borrows deleteAllMedia as this.deleteAllMedia */
deleteAllMedia = media_1.deleteAllMedia.bind(this);
/** @borrows createUser as this.createUser */
createUser = users_1.createUser.bind(this);
/** @borrows deleteAllUsers as this.deleteAllUsers */
deleteAllUsers = users_1.deleteAllUsers.bind(this);
/** @borrows getSiteSettings as this.getSiteSettings */
getSiteSettings = site_settings_1.getSiteSettings.bind(this);
/** @borrows updateSiteSettings as this.updateSiteSettings */
updateSiteSettings = site_settings_1.updateSiteSettings.bind(this);
/** @borrows deleteAllPages as this.deleteAllPages */
deleteAllPages = pages_1.deleteAllPages.bind(this);
/** @borrows createPage as this.createPage */
createPage = pages_1.createPage.bind(this);
/** @borrows getCurrentThemeGlobalStylesPostId as this.getCurrentThemeGlobalStylesPostId */
getCurrentThemeGlobalStylesPostId = themes_1.getCurrentThemeGlobalStylesPostId.bind(this);
/** @borrows getThemeGlobalStylesRevisions as this.getThemeGlobalStylesRevisions */
getThemeGlobalStylesRevisions = themes_1.getThemeGlobalStylesRevisions.bind(this);
/** @borrows deleteAllPatternCategories as this.deleteAllPatternCategories */
deleteAllPatternCategories = patterns_1.deleteAllPatternCategories.bind(this);
/** @borrows setGutenbergExperiments as this.setGutenbergExperiments */
setGutenbergExperiments = gutenberg_experiments_1.setGutenbergExperiments.bind(this);
}
exports.RequestUtils = RequestUtils;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request-utils/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.login = void 0;
async function login(user = this.user) {
// Login to admin using request context.
let response = await this.request.post('wp-login.php', {
failOnStatusCode: true,
form: {
log: user.username,
pwd: user.password,
},
});
await response.dispose();
// Get the nonce.
response = await this.request.get('wp-admin/admin-ajax.php?action=rest-nonce', {
failOnStatusCode: true,
});
const nonce = await response.text();
return nonce;
}
exports.login = login;
//# sourceMappingURL=login.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/request-utils/login.ts"],"names":[],"mappings":";;;AAUA,KAAK,UAAU,KAAK,CAAsB,OAAa,IAAI,CAAC,IAAI;IAC/D,wCAAwC;IACxC,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,cAAc,EAAE;QACvD,gBAAgB,EAAE,IAAI;QACtB,IAAI,EAAE;YACL,GAAG,EAAE,IAAI,CAAC,QAAQ;YAClB,GAAG,EAAE,IAAI,CAAC,QAAQ;SAClB;KACD,CAAE,CAAC;IACJ,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAEzB,iBAAiB;IACjB,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAChC,2CAA2C,EAC3C;QACC,gBAAgB,EAAE,IAAI;KACtB,CACD,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEpC,OAAO,KAAK,CAAC;AACd,CAAC;AAEQ,sBAAK"}

View File

@@ -0,0 +1,74 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteAllMedia = exports.deleteMedia = exports.uploadMedia = exports.listMedia = void 0;
/**
* External dependencies
*/
const fs = require("fs");
/**
* List all media files.
*
* @see https://developer.wordpress.org/rest-api/reference/media/#list-media
* @param this
*/
async function listMedia() {
const response = await this.rest({
method: 'GET',
path: '/wp/v2/media',
params: {
per_page: 100,
},
});
return response;
}
exports.listMedia = listMedia;
/**
* Upload a media file.
*
* @see https://developer.wordpress.org/rest-api/reference/media/#create-a-media-item
* @param this
* @param filePathOrData The path or data of the file being uploaded.
*/
async function uploadMedia(filePathOrData) {
const file = typeof filePathOrData === 'string'
? fs.createReadStream(filePathOrData)
: filePathOrData;
const response = await this.rest({
method: 'POST',
path: '/wp/v2/media',
multipart: {
file,
},
});
return response;
}
exports.uploadMedia = uploadMedia;
/**
* delete a media file.
*
* @see https://developer.wordpress.org/rest-api/reference/media/#delete-a-media-item
* @param this
* @param mediaId The ID of the media file.
*/
async function deleteMedia(mediaId) {
const response = await this.rest({
method: 'DELETE',
path: `/wp/v2/media/${mediaId}`,
params: { force: true },
});
return response;
}
exports.deleteMedia = deleteMedia;
/**
* delete all media files.
*
* @param this
*/
async function deleteAllMedia() {
const files = await this.listMedia();
// The media endpoint doesn't support batch request yet.
const responses = await Promise.all(files.map((media) => this.deleteMedia(media.id)));
return responses;
}
exports.deleteAllMedia = deleteAllMedia;
//# sourceMappingURL=media.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/request-utils/media.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,yBAAyB;AAoBzB;;;;;GAKG;AACH,KAAK,UAAU,SAAS;IACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAa;QAC5C,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;SACb;KACD,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AA8DQ,8BAAS;AA5DlB;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CAEzB,cAAsC;IAEtC,MAAM,IAAI,GACT,OAAO,cAAc,KAAK,QAAQ;QACjC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAE,cAAc,CAAE;QACvC,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAW;QAC1C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE;YACV,IAAI;SACJ;KACD,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAmCmB,kCAAW;AAjC/B;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CAAsB,OAAe;IAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,gBAAiB,OAAQ,EAAE;QACjC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;KACvB,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAkBgC,kCAAW;AAhB5C;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IAErC,wDAAwD;IACxD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK,CAAC,GAAG,CAAE,CAAE,KAAK,EAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAE,KAAK,CAAC,EAAE,CAAE,CAAE,CACtD,CAAC;IAEF,OAAO,SAAS,CAAC;AAClB,CAAC;AAE6C,wCAAc"}

View File

@@ -0,0 +1,121 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNavigationMenus = exports.deleteAllMenus = exports.createNavigationMenu = exports.createClassicMenu = void 0;
/**
* Create a classic menu
*
* @param name Menu name.
* @return Menu content.
*/
async function createClassicMenu(name) {
const menuItems = [
{
title: 'Custom link',
url: 'http://localhost:8889/',
type: 'custom',
menu_order: 1,
},
];
const menu = await this.rest({
method: 'POST',
path: `/wp/v2/menus/`,
data: {
name,
},
});
await this.batchRest(menuItems.map((menuItem) => ({
method: 'POST',
path: `/wp/v2/menu-items`,
body: {
menus: menu.id,
object_id: undefined,
...menuItem,
parent: undefined,
},
})));
return menu;
}
exports.createClassicMenu = createClassicMenu;
/**
* Create a navigation menu
*
* @param menuData navigation menu post data.
* @return Menu content.
*/
async function createNavigationMenu(menuData) {
return this.rest({
method: 'POST',
path: `/wp/v2/navigation/`,
data: {
status: 'publish',
...menuData,
},
});
}
exports.createNavigationMenu = createNavigationMenu;
/**
* Delete all navigation and classic menus
*
*/
async function deleteAllMenus() {
const navMenus = await this.rest({
path: `/wp/v2/navigation/`,
data: {
status: [
'publish',
'pending',
'draft',
'auto-draft',
'future',
'private',
'inherit',
'trash',
],
},
});
if (navMenus.length) {
await this.batchRest(navMenus.map((menu) => ({
method: 'DELETE',
path: `/wp/v2/navigation/${menu.id}?force=true`,
})));
}
const classicMenus = await this.rest({
path: `/wp/v2/menus/`,
data: {
status: [
'publish',
'pending',
'draft',
'auto-draft',
'future',
'private',
'inherit',
'trash',
],
},
});
if (classicMenus.length) {
await this.batchRest(classicMenus.map((menu) => ({
method: 'DELETE',
path: `/wp/v2/menus/${menu.id}?force=true`,
})));
}
}
exports.deleteAllMenus = deleteAllMenus;
/**
* Get latest navigation menus
*
* @param args
* @param args.status
* @return {string} Menu content.
*/
async function getNavigationMenus(args) {
const navigationMenus = await this.rest({
method: 'GET',
path: `/wp/v2/navigation/`,
data: args,
});
return navigationMenus;
}
exports.getNavigationMenus = getNavigationMenus;
//# sourceMappingURL=menus.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"menus.js","sourceRoot":"","sources":["../../src/request-utils/menus.ts"],"names":[],"mappings":";;;AAeA;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CAAsB,IAAY;IACxE,MAAM,SAAS,GAAG;QACjB;YACC,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,wBAAwB;YAC7B,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,CAAC;SACb;KACD,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAoB;QAC/C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE;YACL,IAAI;SACJ;KACD,CAAE,CAAC;IAEJ,MAAM,IAAI,CAAC,SAAS,CACnB,SAAS,CAAC,GAAG,CAAE,CAAE,QAAQ,EAAG,EAAE,CAAC,CAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,EAAE;YACd,SAAS,EAAE,SAAS;YACpB,GAAG,QAAQ;YACX,MAAM,EAAE,SAAS;SACjB;KACD,CAAE,CAAE,CACL,CAAC;IAEF,OAAO,IAAI,CAAC;AACb,CAAC;AAhCD,8CAgCC;AAED;;;;;GAKG;AACI,KAAK,UAAU,oBAAoB,CAEzC,QAAkB;IAElB,OAAO,IAAI,CAAC,IAAI,CAAE;QACjB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE;YACL,MAAM,EAAE,SAAS;YACjB,GAAG,QAAQ;SACX;KACD,CAAE,CAAC;AACL,CAAC;AAZD,oDAYC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc;IACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAsB;QACrD,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE;YACL,MAAM,EAAE;gBACP,SAAS;gBACT,SAAS;gBACT,OAAO;gBACP,YAAY;gBACZ,QAAQ;gBACR,SAAS;gBACT,SAAS;gBACT,OAAO;aACP;SACD;KACD,CAAE,CAAC;IAEJ,IAAK,QAAQ,CAAC,MAAM,EAAG,CAAC;QACvB,MAAM,IAAI,CAAC,SAAS,CACnB,QAAQ,CAAC,GAAG,CAAE,CAAE,IAAI,EAAG,EAAE,CAAC,CAAE;YAC3B,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,qBAAsB,IAAI,CAAC,EAAG,aAAa;SACjD,CAAE,CAAE,CACL,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAsB;QACzD,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE;YACL,MAAM,EAAE;gBACP,SAAS;gBACT,SAAS;gBACT,OAAO;gBACP,YAAY;gBACZ,QAAQ;gBACR,SAAS;gBACT,SAAS;gBACT,OAAO;aACP;SACD;KACD,CAAE,CAAC;IAEJ,IAAK,YAAY,CAAC,MAAM,EAAG,CAAC;QAC3B,MAAM,IAAI,CAAC,SAAS,CACnB,YAAY,CAAC,GAAG,CAAE,CAAE,IAAI,EAAG,EAAE,CAAC,CAAE;YAC/B,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,gBAAiB,IAAI,CAAC,EAAG,aAAa;SAC5C,CAAE,CAAE,CACL,CAAC;IACH,CAAC;AACF,CAAC;AAlDD,wCAkDC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CAEvC,IAA2B;IAE3B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,IAAI,CAAsB;QAC5D,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,IAAI;KACV,CAAE,CAAC;IACJ,OAAO,eAAe,CAAC;AACxB,CAAC;AAVD,gDAUC"}

View File

@@ -0,0 +1,59 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPage = exports.deleteAllPages = exports.deletePage = void 0;
const PAGE_STATUS = [
'publish',
'future',
'draft',
'pending',
'private',
'trash',
];
async function deletePage(id) {
// https://developer.wordpress.org/rest-api/reference/pages/#delete-a-page
return await this.rest({
method: 'DELETE',
path: `/wp/v2/pages/${id}`,
params: {
force: true,
},
});
}
exports.deletePage = deletePage;
/**
* Delete all pages using REST API.
*
* @param this
*/
async function deleteAllPages() {
// List all pages.
// https://developer.wordpress.org/rest-api/reference/pages/#list-pages
const pages = await this.rest({
path: '/wp/v2/pages',
params: {
per_page: 100,
status: PAGE_STATUS.join(','),
},
});
// Delete all pages one by one.
// "/wp/v2/pages" not yet supports batch requests.
await Promise.all(pages.map((page) => deletePage.call(this, page.id)));
}
exports.deleteAllPages = deleteAllPages;
/**
* Create a new page.
*
* @param this
* @param payload The page payload.
*/
async function createPage(payload) {
// https://developer.wordpress.org/rest-api/reference/pages/#create-a-page
const page = await this.rest({
method: 'POST',
path: `/wp/v2/pages`,
params: payload,
});
return page;
}
exports.createPage = createPage;
//# sourceMappingURL=pages.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/request-utils/pages.ts"],"names":[],"mappings":";;;AAKA,MAAM,WAAW,GAAG;IACnB,SAAS;IACT,QAAQ;IACR,OAAO;IACP,SAAS;IACT,SAAS;IACT,OAAO;CACE,CAAC;AAeJ,KAAK,UAAU,UAAU,CAAsB,EAAU;IAC/D,0EAA0E;IAC1E,OAAO,MAAM,IAAI,CAAC,IAAI,CAAE;QACvB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,gBAAiB,EAAG,EAAE;QAC5B,MAAM,EAAE;YACP,KAAK,EAAE,IAAI;SACX;KACD,CAAE,CAAC;AACL,CAAC;AATD,gCASC;AAED;;;;GAIG;AACI,KAAK,UAAU,cAAc;IACnC,kBAAkB;IAClB,uEAAuE;IACvE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAY;QACxC,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;YAEb,MAAM,EAAE,WAAW,CAAC,IAAI,CAAE,GAAG,CAAE;SAC/B;KACD,CAAE,CAAC;IAEJ,+BAA+B;IAC/B,kDAAkD;IAClD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAE,CAAE,IAAI,EAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAE,CAAE,CACzD,CAAC;AACH,CAAC;AAjBD,wCAiBC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAE/B,OAA0B;IAE1B,0EAA0E;IAC1E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU;QACrC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,OAAO;KACf,CAAE,CAAC;IAEJ,OAAO,IAAI,CAAC;AACb,CAAC;AAZD,gCAYC"}

View File

@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteAllPatternCategories = void 0;
/**
* Delete all pattern categories using REST API.
*
* @see https://developer.wordpress.org/rest-api/reference/categories/#list-categories
* @param this
*/
async function deleteAllPatternCategories() {
// List all pattern categories.
// https://developer.wordpress.org/rest-api/reference/categories/#list-categories
const categories = await this.rest({
path: '/wp/v2/wp_pattern_category',
params: {
per_page: 100,
},
});
// Delete pattern categories.
// https://developer.wordpress.org/rest-api/reference/categories/#delete-a-category
// "/wp/v2/category" does not yet supports batch requests.
await this.batchRest(categories.map((category) => ({
method: 'DELETE',
path: `/wp/v2/wp_pattern_category/${category.id}?force=true`,
})));
}
exports.deleteAllPatternCategories = deleteAllPatternCategories;
//# sourceMappingURL=patterns.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/request-utils/patterns.ts"],"names":[],"mappings":";;;AAKA;;;;;GAKG;AACI,KAAK,UAAU,0BAA0B;IAC/C,+BAA+B;IAC/B,iFAAiF;IACjF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACnC,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;SACb;KACD,CAAE,CAAC;IAEJ,6BAA6B;IAC7B,mFAAmF;IACnF,0DAA0D;IAC1D,MAAM,IAAI,CAAC,SAAS,CACnB,UAAU,CAAC,GAAG,CAAE,CAAE,QAAwB,EAAG,EAAE,CAAC,CAAE;QACjD,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,8BAA+B,QAAQ,CAAC,EAAG,aAAa;KAC9D,CAAE,CAAE,CACL,CAAC;AACH,CAAC;AAnBD,gEAmBC"}

View File

@@ -0,0 +1,86 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deactivatePlugin = exports.activatePlugin = exports.getPluginsMap = void 0;
/**
* External dependencies
*/
const change_case_1 = require("change-case");
/**
* Fetch the plugins from API and cache them in memory,
* since they are unlikely to change during testing.
*
* @param this
* @param forceRefetch Force refetch the installed plugins to update the cache.
*/
async function getPluginsMap(forceRefetch = false) {
if (!forceRefetch && this.pluginsMap) {
return this.pluginsMap;
}
const plugins = await this.rest({
path: '/wp/v2/plugins',
});
this.pluginsMap = {};
for (const plugin of plugins) {
// Ideally, we should be using sanitize_title() in PHP rather than kebabCase(),
// but we don't have the exact port of it in JS.
// This is a good approximation though.
const slug = (0, change_case_1.paramCase)(plugin.name.toLowerCase());
this.pluginsMap[slug] = plugin.plugin;
}
return this.pluginsMap;
}
exports.getPluginsMap = getPluginsMap;
/**
* Finds a plugin in the plugin map.
*
* Attempts to provide a helpful error message if not found.
*
* @param slug Plugin slug.
* @param pluginsMap Plugins map.
*/
function getPluginFromMap(slug, pluginsMap) {
const plugin = pluginsMap[slug];
if (!plugin) {
for (const key of Object.keys(pluginsMap)) {
if (key.toLowerCase().replace(/-/g, '') ===
slug.toLowerCase().replace(/-/g, '')) {
throw new Error(`The plugin "${slug}" isn't installed. Did you perhaps mean "${key}"?`);
}
}
throw new Error(`The plugin "${slug}" isn't installed`);
}
return plugin;
}
/**
* Activates an installed plugin.
*
* @param this RequestUtils.
* @param slug Plugin slug.
*/
async function activatePlugin(slug) {
const pluginsMap = await this.getPluginsMap();
const plugin = getPluginFromMap(slug, pluginsMap);
await this.rest({
method: 'PUT',
path: `/wp/v2/plugins/${plugin}`,
data: { status: 'active' },
});
}
exports.activatePlugin = activatePlugin;
/**
* Deactivates an active plugin.
*
* @param this RequestUtils.
* @param slug Plugin slug.
*/
async function deactivatePlugin(slug) {
const pluginsMap = await this.getPluginsMap();
const plugin = getPluginFromMap(slug, pluginsMap);
await this.rest({
method: 'PUT',
path: `/wp/v2/plugins/${plugin}`,
data: { status: 'inactive' },
});
}
exports.deactivatePlugin = deactivatePlugin;
//# sourceMappingURL=plugins.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/request-utils/plugins.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,6CAAqD;AAOrD;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAAsB,YAAY,GAAG,KAAK;IACrE,IAAK,CAAE,YAAY,IAAI,IAAI,CAAC,UAAU,EAAG,CAAC;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QAChC,IAAI,EAAE,gBAAgB;KACtB,CAAE,CAAC;IACJ,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACrB,KAAM,MAAM,MAAM,IAAI,OAAO,EAAG,CAAC;QAChC,+EAA+E;QAC/E,gDAAgD;QAChD,uCAAuC;QACvC,MAAM,IAAI,GAAG,IAAA,uBAAS,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAE,CAAC;QACpD,IAAI,CAAC,UAAU,CAAE,IAAI,CAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,CAAC;AACxB,CAAC;AAoEQ,sCAAa;AAlEtB;;;;;;;GAOG;AACH,SAAS,gBAAgB,CACxB,IAAY,EACZ,UAAoC;IAEpC,MAAM,MAAM,GAAG,UAAU,CAAE,IAAI,CAAE,CAAC;IAElC,IAAK,CAAE,MAAM,EAAG,CAAC;QAChB,KAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAE,UAAU,CAAE,EAAG,CAAC;YAC/C,IACC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAE,IAAI,EAAE,EAAE,CAAE;gBACrC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAE,IAAI,EAAE,EAAE,CAAE,EACrC,CAAC;gBACF,MAAM,IAAI,KAAK,CACd,eAAgB,IAAK,4CAA6C,GAAI,IAAI,CAC1E,CAAC;YACH,CAAC;QACF,CAAC;QAED,MAAM,IAAI,KAAK,CAAE,eAAgB,IAAK,mBAAmB,CAAE,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAsB,IAAY;IAC9D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAE,IAAI,EAAE,UAAU,CAAE,CAAC;IAEpD,MAAM,IAAI,CAAC,IAAI,CAAE;QAChB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,kBAAmB,MAAO,EAAE;QAClC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;KAC1B,CAAE,CAAC;AACL,CAAC;AAmBuB,wCAAc;AAjBtC;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAsB,IAAY;IAChE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAE,IAAI,EAAE,UAAU,CAAE,CAAC;IAEpD,MAAM,IAAI,CAAC,IAAI,CAAE;QAChB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,kBAAmB,MAAO,EAAE;QAClC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;KAC5B,CAAE,CAAC;AACL,CAAC;AAEuC,4CAAgB"}

View File

@@ -0,0 +1,47 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPost = exports.deleteAllPosts = void 0;
/**
* Delete all posts using REST API.
*
* @param this
*/
async function deleteAllPosts() {
// List all posts.
// https://developer.wordpress.org/rest-api/reference/posts/#list-posts
const posts = await this.rest({
path: '/wp/v2/posts',
params: {
per_page: 100,
// All possible statuses.
status: 'publish,future,draft,pending,private,trash',
},
});
// Delete all posts one by one.
// https://developer.wordpress.org/rest-api/reference/posts/#delete-a-post
// "/wp/v2/posts" not yet supports batch requests.
await Promise.all(posts.map((post) => this.rest({
method: 'DELETE',
path: `/wp/v2/posts/${post.id}`,
params: {
force: true,
},
})));
}
exports.deleteAllPosts = deleteAllPosts;
/**
* Creates a new post using the REST API.
*
* @param this
* @param payload Post attributes.
*/
async function createPost(payload) {
const post = await this.rest({
method: 'POST',
path: `/wp/v2/posts`,
data: { ...payload },
});
return post;
}
exports.createPost = createPost;
//# sourceMappingURL=posts.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/request-utils/posts.ts"],"names":[],"mappings":";;;AAoBA;;;;GAIG;AACI,KAAK,UAAU,cAAc;IACnC,kBAAkB;IAClB,uEAAuE;IACvE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAY;QACxC,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;YACb,yBAAyB;YACzB,MAAM,EAAE,4CAA4C;SACpD;KACD,CAAE,CAAC;IAEJ,+BAA+B;IAC/B,0EAA0E;IAC1E,kDAAkD;IAClD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAE,CAAE,IAAI,EAAG,EAAE,CACrB,IAAI,CAAC,IAAI,CAAE;QACV,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,gBAAiB,IAAI,CAAC,EAAG,EAAE;QACjC,MAAM,EAAE;YACP,KAAK,EAAE,IAAI;SACX;KACD,CAAE,CACH,CACD,CAAC;AACH,CAAC;AA1BD,wCA0BC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAE/B,OAA0B;IAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU;QACrC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE;KACpB,CAAE,CAAC;IAEJ,OAAO,IAAI,CAAC;AACb,CAAC;AAXD,gCAWC"}

View File

@@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resetPreferences = void 0;
/**
* Reset user preferences
*
* @param this Request utils.
*/
async function resetPreferences() {
await this.rest({
path: '/wp/v2/users/me',
method: 'PUT',
data: {
meta: {
persisted_preferences: {},
},
},
});
}
exports.resetPreferences = resetPreferences;
//# sourceMappingURL=preferences.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/request-utils/preferences.ts"],"names":[],"mappings":";;;AAKA;;;;GAIG;AACI,KAAK,UAAU,gBAAgB;IACrC,MAAM,IAAI,CAAC,IAAI,CAAE;QAChB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE;YACL,IAAI,EAAE;gBACL,qBAAqB,EAAE,EAAE;aACzB;SACD;KACD,CAAE,CAAC;AACL,CAAC;AAVD,4CAUC"}

View File

@@ -0,0 +1,130 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.batchRest = exports.getMaxBatchSize = exports.rest = exports.setupRest = void 0;
/**
* External dependencies
*/
const fs = require("fs/promises");
const path_1 = require("path");
/**
* Internal dependencies
*/
const config_1 = require("../config");
function splitRequestsToChunks(requests, chunkSize) {
const arr = [...requests];
const cache = [];
while (arr.length) {
cache.push(arr.splice(0, chunkSize));
}
return cache;
}
async function getAPIRootURL(request) {
// Discover the API root url using link header.
// See https://developer.wordpress.org/rest-api/using-the-rest-api/discovery/#link-header
const response = await request.head(config_1.WP_BASE_URL);
const links = response.headers().link;
const restLink = links?.match(/<([^>]+)>; rel="https:\/\/api\.w\.org\/"/);
if (!restLink) {
throw new Error(`Failed to discover REST API endpoint.
Link header: ${links}`);
}
const [, rootURL] = restLink;
return rootURL;
}
async function setupRest() {
const [nonce, rootURL] = await Promise.all([
this.login(),
getAPIRootURL(this.request),
]);
const { cookies } = await this.request.storageState();
const storageState = {
cookies,
nonce,
rootURL,
};
if (this.storageStatePath) {
await fs.mkdir((0, path_1.dirname)(this.storageStatePath), { recursive: true });
await fs.writeFile(this.storageStatePath, JSON.stringify(storageState), 'utf-8');
}
this.storageState = storageState;
return storageState;
}
exports.setupRest = setupRest;
async function rest(options) {
const { path, ...fetchOptions } = options;
if (!path) {
throw new Error('"path" is required to make a REST call');
}
if (!this.storageState?.nonce || !this.storageState?.rootURL) {
await this.setupRest();
}
const relativePath = path.startsWith('/') ? path.slice(1) : path;
const url = this.storageState.rootURL + relativePath;
try {
const response = await this.request.fetch(url, {
...fetchOptions,
failOnStatusCode: false,
headers: {
'X-WP-Nonce': this.storageState.nonce,
...(fetchOptions.headers || {}),
},
});
const json = await response.json();
if (!response.ok()) {
throw json;
}
return json;
}
catch (error) {
// Nonce in invalid, retry again with a renewed nonce.
if (typeof error === 'object' &&
error !== null &&
Object.prototype.hasOwnProperty.call(error, 'code') &&
error.code === 'rest_cookie_invalid_nonce') {
await this.setupRest();
return this.rest(options);
}
throw error;
}
}
exports.rest = rest;
/**
* Get the maximum batch size for the REST API.
*
* @param this
* @param forceRefetch Force revalidate the cached max batch size.
*/
async function getMaxBatchSize(forceRefetch = false) {
if (!forceRefetch && this.maxBatchSize) {
return this.maxBatchSize;
}
const response = await this.rest({
method: 'OPTIONS',
path: '/batch/v1',
});
this.maxBatchSize = response.endpoints[0].args.requests.maxItems;
return this.maxBatchSize;
}
exports.getMaxBatchSize = getMaxBatchSize;
async function batchRest(requests) {
const maxBatchSize = await this.getMaxBatchSize();
if (requests.length > maxBatchSize) {
const chunks = splitRequestsToChunks(requests, maxBatchSize);
const chunkResponses = await Promise.all(chunks.map((chunkRequests) => this.batchRest(chunkRequests)));
return chunkResponses.flat();
}
const batchResponses = await this.rest({
method: 'POST',
path: '/batch/v1',
data: {
requests,
validation: 'require-all-validate',
},
});
if (batchResponses.failed) {
throw batchResponses;
}
return batchResponses.responses;
}
exports.batchRest = batchRest;
//# sourceMappingURL=rest.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/request-utils/rest.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateSiteSettings = exports.getSiteSettings = void 0;
/**
* Get the site settings.
*
* @see https://developer.wordpress.org/rest-api/reference/settings/#retrieve-a-site-setting
*
* @param this RequestUtils.
*/
async function getSiteSettings() {
return await this.rest({
path: '/wp/v2/settings',
method: 'GET',
});
}
exports.getSiteSettings = getSiteSettings;
/**
* Update the site settings.
*
* @see https://developer.wordpress.org/rest-api/reference/settings/#update-a-site-setting
*
* @param this RequestUtils.
* @param siteSettings The partial settings payload to update.
*/
async function updateSiteSettings(siteSettings) {
return await this.rest({
path: '/wp/v2/settings',
method: 'POST',
data: siteSettings,
});
}
exports.updateSiteSettings = updateSiteSettings;
//# sourceMappingURL=site-settings.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"site-settings.js","sourceRoot":"","sources":["../../src/request-utils/site-settings.ts"],"names":[],"mappings":";;;AA0BA;;;;;;GAMG;AACI,KAAK,UAAU,eAAe;IACpC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAkB;QACvC,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,KAAK;KACb,CAAE,CAAC;AACL,CAAC;AALD,0CAKC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,kBAAkB,CAEvC,YAAqC;IAErC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAkB;QACvC,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY;KAClB,CAAE,CAAC;AACL,CAAC;AATD,gDASC"}

View File

@@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTemplate = exports.deleteAllTemplates = void 0;
const PATH_MAPPING = {
wp_template: '/wp/v2/templates',
wp_template_part: '/wp/v2/template-parts',
};
/**
* Delete all the templates of given type.
*
* @param this
* @param type - Template type to delete.
*/
async function deleteAllTemplates(type) {
const path = PATH_MAPPING[type];
if (!path) {
throw new Error(`Unsupported template type: ${type}.`);
}
const templates = await this.rest({ path });
for (const template of templates) {
if (!template?.id || !template?.wp_id) {
continue;
}
try {
await this.rest({
method: 'DELETE',
path: `${path}/${template.id}`,
params: { force: true },
});
}
catch (responseError) {
// Disable reason - the error provides valuable feedback about issues with tests.
// eslint-disable-next-line no-console
console.warn(`deleteAllTemplates failed to delete template (id: ${template.wp_id}) with the following error`, responseError);
}
}
}
exports.deleteAllTemplates = deleteAllTemplates;
/**
* Creates a new template using the REST API.
*
* @param this
* @param type Template type to delete.
* @param payload Template attributes.
*/
async function createTemplate(type, payload) {
const template = await this.rest({
method: 'POST',
path: PATH_MAPPING[type],
params: { ...payload, type, status: 'publish', is_wp_suggestion: true },
});
return template;
}
exports.createTemplate = createTemplate;
//# sourceMappingURL=templates.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/request-utils/templates.ts"],"names":[],"mappings":";;;AAmBA,MAAM,YAAY,GAAG;IACpB,WAAW,EAAE,kBAAkB;IAC/B,gBAAgB,EAAE,uBAAuB;CACzC,CAAC;AAEF;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAAsB,IAAkB;IACxE,MAAM,IAAI,GAAG,YAAY,CAAE,IAAI,CAAE,CAAC;IAElC,IAAK,CAAE,IAAI,EAAG,CAAC;QACd,MAAM,IAAI,KAAK,CAAE,8BAA+B,IAAK,GAAG,CAAE,CAAC;IAC5D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAgB,EAAE,IAAI,EAAE,CAAE,CAAC;IAE5D,KAAM,MAAM,QAAQ,IAAI,SAAS,EAAG,CAAC;QACpC,IAAK,CAAE,QAAQ,EAAE,EAAE,IAAI,CAAE,QAAQ,EAAE,KAAK,EAAG,CAAC;YAC3C,SAAS;QACV,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,IAAI,CAAE;gBAChB,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,GAAI,IAAK,IAAK,QAAQ,CAAC,EAAG,EAAE;gBAClC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACvB,CAAE,CAAC;QACL,CAAC;QAAC,OAAQ,aAAa,EAAG,CAAC;YAC1B,iFAAiF;YACjF,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACX,qDAAsD,QAAQ,CAAC,KAAM,4BAA4B,EACjG,aAAa,CACb,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAuBQ,gDAAkB;AArB3B;;;;;;GAMG;AACH,KAAK,UAAU,cAAc,CAE5B,IAAkB,EAClB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAc;QAC7C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,CAAE,IAAI,CAAE;QAC1B,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE;KACvE,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAE4B,wCAAc"}

View File

@@ -0,0 +1,63 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getThemeGlobalStylesRevisions = exports.getCurrentThemeGlobalStylesPostId = exports.activateTheme = void 0;
const config_1 = require("../config");
const THEMES_URL = new URL('wp-admin/themes.php', config_1.WP_BASE_URL).href;
async function activateTheme(themeSlug) {
let response = await this.request.get(THEMES_URL);
const html = await response.text();
const optionalFolder = '([a-z0-9-]+%2F)?';
// The `optionalFolder` regex part matches paths with a folder,
// so it will return the first match, which might contain a folder.
// First try to honor the included theme slug, that is, without a folder.
let matchGroup = html.match(`action=activate&amp;stylesheet=${encodeURIComponent(themeSlug)}&amp;_wpnonce=[a-z0-9]+`);
// If the theme is not found, try to match the theme slug with a folder.
if (!matchGroup) {
matchGroup = html.match(`action=activate&amp;stylesheet=${optionalFolder}${encodeURIComponent(themeSlug)}&amp;_wpnonce=[a-z0-9]+`);
}
if (!matchGroup) {
if (html.includes(`data-slug="${themeSlug}"`)) {
// The theme is already activated.
return;
}
throw new Error(`The theme "${themeSlug}" is not installed`);
}
const [activateQuery] = matchGroup;
const activateLink = THEMES_URL + `?${activateQuery}`.replace(/&amp;/g, '&');
response = await this.request.get(activateLink);
await response.dispose();
}
exports.activateTheme = activateTheme;
// https://developer.wordpress.org/rest-api/reference/themes/#definition
async function getCurrentThemeGlobalStylesPostId() {
const themes = await this.rest({
path: '/wp/v2/themes',
});
let themeGlobalStylesId = '';
if (themes && themes.length) {
const currentTheme = themes.find(({ status }) => status === 'active');
const globalStylesURL = currentTheme?._links?.['wp:user-global-styles']?.[0]?.href;
if (globalStylesURL) {
themeGlobalStylesId = globalStylesURL?.split('rest_route=/wp/v2/global-styles/')[1];
}
}
return themeGlobalStylesId;
}
exports.getCurrentThemeGlobalStylesPostId = getCurrentThemeGlobalStylesPostId;
/**
* Deletes all post revisions using the REST API.
*
* @param {} this RequestUtils.
* @param {string|number} parentId Post attributes.
*/
async function getThemeGlobalStylesRevisions(parentId) {
// Lists all global styles revisions.
return await this.rest({
path: `/wp/v2/global-styles/${parentId}/revisions`,
params: {
per_page: 100,
},
});
}
exports.getThemeGlobalStylesRevisions = getThemeGlobalStylesRevisions;
//# sourceMappingURL=themes.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/request-utils/themes.ts"],"names":[],"mappings":";;;AAIA,sCAAwC;AAExC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAE,qBAAqB,EAAE,oBAAW,CAAE,CAAC,IAAI,CAAC;AAEtE,KAAK,UAAU,aAAa,CAE3B,SAAiB;IAEjB,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,UAAU,CAAE,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,kBAAkB,CAAC;IAE1C,+DAA+D;IAC/D,mEAAmE;IACnE,yEAAyE;IACzE,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAC1B,kCAAmC,kBAAkB,CACpD,SAAS,CACR,yBAAyB,CAC3B,CAAC;IAEF,wEAAwE;IACxE,IAAK,CAAE,UAAU,EAAG,CAAC;QACpB,UAAU,GAAG,IAAI,CAAC,KAAK,CACtB,kCAAmC,cAAe,GAAI,kBAAkB,CACvE,SAAS,CACR,yBAAyB,CAC3B,CAAC;IACH,CAAC;IAED,IAAK,CAAE,UAAU,EAAG,CAAC;QACpB,IAAK,IAAI,CAAC,QAAQ,CAAE,cAAe,SAAU,GAAG,CAAE,EAAG,CAAC;YACrD,kCAAkC;YAClC,OAAO;QACR,CAAC;QAED,MAAM,IAAI,KAAK,CAAE,cAAe,SAAU,oBAAoB,CAAE,CAAC;IAClE,CAAC;IAED,MAAM,CAAE,aAAa,CAAE,GAAG,UAAU,CAAC;IACrC,MAAM,YAAY,GACjB,UAAU,GAAG,IAAK,aAAc,EAAE,CAAC,OAAO,CAAE,QAAQ,EAAE,GAAG,CAAE,CAAC;IAE7D,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,YAAY,CAAE,CAAC;IAElD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAiDA,sCAAa;AA/Cd,wEAAwE;AACxE,KAAK,UAAU,iCAAiC;IAM/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAiB;QAC9C,IAAI,EAAE,eAAe;KACrB,CAAE,CAAC;IACJ,IAAI,mBAAmB,GAAW,EAAE,CAAC;IACrC,IAAK,MAAM,IAAI,MAAM,CAAC,MAAM,EAAG,CAAC;QAC/B,MAAM,YAAY,GAA0B,MAAM,CAAC,IAAI,CACtD,CAAE,EAAE,MAAM,EAAE,EAAG,EAAE,CAAC,MAAM,KAAK,QAAQ,CACrC,CAAC;QAEF,MAAM,eAAe,GACpB,YAAY,EAAE,MAAM,EAAE,CAAE,uBAAuB,CAAE,EAAE,CAAE,CAAC,CAAE,EAAE,IAAI,CAAC;QAChE,IAAK,eAAe,EAAG,CAAC;YACvB,mBAAmB,GAAG,eAAe,EAAE,KAAK,CAC3C,kCAAkC,CAClC,CAAE,CAAC,CAAE,CAAC;QACR,CAAC;IACF,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC5B,CAAC;AAuBA,8EAAiC;AArBlC;;;;;GAKG;AACH,KAAK,UAAU,6BAA6B,CAE3C,QAAyB;IAEzB,qCAAqC;IACrC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAgC;QACrD,IAAI,EAAE,wBAAyB,QAAS,YAAY;QACpD,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;SACb;KACD,CAAE,CAAC;AACL,CAAC;AAKA,sEAA6B"}

View File

@@ -0,0 +1,82 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteAllUsers = exports.createUser = void 0;
/**
* List all users.
*
* @see https://developer.wordpress.org/rest-api/reference/users/#list-users
* @param this
*/
async function listUsers() {
const response = await this.rest({
method: 'GET',
path: '/wp/v2/users',
params: {
per_page: 100,
},
});
return response;
}
/**
* Add a test user.
*
* @see https://developer.wordpress.org/rest-api/reference/users/#create-a-user
* @param this
* @param user User data to create.
*/
async function createUser(user) {
const userData = {
username: user.username,
email: user.email,
};
if (user.firstName) {
userData.first_name = user.firstName;
}
if (user.lastName) {
userData.last_name = user.lastName;
}
if (user.password) {
userData.password = user.password;
}
if (user.roles) {
userData.roles = user.roles;
}
const response = await this.rest({
method: 'POST',
path: '/wp/v2/users',
data: userData,
});
return response;
}
exports.createUser = createUser;
/**
* Delete a user.
*
* @see https://developer.wordpress.org/rest-api/reference/users/#delete-a-user
* @param this
* @param userId The ID of the user.
*/
async function deleteUser(userId) {
const response = await this.rest({
method: 'DELETE',
path: `/wp/v2/users/${userId}`,
params: { force: true, reassign: 1 },
});
return response;
}
/**
* Delete all users except main root user.
*
* @param this
*/
async function deleteAllUsers() {
const users = await listUsers.bind(this)();
// The users endpoint doesn't support batch request yet.
const responses = await Promise.all(users
// Do not delete neither root user nor the current user.
.filter((user) => user.id !== 1 && user.name !== this.user.username)
.map((user) => deleteUser.bind(this)(user.id)));
return responses;
}
exports.deleteAllUsers = deleteAllUsers;
//# sourceMappingURL=users.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/request-utils/users.ts"],"names":[],"mappings":";;;AA6BA;;;;;GAKG;AACH,KAAK,UAAU,SAAS;IACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAY;QAC3C,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE;YACP,QAAQ,EAAE,GAAG;SACb;KACD,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CAAsB,IAAc;IAC5D,MAAM,QAAQ,GAAoB;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC;IAEF,IAAK,IAAI,CAAC,SAAS,EAAG,CAAC;QACtB,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,IAAK,IAAI,CAAC,QAAQ,EAAG,CAAC;QACrB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,IAAK,IAAI,CAAC,QAAQ,EAAG,CAAC;QACrB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,IAAK,IAAI,CAAC,KAAK,EAAG,CAAC;QAClB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU;QACzC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;KACd,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAyCQ,gCAAU;AAvCnB;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CAAsB,MAAc;IAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,gBAAiB,MAAO,EAAE;QAChC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;KACpC,CAAE,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAE,IAAI,CAAE,EAAE,CAAC;IAE7C,wDAAwD;IACxD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK;QACJ,wDAAwD;SACvD,MAAM,CACN,CAAE,IAAU,EAAG,EAAE,CAChB,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAClD;SACA,GAAG,CAAE,CAAE,IAAU,EAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE,IAAI,CAAC,EAAE,CAAE,CAAE,CAC7D,CAAC;IAEF,OAAO,SAAS,CAAC;AAClB,CAAC;AAEoB,wCAAc"}

View File

@@ -0,0 +1,62 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.addWidgetBlock = exports.deleteAllWidgets = void 0;
/**
* Delete all the widgets in the widgets screen.
*
* @this {import('./index').RequestUtils}
*/
async function deleteAllWidgets() {
const [widgets, sidebars] = await Promise.all([
this.rest({ path: '/wp/v2/widgets' }),
this.rest({ path: '/wp/v2/sidebars' }),
]);
await this.batchRest(widgets.map((widget) => ({
method: 'DELETE',
path: `/wp/v2/widgets/${widget.id}?force=true`,
})));
// The endpoint doesn't support batch requests yet.
await Promise.all(sidebars.map((sidebar) => this.rest({
method: 'POST',
path: `/wp/v2/sidebars/${sidebar.id}`,
data: { id: sidebar.id, widgets: [] },
})));
}
exports.deleteAllWidgets = deleteAllWidgets;
/**
* Add a widget block to the widget area.
*
* @this {import('./index').RequestUtils}
* @param {string} serializedBlock The serialized content of the inserted block HTML.
* @param {string} widgetAreaId The ID of the widget area.
*/
async function addWidgetBlock(serializedBlock, widgetAreaId) {
const { id: blockId } = await this.rest({
method: 'POST',
path: '/wp/v2/widgets',
data: {
id_base: 'block',
sidebar: widgetAreaId,
instance: {
raw: { content: serializedBlock },
},
},
});
const { widgets } = await this.rest({
path: `/wp/v2/sidebars/${widgetAreaId}`,
});
const updatedWidgets = new Set(widgets);
// Remove duplicate.
updatedWidgets.delete(blockId);
// Add to last block.
updatedWidgets.add(blockId);
await this.rest({
method: 'PUT',
path: `/wp/v2/sidebars/${widgetAreaId}`,
data: {
widgets: [...updatedWidgets],
},
});
}
exports.addWidgetBlock = addWidgetBlock;
//# sourceMappingURL=widgets.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/request-utils/widgets.js"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACI,KAAK,UAAU,gBAAgB;IACrC,MAAM,CAAE,OAAO,EAAE,QAAQ,CAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAE;QAChD,IAAI,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAE;QACvC,IAAI,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAE;KACxC,CAAE,CAAC;IAEJ,MAAM,IAAI,CAAC,SAAS,CACnB,OAAO,CAAC,GAAG,CAAE,CAAE,MAAM,EAAG,EAAE,CAAC,CAAE;QAC5B,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,kBAAmB,MAAM,CAAC,EAAG,aAAa;KAChD,CAAE,CAAE,CACL,CAAC;IAEF,mDAAmD;IACnD,MAAM,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAE,CAAE,OAAO,EAAG,EAAE,CAC3B,IAAI,CAAC,IAAI,CAAE;QACV,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,mBAAoB,OAAO,CAAC,EAAG,EAAE;QACvC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KACrC,CAAE,CACH,CACD,CAAC;AACH,CAAC;AAvBD,4CAuBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAAE,eAAe,EAAE,YAAY;IAClE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACxC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE;YACL,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE;gBACT,GAAG,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;aACjC;SACD;KACD,CAAE,CAAC;IAEJ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAE;QACpC,IAAI,EAAE,mBAAoB,YAAa,EAAE;KACzC,CAAE,CAAC;IAEJ,MAAM,cAAc,GAAG,IAAI,GAAG,CAAE,OAAO,CAAE,CAAC;IAC1C,oBAAoB;IACpB,cAAc,CAAC,MAAM,CAAE,OAAO,CAAE,CAAC;IACjC,qBAAqB;IACrB,cAAc,CAAC,GAAG,CAAE,OAAO,CAAE,CAAC;IAE9B,MAAM,IAAI,CAAC,IAAI,CAAE;QAChB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,mBAAoB,YAAa,EAAE;QACzC,IAAI,EAAE;YACL,OAAO,EAAE,CAAE,GAAG,cAAc,CAAE;SAC9B;KACD,CAAE,CAAC;AACL,CAAC;AA9BD,wCA8BC"}