PluginProbe
Gutenberg / trunk
Gutenberg vtrunk
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
← All changes | build/scripts/api-fetch/index.js +103 -16 23.2.1 → trunk View file →
@@ -1,4 +1,5 @@
1 +(function() {
1 2 "use strict";
2 3 var wp;
3 4 (wp ||= {}).apiFetch = (() => {
4 5 var __create = Object.create;
@@ -38,8 +39,15 @@
38 39 module.exports = window.wp.i18n;
39 40 }
40 41 });
41 42
43 + // package-external:@wordpress/private-apis
44 + var require_private_apis = __commonJS({
45 + "package-external:@wordpress/private-apis"(exports, module) {
46 + module.exports = window.wp.privateApis;
47 + }
48 + });
49 +
42 50 // package-external:@wordpress/url
43 51 var require_url = __commonJS({
44 52 "package-external:@wordpress/url"(exports, module) {
45 53 module.exports = window.wp.url;
@@ -52,8 +60,15 @@
52 60 default: () => index_default
53 61 });
54 62 var import_i18n3 = __toESM(require_i18n(), 1);
55 63
64 + // packages/api-fetch/build-module/lock-unlock.mjs
65 + var import_private_apis = __toESM(require_private_apis(), 1);
66 + var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
67 + "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
68 + "@wordpress/api-fetch"
69 + );
70 +
56 71 // packages/api-fetch/build-module/middlewares/nonce.mjs
57 72 function createNonceMiddleware(nonce) {
58 73 const middleware = (options, next) => {
59 74 const { headers = {} } = options;
@@ -123,16 +138,21 @@
123 138 var root_url_default = createRootURLMiddleware;
124 139
125 140 // packages/api-fetch/build-module/middlewares/preloading.mjs
126 141 var import_url = __toESM(require_url(), 1);
142 + var ENABLE_MULTI_USE = /* @__PURE__ */ Symbol("preloadingEnableMultiUse");
143 + var CLEAR = /* @__PURE__ */ Symbol("preloadingClear");
127 144 function createPreloadingMiddleware(preloadedData) {
128 - const cache = Object.fromEntries(
145 + const { OPTIONS = {}, ...GET } = Object.fromEntries(
129 146 Object.entries(preloadedData).map(([path, data]) => [
130 147 (0, import_url.normalizePath)(path),
131 148 data
132 149 ])
133 150 );
134 - return (options, next) => {
151 + const unusedGet = new Set(Object.keys(GET));
152 + const unusedOptions = new Set(Object.keys(OPTIONS));
153 + let multiUse = false;
154 + const middleware = (options, next) => {
135 155 const { parse = true } = options;
136 156 let rawPath = options.path;
137 157 if (!rawPath && options.url) {
138 158 const { rest_route: pathFromQuery, ...queryArgs } = (0, import_url.getQueryArgs)(
@@ -146,19 +166,51 @@
146 166 return next(options);
147 167 }
148 168 const method = options.method || "GET";
149 169 const path = (0, import_url.normalizePath)(rawPath);
150 - if ("GET" === method && cache[path]) {
151 - const cacheData = cache[path];
152 - delete cache[path];
153 - return prepareResponse(cacheData, !!parse);
154 - } else if ("OPTIONS" === method && cache[method] && cache[method][path]) {
155 - const cacheData = cache[method][path];
156 - delete cache[method][path];
157 - return prepareResponse(cacheData, !!parse);
170 + if ("GET" === method && GET[path]) {
171 + const data = GET[path];
172 + if (!multiUse) {
173 + delete GET[path];
174 + }
175 + unusedGet.delete(path);
176 + return prepareResponse(data, !!parse);
177 + } else if ("OPTIONS" === method && OPTIONS[path]) {
178 + const data = OPTIONS[path];
179 + if (!multiUse) {
180 + delete OPTIONS[path];
181 + }
182 + unusedOptions.delete(path);
183 + return prepareResponse(data, !!parse);
158 184 }
159 185 return next(options);
160 186 };
187 + middleware[ENABLE_MULTI_USE] = () => {
188 + multiUse = true;
189 + };
190 + middleware[CLEAR] = () => {
191 + const tags = [
192 + ...Array.from(unusedGet, (p) => `GET ${p}`),
193 + ...Array.from(unusedOptions, (p) => `OPTIONS ${p}`)
194 + ];
195 + if (tags.length) {
196 + console.warn(
197 + "[api-fetch][preload] Some preloads were never consumed:",
198 + tags
199 + );
200 + } else {
201 + console.log("[api-fetch][preload] All preloads consumed.");
202 + }
203 + unusedGet.clear();
204 + unusedOptions.clear();
205 + for (const key of Object.keys(GET)) {
206 + delete GET[key];
207 + }
208 + for (const key of Object.keys(OPTIONS)) {
209 + delete OPTIONS[key];
210 + }
211 + };
212 + return middleware;
161 213 }
162 214 function prepareResponse(responseData, parse) {
163 215 if (parse) {
164 216 return Promise.resolve(responseData.body);
@@ -296,11 +348,18 @@
296 348 var import_i18n2 = __toESM(require_i18n(), 1);
297 349
298 350 // packages/api-fetch/build-module/utils/response.mjs
299 351 var import_i18n = __toESM(require_i18n(), 1);
300 - async function parseJsonAndNormalizeError(response) {
352 + async function parseJsonAndNormalizeError(response, allowEmptyBody = false) {
301 353 try {
302 - return await response.json();
354 + if (typeof response.text !== "function") {
355 + return await response.json();
356 + }
357 + const text = await response.text();
358 + if (allowEmptyBody && text === "") {
359 + return null;
360 + }
361 + return JSON.parse(text);
303 362 } catch {
304 363 throw {
305 364 code: "invalid_json",
306 365 message: (0, import_i18n.__)("The response is not a valid JSON response.")
@@ -313,9 +372,9 @@
313 372 }
314 373 if (response.status === 204) {
315 374 return null;
316 375 }
317 - return await parseJsonAndNormalizeError(response);
376 + return await parseJsonAndNormalizeError(response, true);
318 377 }
319 378 async function parseAndThrowError(response, shouldParseResponse = true) {
320 379 if (!shouldParseResponse) {
321 380 throw response;
@@ -438,11 +497,29 @@
438 497 ];
439 498 function registerMiddleware(middleware) {
440 499 middlewares.unshift(middleware);
441 500 }
442 - var defaultFetchHandler = (nextOptions) => {
443 - const { url, path, data, parse = true, ...remainingOptions } = nextOptions;
444 - let { body, headers } = nextOptions;
501 + function unregisterMiddleware(middleware) {
502 + const index = middlewares.indexOf(middleware);
503 + if (index === -1) {
504 + return false;
505 + }
506 + middlewares.splice(index, 1);
507 + return true;
508 + }
509 + function enablePreloadMultiUse() {
510 + for (const middleware of middlewares) {
511 + middleware[ENABLE_MULTI_USE]?.();
512 + }
513 + }
514 + function clearPreloadedData() {
515 + for (const middleware of middlewares) {
516 + middleware[CLEAR]?.();
517 + }
518 + }
519 + var defaultFetchHandler = (options) => {
520 + const { url, path, data, parse = true, ...remainingOptions } = options;
521 + let { body, headers } = options;
445 522 headers = { ...DEFAULT_HEADERS, ...headers };
446 523 if (data) {
447 524 body = JSON.stringify(data);
448 525 headers["Content-Type"] = "application/json";
@@ -511,13 +588,21 @@
511 588 });
512 589 });
513 590 };
514 591 apiFetch.use = registerMiddleware;
592 + apiFetch.unregister = unregisterMiddleware;
515 593 apiFetch.setFetchHandler = setFetchHandler;
594 + apiFetch.defaultFetchHandler = defaultFetchHandler;
595 + apiFetch.privateApis = {};
596 + lock(apiFetch.privateApis, {
597 + enablePreloadMultiUse,
598 + clearPreloadedData
599 + });
516 600 apiFetch.createNonceMiddleware = nonce_default;
517 601 apiFetch.createPreloadingMiddleware = preloading_default;
518 602 apiFetch.createRootURLMiddleware = root_url_default;
519 603 apiFetch.fetchAllMiddleware = fetch_all_middleware_default;
604 + apiFetch.httpV1Middleware = http_v1_default;
520 605 apiFetch.mediaUploadMiddleware = media_upload_default;
521 606 apiFetch.createThemePreviewMiddleware = theme_preview_default;
522 607 var index_default = apiFetch;
523 608 return __toCommonJS(index_exports);
@@ -522,5 +607,7 @@
522 607 var index_default = apiFetch;
523 608 return __toCommonJS(index_exports);
524 609 })();
525 610 if (typeof wp.apiFetch === 'object' && wp.apiFetch.default) { wp.apiFetch = wp.apiFetch.default; }
611 +(window.wp ||= {}).apiFetch = wp.apiFetch;
612 +})();
526 613 //# sourceMappingURL=index.js.map